在Golang语言中,将一个数组名作为参数传给一个函数,背后的操作是产生一个该数组的副本,在函数中对这个数组副本做的操作都不会影响原数组本身。比如下面这个例子
package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr) //1 2 3 4 5 Do(arr) //尝试将arr清零 fmt.Println(arr) //1 2 3 4 5 } func Do(arr [5]int) { for i, _ := range arr { arr[i] = 0 } }
可以看到,在尝试对数组元素进行改变操作之后,原数组的值并没有改变。
要想达到目的,很自然的想到了数组指针,在main函数中,将数组的首地址作为参数传给函数,函数接收一个指针,然后用for循环对数组进行操作,最终,的确是达到了修改数组元素的目的。
package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr) //1 2 3 4 5 Do(&arr) //尝试将arr清零 fmt.Println(arr) //0 0 0 0 0 } func Do(arr *[5]int) { for i, _ := range arr { arr[i] = 0 } }
但是呢,这个代码看着特别别扭,为啥呢,因为函数Do的数组长度是事先指定的(上例中为5),并且想要函数正常运行,实现指定的长度还得与实参的数组长度相同,不然就会出现“类型出错”,这个就很麻烦了,因为这是Go语言中的语法规定,必须要遵守。
自己私下一顿尝试:
1==》在定义函数的时候,将形参的数组长度省略或者使用“...”
2==》在main函数中,定义数组的时候,数组长度省略或使用“...”
3==》两处都进行省略或者使用"..."
无一例外,上面的尝试都失败了,到了这个时候,使用数组指针的方法已经行不通了,但是可以使用slice来实现。