Go的数组使用
约 934 字大约 3 分钟
作者:程序员CKeen
博客:http://ckeen.cn
长期坚持做有价值的事!积累沉淀,持续成长,升维思考!希望把编码作为长期兴趣爱好😄
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
1.数组的几种创建方式
- 使用数组长度和指定数据初始化进行创建
arr1 := [10]int {3,6,9,4,5,3,5,7,8,2}
fmt.Println(arr1)
// [3 6 9 4 5 3 5 7 8 2]
fmt.Println(len(arr1))
// 10
- 根据初始化参数的个数来创建
arr2 := [...]int {3,6,9,4,5,3,5,7,8}
fmt.Println(arr2)
// [3 6 9 4 5 3 5 7 8]
fmt.Println(len(arr2))
// 9
- 按指定长度0值初始化元素创建。第一个数值指定长度0值长度个数
arr3 := [...]int{10:2,-1}
fmt.Println(arr3)
// [0 0 0 0 0 0 0 0 0 0 2 -1]
fmt.Println(len(arr3))
// 12 --> 10个0 + 后续两个数据
2.数组的访问
数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。可以使用go内置函数len()获取数据的长度。
arr4 := [...]int{10: 2,-1}
fmt.Println(arr4[10])
// 2
数组的循环访问
arr5 := [...]int{10: 2,-1}
for _, v := range arr5 {
val := v // 复制
fmt.Printf("%d\n", val)
}
3.官方对数组使用说明
Arrays are values. Assigning one array to another copies all the elements. In particular, if you pass an array to a function, it will receive a copy of the array, not a pointer to it. The size of an array is part of its type. The types [10]int and [20]int are distinct. 数组的大小是其类型的一部分。[10]int类型和[20]int类型是不同的
1.数组是一个值对象,将一个数组赋值给另一个数组将复制所有元素。
arr6 := [...]int{0,0,0}
arr7 := arr6
arr7[2] = 2
fmt.Println(arr6)
fmt.Println(arr7)
// arr6 --> [0 0 0]
// arr7 --> [0 0 2]
- 如果将数组传递给函数,它将接收数组的副本,而不是指向该数组的指针。
arr8 := [2]int{1,2}
fmt.Println(arr8)
swap(arr8)
fmt.Println(arr8)
// [1 2]
// [1 2]
func swap(arr8 [2]int){
temp := arr8[0]
arr8[0] = arr8[1]
arr8[1] = temp
}
如果想通过数组进行引用传递,则需要传数组的指针类型
arr8 := [2]int{1,2}
fmt.Println(arr8)
swap(&arr8)
fmt.Println(arr8)
func swap(arr8 *[2]int){
temp := arr8[0]
arr8[0] = arr8[1]
arr8[1] = temp
}
// [1 2]
// [2 1]
- 数组的大小是其类型的一部分。[10]int类型和[20]int类型是不同的。
arr9 := [...]int{0,0,0}
arr9 = [...]int{0,0,0,0}
// Cannot use '[...]int{0,0,0,0}' (type [4]int) as type [3]int
如果数组的大小(长度)不一致,编译器会直接提示他们type不同。
4.扩展说明
- 数组比较的问题。直接通过==比较运算符来比较两个数组,只有当两个数组的所有元素都是相等的时候数组才是相等的
arr10 := [3]int{1,1,1}
arr11 := [3]int{1,1,1}
fmt.Println(arr10 == arr11)
// true
arr12 := [3]int{1,1,1}
arr13 := [...]int{1,1,2}
fmt.Println(arr12 == arr13)
// false
- 数组和slice的转换
arr14 := [10]int {3,6,9,4,5,3,5,7,8,2}
// fmt.Println(append(arr14,10)) 会报错,Cannot use 'arr14' (type [10]int) as type []Type
arr15 := arr14[:5]
fmt.Println(arr15)
arr16 := append(arr15,10)
fmt.Println(arr16)
// [3 6 9 4 5]
// [3 6 9 4 5 10]
this style isn't idiomatic Go. Use slices instead. 官方说数组这种风格不是惯用的。建议使用切片