做电影网站用什么虚拟主机,建设网站模块需要哪些内容,秦皇岛做网站优化价格,哈尔滨城乡建设网站说明 因为slice是指针类型#xff0c;所以很多人会误以为其传递的是引用#xff0c;所以在使用的过程中会出现一些非期望的实现。 问题 在使用append函数时#xff0c;比如以下函数#xff1a;
func sliceModify(slice []int) {// slice[0] 88slice append(slice, 6)
}
… 说明 因为slice是指针类型所以很多人会误以为其传递的是引用所以在使用的过程中会出现一些非期望的实现。 问题 在使用append函数时比如以下函数
func sliceModify(slice []int) {// slice[0] 88slice append(slice, 6)
}
func main() {slice : []int{1, 2, 3, 4, 5}sliceModify(slice)fmt.Println(slice)
}
// [1 2 3 4 5]
为什么append的数组在外部没有改变呢因为slice传的是值虽然改变了底层数据但是外部slice的状态并没改变。也许有人质疑值语义但是有以下代码
func modifySlice(data []int) {data nil
}
func main() {a : []int{1,2,3}fmt.Println(a)modifySlice(a)fmt.Println(a)
}
// [1, 2, 3]
// [1, 2, 3]
从上面代码可以看到改变slice本身的值并不会改变外部的值及是值语义。
那么如何解决值传递带来的问题解决方法一就是将slice作为指针传递
func sliceModify(slice *[]int) {*slice append(*slice, 6)
}
func main() {slice : []int{1, 2, 3, 4, 5}sliceModify(slice)fmt.Println(slice)
}
指针会改变原本变量的状态所以外部的slice发生了改变。
另一种解决方法是改变外部变量的状态如下代码
func main() { s1 : make([] int ,3,5) s1[0] 1 s1[1] 2 fmt.Println(s1) s2 :s1[:4]
}
func test( s [] int ) { s append(s,3) fmt.Println(s)
}
//[1 2 0 3]
//[1 2 0]
//[1 2 0 3]
虽然在函数内修改slice但是只是添加到了内存中所以在函数中内printf出来但是外部的len没有改变所以不会显示如果强制改变其状态那么添加的值也就显露出来了。