Go语言中,数组从声明时就肯定,使用时能够修改数组成员,可是数组大小不可变化数组
var 数组变量名 [元素数量]T // 定义一个长度为3元素类型为int的数组a var a [3]int
数组的长度必须是常量,而且长度是数组类型的一部分。一旦定义,长度不能变。 [3]int
和[5]int
是不一样的类型指针
数组能够经过下标进行访问,下标是从0
开始,最后一个元素下标是:len-1
,访问越界(下标在合法范围以外),则触发访问越界,会panic。code
初始化数组时能够使用初始化列表来设置数组元素的值索引
func main() { var Array1 [3]int var Array2 = [3]int{1, 2} var Array3 = [3]string{"北京", "上海", "广州"} fmt.Println(Array1) fmt.Println(Array2) fmt.Println(Array3) } //[0 0 0] //[1 2 0] //[北京 上海 广州]
按照上面的方法每次都要确保提供的初始值和数组长度一致,通常状况下咱们能够让编译器根据初始值的个数自行推断数组的长度内存
func main() { var Array1 [3]int var Array2 = [...]int{1, 2} var Array3 = [...]string{"北京", "上海", "广州"} fmt.Println(Array1) fmt.Println(Array2) fmt.Printf("type of Array2: %T\n", Array2) fmt.Println(Array3) fmt.Printf("type of Array3: %T\n", Array3) } //[0 0 0] //[1 2] //type of Array2: [2]int //[北京 上海 广州] //type of Array3: [3]string
使用指定索引值的方式来初始化数组编译器
func main() { a := [...]int{1:1, 3:5} fmt.Println(a) fmt.Printf("type of a: %T\n", a) } //[0 1 0 5] //type of a: [4]int
func main() { a := [...]string{"北京", "上海", "广州"} // 方法一:for循环遍历 for i := 0; i < len(a); i++ { fmt.Println(a[i]) } // 方法二:for range遍历 for index, value := range a { fmt.Println(index, value) } } //北京 //上海 //广州 //0 北京 //1 上海 //2 广州
func main() { a := [3][2]string{ {"北京", "上海"}, {"广州", "深圳"}, {"成都", "武汉"}, } for _, value1 := range a { for _, value2 := range value1 { fmt.Printf("%s ", value2) } fmt.Println() } } //北京 上海 //广州 深圳 //成都 武汉
注意: 多维数组只有第一层能够使用...
来让编译器推导数组长度string
//支持的写法 a := [...][2]string{ {"北京", "上海"}, {"广州", "深圳"}, {"成都", "重庆"}, }
数组是值类型,赋值和传参会复制整个数组。所以改变副本的值,不会改变自己的值for循环
func modifyArray(x [3]int) { x[0] = 666 } func modifyArray2(x [3][2]int) { x[2][0] = 777 } func main() { a := [3]int{1, 2, 3} b := [3][2]int{ {1, 1}, {2, 2}, {3, 3}, } modifyArray(a) //在modifyArray中修改的是a的副本x fmt.Println(a) modifyArray2(b) //在modifyArray2中修改的是b的副本x fmt.Println(b) } //[1 2 3] //[[1 1] [2 2] [3 3]]
注意:编译
[n]*T
表示指针数组,*[n]T
表示数组指针//指针数组 数组里面的元素是指针 [5]*int //数组指针 这是一个指针 *[5]int