數組是固定長度
的特定類型元素組成的序列
。
一個數字由零或多個元素組成。
數組的長度是固定,因此Go更常用Slice(切片,動態增長或收縮序列)。
數組是值類型,用索引
下標訪問每個元素,范圍是0~len(數組)-1
,訪問越界會panic異常
注意:賦值和傳參是復制整個數組而不是指針
//接收數組參數 func test(x [2]int){ fmt.Printf("x: %p,%v\n",&x,x) } //對數組賦值語句 func main(){ a:=[2]int{10,20} var b [2]int//初始化數組b b=a//a的值復制拷貝給b fmt.Printf("a: %p,%v\n",&a,a) fmt.Printf("b: %p,%v\n",&b,b) test(a) }
實例
package main import ( "fmt" ) func main() { /* 定義數組 var 數組名 [數組大小]數據類型 var a1 [5]int 定義數組后,5個元素都有默認值 0 數組賦值方式 a[0]=1 a[1]=2 數組的第一個元素的地址,就是數組的首地址 數組各個元素地址間隔根據數組的數據類型決定,int64 8字節 int32 4字節 */ var intArr [5]int fmt.Println("intArr默認值是:", intArr) intArr[0] = 1 intArr[1] = 2 intArr[2] = 3 fmt.Println("intArr賦值后的值是:", intArr) fmt.Printf("intArr數組地址是=%p\n", &intArr) fmt.Printf("intArr數組第一個元素地址是=%p\n", &intArr[0]) fmt.Printf("intArr數組第二個元素地址是=%p\n", &intArr[1]) fmt.Printf("intArr數組第三個元素地址是=%p\n", &intArr[2]) //(全局聲明) //聲明賦值方式 var a1 [5]string = [5]string{"大貓", "二狗"} //自動類型推導,未賦值的有默認值 var a2 = [5]int{1, 2, 3} //自動判斷數組長度 var a3 = [...]int{1, 2, 3, 4, 5} //指定索引賦值元素 var a4 = [...]string{3: "狗蛋", 6: "貓屎"} //結構體類型數組 var a5 = [...]struct { name string age int }{ {"王麻子", 10}, {"呂秀才", 29}, } fmt.Println(a1) fmt.Println(a2) fmt.Println(a3) fmt.Println(a4) fmt.Println(a5) }
運行結果
GOROOT=/usr/local/go #gosetup GOPATH=/Users/yuchao/go #gosetup /usr/local/go/bin/go build -o /private/var/folders/dd/1j1pbw895772hqp2d2gfg00c0000gn/T/___go_build_main_go /Users/yuchao/go/src/gostudy/gobook/main.go #gosetup /private/var/folders/dd/1j1pbw895772hqp2d2gfg00c0000gn/T/___go_build_main_go #gosetup intArr默認值是: [0 0 0 0 0] intArr賦值后的值是: [1 2 3 0 0] intArr數組地址是=0xc42001c090 intArr數組第一個元素地址是=0xc42001c090 intArr數組第二個元素地址是=0xc42001c098 intArr數組第三個元素地址是=0xc42001c0a0 [大貓 二狗 ] [1 2 3 0 0] [1 2 3 4 5] [ 狗蛋 貓屎] [{王麻子 10} {呂秀才 29}] Process finished with exit code 0
遍歷數組
package main import "fmt" func main() { var a1 = [...]int{1, 2, 3, 4, 5, 6} //通過索引取值 for i := 0; i < len(a1); i++ { fmt.Println(a1[i]) } //for循環遍歷數組,索引和值,index可以省略用占位符_ for index, value := range a1 { fmt.Println(index, value) } }
數組使用細節
package main import "fmt" func main() { //數組是多個相同類型數據的組合,且長度固定,無法擴容 var a1 [3]int a1[0] = 1 a1[1] = 11 //必須賦值int類型數據,否則報錯 //a1[2] = 111.1 //不得超出索引 //a1[3]=111 fmt.Println(a1)//有默認值[1 11 0] }
數組使用步驟:
- 聲明數組
- 給數組元素賦值
- 使用數組
- 數組索引從0開始,且不得越界否則panic
- Go數組是值類型,變量傳遞默認是值傳遞,因此會進行值拷貝
- 修改原本的數組,可以使用引用傳遞(指針),避免數據復制
package main import ( "fmt" ) //函數接收值類型,默認有值拷貝 func test(arr [3]int) { arr[0] = 66 } //函數修改原本數組,需要使用引用傳遞 func test2(arr *[3]int) { (*arr)[0] = 66 //可以縮寫arr[0]=66 編譯器自動識別,arr是指針類型 } func main() { //聲明arr數組,需要考慮傳遞函數參數時,數組的長度一致性 arr := [3]int{11, 22, 33} //test函數不會修改數組 test(arr) fmt.Println(arr) //test2修改了數組 test2(&arr) fmt.Println(arr) }
指針概念
指針數組: 元素為指針類型的數組
數組指針: 獲取變量數組變量的地址