陣列
什麼是陣列
- 陣列,即一維陣列
- 陣列是容器型資料結構
- 陣列內的資料。必須是相同資料型別的資料
- 陣列是需要定義大小的
- 陣列的大小不可修改
- 陣列是有序
- 使用any定義陣列。該型別能接收不同型別的陣列。
package main
import "fmt"
func main() {
/*
什麼是陣列?
- 一維陣列
- 陣列是容器型資料結構
- 陣列內的資料。必須是相同資料型別的資料
- 陣列是需要定義大小的
- 陣列的大小不可修改
- 陣列是有序
- 使用any定義陣列。該型別能接收不同型別的陣列。
*/
// 定義陣列。 int型別為0,string型別為空
var arr01 [4]int
var arr02 [4]string
fmt.Println("列印空陣列:", arr01)
fmt.Println("列印空陣列:", arr02)
// 陣列賦值使用下標賦值,預設從0開始
arr01[0] = 1
arr01[1] = 2
arr01[2] = 3
fmt.Println("列印賦值後的陣列:", arr01)
// 陣列按照下標取值
fmt.Println("陣列,下標取值:", arr01[0])
// 陣列的常用方法
// - len() 獲取陣列長度
fmt.Println("陣列長度:", len(arr01))
// - cap() 獲取陣列容量
fmt.Println("陣列容量:", cap(arr01))
// 修改陣列某個下標數值
arr01[0] = 10
fmt.Println("修改後的陣列:", arr01)
// 初始化陣列的幾種方式
// - 1 方式
var arr03 [10]int
fmt.Println("初始化陣列1", arr03)
// - 2 方式
var arr04 = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("初始化陣列2", arr04)
// - 3 方式
arr05 := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("初始化陣列3", arr05)
// - 4 方式 ... 自動推導長度,容量
var arr06 = [...]int{1, 3, 4, 1, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 4}
fmt.Println("初始化陣列4", arr06)
fmt.Println("初始化陣列4,長度", len(arr06))
fmt.Println("初始化陣列4,容量", cap(arr05))
// -5 方式。 給陣列 某幾個index 下標賦值 {下標:數值,下標:數值,下標:數值....}
var arr007 [5]int
arr007 = [5]int{0: 2, 2: 3}
fmt.Println(arr007)
}
陣列遍歷
- for i 下標
- for range 迴圈
- 下標手動遍歷
package main
import "fmt"
func main() {
// 遍歷陣列
// 1. for i 下標
// 2. for range 迴圈
// 3. 下標手動遍歷
var arrErgodic001 = [5]int{1, 2, 3, 4, 5}
fmt.Println("手動下標取值:", arrErgodic001[0])
fmt.Println("手動下標取值:", arrErgodic001[1])
fmt.Println("手動下標取值:", arrErgodic001[2])
fmt.Println("手動下標取值:", arrErgodic001[3])
fmt.Println("手動下標取值:", arrErgodic001[4])
//fmt.Println(arrErgodic001[5]) // 下標溢位。invalid argument: index 5 out of bounds [0:5]
for i := 0; i < len(arrErgodic001); i++ {
fmt.Println("for i 迴圈列印:", arrErgodic001[i])
}
// for range 自動迭代。【一個接收引數預設獲取的是資料的下標】
for index, value := range arrErgodic001 {
// index 表示:資料下標
// value 表示:該下標對應的資料
fmt.Println("for range 列印:", index, value)
}
}
陣列 copy
package main
import "fmt"
func main() {
// 陣列重新賦值,會複製新的記憶體空間
var arrCopy = [10]int{1, 2, 3, 4, 5}
fmt.Println(arrCopy)
// 陣列變數 記憶體地址指向陣列第一個元素的記憶體地址
fmt.Printf("%p\n", &arrCopy) // 0xc0000b8000
fmt.Printf("%p\n", &arrCopy[0]) // 0xc0000b8000
fmt.Printf("%p\n", &arrCopy[1]) // 0xc0000b8008
// 列印陣列型別
fmt.Printf("%T\n", arrCopy) // [10]int
arrCopy1 := arrCopy
fmt.Printf("%p\n", &arrCopy1) // 0xc0000b80f0 新地址
fmt.Printf("%T\n", arrCopy1) // [10]int
// 修改 arrCopy 不影響 arrCopy1
arrCopy[0] = 10000
fmt.Println("【值複製】arrCopy", arrCopy)
fmt.Println("【值複製】arrCopy1", arrCopy1)
}
陣列排序
package main
import "fmt"
func main() {
var arrSort = [10]int{16, 64, 23, 45, 67, 21, 22, 33, 1}
fmt.Printf("%T", arrSort)
fmt.Println("排序陣列 【氣泡排序】:")
// 氣泡排序
// 控制迴圈次數
for i1 := 1; i1 < len(arrSort); i1++ {
// n*n-1,比較前後兩個資料的大小
for j1 := 0; j1 < len(arrSort)-i1; j1++ {
fmt.Printf("外層:%d, 內層:第%d圈:比較:%d 和 %d\n", i1, j1, arrSort[j1], arrSort[j1+1])
if arrSort[j1] > arrSort[j1+1] {
arrSort[j1], arrSort[j1+1] = arrSort[j1+1], arrSort[j1]
}
fmt.Println()
fmt.Printf("【第%d圈】:氣泡排序後的結果:%d\n", i1, arrSort)
fmt.Println()
}
}
fmt.Println("氣泡排序後的結果:", arrSort)
}
多維陣列
package main
import "fmt"
func main() {
/*
多維陣列
*/
// 定義二維陣列
twoDimensionalArr := [3][4]int{
{2, 2, 3, 5},
{1, 2, 3, 4},
{1, 2, 3, 7},
}
fmt.Println("二維陣列:", twoDimensionalArr)
fmt.Println("二維陣列取值:", twoDimensionalArr[0])
fmt.Println("二維陣列取值:", twoDimensionalArr[0][0])
// for i 遍歷二維陣列
for i := 0; i < len(twoDimensionalArr); i++ {
for j := 0; j < len(twoDimensionalArr[i]); j++ {
fmt.Println("for i【二維陣列】:", twoDimensionalArr[i][j])
}
}
// for range 遍歷二維陣列
for index, v2 := range twoDimensionalArr {
fmt.Println("for range【二維陣列】:", index, v2)
}
// 定義三維陣列
threeDimensionalArr := [3][4][2]int{
{{3, 2}, {3, 4}, {5, 6}, {5, 6}},
{{1, 2}, {3, 4}, {5, 6}, {5, 6}},
{{1, 2}, {3, 4}, {5, 6}, {5, 6}},
}
fmt.Println("三維陣列:", threeDimensionalArr)
fmt.Println("三維陣列取值:", threeDimensionalArr[0])
fmt.Println("三維陣列取值:", threeDimensionalArr[0][0])
fmt.Println("三維陣列取值:", threeDimensionalArr[0][0][0])
}