panic: runtime error: index out of range [2] with length 2
goroutine 1 [running]:
...
复制代码
在作为参数传递数组类型的变量时,都属于值传递,我们在使用数组类型的参数时,要特别注意。
示例代码:
func main() {
var arr2 = [2]int{1, 2}
Get(arr2)
fmt.Printf("arr2=%p\n%d\n", &arr2, arr2)
}
func Get(arr [2]int) {
fmt.Printf("Get()=%p\n%d\n", &arr, arr)
}
复制代码
输出结果:
Get()=0xc0000120f0
[1 2]
arr2=0xc0000120b0
[1 2]
复制代码
阅读上面这段代码,我们可以发现数组在作为参数传递时,地址发生变化,可以证明其属于值传递,即分配一块新内存,将数组的值拷贝到新内存。
03 总结
本文我们通过介绍 Go 语言中数组的一些特性,佐证数组在 Go 项目开发中很少使用的原因。
主要原因有两点,一是数组不可以扩容;二是值传递,大数组要特别小心,如果无法避免使用大数组,可以使用数组指针。