直接贴代码
func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, 6) } func main() { slice := []int{1, 2, 3, 4, 5} sliceModify(slice) fmt.Println(slice) }
返回的没变,坑爹的,这个设计太那啥了,可以正确跑出效果的版本如下:
func sliceModify(slice *[]int) { *slice = append(*slice, 6) } func main() { slice := []int{1, 2, 3, 4, 5} sliceModify(&slice) fmt.Println(slice) }
有疑问加站长微信联系(非本文作者)

第一段代码里面,那是两个不同的slice对象,虽然他们底层数据是同一块,自然就不能将主函数里面的slice修改了 第二段代码里面,那是个指针,你产生了一个新的slice对象,你再把新的slice对象赋给指针,调用函数之前和之后指针指向的地址是不同的。
slice是引用类型,它的底层数据是同一块,使用append会产生一个新的对象,slice类型除了底层数据还有其他的数据,而长度未超过容量时,还是同一块区域。
说错了,第二段代码,指针地址是一样的,但你把原来的slice类型数据用函数里面新的slice都覆盖了