黄哥Go语言文章: 函数传slice 有的时候并不能修改原来的值

99 阅读1分钟
原文链接: zhuanlan.zhihu.com

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图标