数组是由相同类型的元素组成的集合,在内存中分配了一片连续的区域,初始化时需要指定长度。
数组类型
Go 语言数组在初始化之后大小就无法改变,存储元素类型相同、但是大小不同的数组类型是完全不同的,只有两个条件都相同才是同一类型。通过下面的例子验证一下:
func main() {
a1 := [3]int{1, 2, 3}
a2 := [...]int{1, 2, 3}
a3 := [...]int{1, 2, 3, 4}
fmt.Println("数组a1的类型是: ", reflect.TypeOf(a1))
fmt.Println("数组a2的类型是: ", reflect.TypeOf(a2))
fmt.Println("数组a3的类型是: ", reflect.TypeOf(a3))
}
输出结果:
从例子中我们可以看出,数组a1,a2,a3都是int型数组,但是长度不一样,所以他们是不同的类型。
数组值复制
Go语言中的数组在赋值、函数传参及函数返回值时都是值复制,我们通过例子来验证:
func chArray(a [5]int) [5]int {
a[0] = 6
fmt.Printf("参数数组 a 的地址: %p\n", &a)
return a
}
func main() {
array1 := [...]int{1, 2, 3, 4, 5}
array2 := array1
fmt.Printf("数组array1的地址: %p\n", &array1)
fmt.Printf("数组array2的地址: %p\n", &array2)
array3 := chArray(array2)
fmt.Printf("返回值数组array3的地址: %p\n", &array3)
fmt.Printf("数组array1的值: %v\n", array1)
fmt.Printf("数组array2的值: %v\n", array2)
fmt.Printf("数组array3的值: %v\n", array3)
}
输出结果:
在例子中,数组array1复制给了array2,两个数组的地址值不同,是完全不同的两个数组。将array2做为参数传递给函数chArray,形参a的地址值、函数的返回值数组的地址值都不一样。
总结
数组的长度也是数组类型的一部分。数组在赋值、函数传参及函数返回值时都是值复制。
更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号