数组 Array
数组:是同一种数据类型,组成的固定长度的序列。
定义:var a[len] int,比如:var a[5] int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能改变。
长度是数组类型的一部分,因此 var a[5] int 和 var a[6] int 是不同的类型
数组可以通过下标进行访问,从0开始,最后一位下标 len-1
访问越界,如果下标在数组合法范围之外,则触发访问越界,回panic
数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
支持 == 和 != 操作符,因为内存总是被初始化过的
指针数组 [n]*T,数组指针 *[n]T
一维数组
package main import ( "fmt" ) // 全局变量,必须用var声明,局部变量,可以var,可以:= // 全局 var arr0 [5]int = [5]int{1,2,3} // [1 2 3 0 0] var arr1 = [5]int{1,2,3,4,5} // [1 2 3 4 5] var arr2 = [...]int{1,2,3,4,5,6,7,8} // [1 2 3 4 5 6 7 8] var str = [5]string{3:"hello",4:"hi"} // [ hello hi] var arr3 = [...]int{5,1:2,3} // [5 2 3] // 局部 func main() { var a = [3]int{1,2} // [1 2 0] 未初始化的元素值是0 b := [...]int{1,2,3,4,5,6,7} // [1 2 3 4 5 6 7] 通过初始化值确定数组的长度 c := [5]int{2:100,4:200} // [0 0 100 0 200] 按照索引,初始化元素 d := [...]struct{ // [{user1 10} {user2 20}] name string age uint8 }{ {"user1",10}, // 可省略元素类型 {"user2",20}, // 最后一行,也要添加 , } }
多维数组
package main import ( "fmt" ) // 全局变量,必须用var声明,局部变量,可以var,可以:= // 全局 var arr0 [2][3]int // [[0 0 0] [0 0 0]] var arr1 [2][3]int = [...][3]int{{1,1,1},{2,2,2}} // [[1 1 1] [2 2 2]] 第二维度,不能用... // 局部 func main() { var a = [2][3]int{{1,2,3},{4,5,6}} // [[1 2 3] [4 5 6]] b := [...][2]int{{1,1},{2,2},{3,3}} // [[1 1] [2 2] [3 3]] }
内置函数 len和cap,都能返回 数组的长度
package main import "fmt" func main() { var a = [2][3]int{{1,2,3},{4,5,6}} fmt.Println(len(a)) fmt.Println(cap(a)) }
多维数组遍历
package main import "fmt" func main() { var f [2][3]int = [...][3]int{{1,2,3},{7,8,9}} for k1,v1 := range f { for k2,v2 := range v1 { fmt.Printf("(%d,%d)=%d",k1,k2,v2) } fmt.Println() } } // (0,0)=1(0,1)=2(0,2)=3 // (1,0)=7(1,1)=8(1,2)=9
数组拷贝和传参
package main import "fmt" func printArr(arr *[5]int) { arr[0] = 10 for i, v := range arr { fmt.Println(i, v) } } func main() { var arr1 [5]int printArr(&arr1) fmt.Println(arr1) arr2 := [...]int{2, 4, 6, 8, 10} printArr(&arr2) fmt.Println(arr2) } // 0 10 // 1 0 // 2 0 // 3 0 // 4 0 // [10 0 0 0 0] &arr1,指针,arr1被更改 // 0 10 // 1 4 // 2 6 // 3 8 // 4 10 // [10 4 6 8 10]