Go 语言slice 数据类型是引用类型,传函数时,有的时候,能直接修改原来的值,有的时候不能。
请看下面的代码
package main
import "fmt"
func changeSlice(x []int, y []int) {
x[1] = 100
y = append(y, 20)
}
func main() {
var x, y []int
x = []int{2, 3}
y = []int{2, 3, 4}
changeSlice(x, y)
fmt.Println(x, y)
}
/*
运行结果 ,[2 100] [2 3 4]
在函数内部通过索引修改slice 的值,原来的值也被修改了,但通过append 函数修改的值,并没有修改
原来的值
*/通过索引修改值这个好理解,但append函数不能修改原来的值,请看原因。
这个原因是:
如果切片的当前大小不足以附加新值从而更改基础数组,则切片会根据需要动态增长。如果未返回此新切片,则您的追加更改将不可见。
解决方法:
1、可以直接用return 返回值
2、可以传指针,下面是传指针的代码。
package main
import "fmt"
func changeSlice(x []int, y *[]int) {
x[1] = 100
*y = append(*y, 20)
}
func main() {
var x, y []int
x = []int{2, 3}
y = []int{2, 3, 4}
changeSlice(x, &y)
fmt.Println(x, y)
}黄哥Go 语言培训大纲
pythonpeixun/articlegithub.com