使用 append 后在函数内切片被修改了 变装家园网

“`go
package mainimport “fmt”

func main() {
arr := make([]int, 3, 4) //创建一个长度为 3 ,容量为 4 的切片
fmt.Println(arr, len(arr), cap(arr)) //[0 0 0] 3 4
// —–
fmt.Printf(“%pn”, arr)
addNum(arr)
// —–
fmt.Println(arr, len(arr), cap(arr)) //[0 0 0] 3 4
fmt.Printf(“%pn”, arr)
}

func addNum(sli []int) {
fmt.Printf(“%pn”, sli)
sli = append(sli, 4)
fmt.Println(sli, len(sli), cap(sli)) //[0 0 0 4] 4 4
fmt.Printf(“%pn”, sli)
}
“`

看到网上的解释是, 在 addNum 里面,sli 的底层数组是的确被修改了,可是切片的 len 由于是值复制,所以切片的 len 没有被修改,导致外层 main 里面的切片没有被显示?

如果是这样,那么应该传参的时候传入的切片地址应该不一样才对,因为是传值,传入的是切片结构体的拷贝值,而不应该是切片的原地址。

type slice struct {
array unsafe.Pointer //存储数组指针
len int
cap int
}
望大神指点。

有个大神的回复:
> 打印的是切片里引用的底层数据的地址,而不是切片本身的地址。实参和形参的切片是不同的切片,只不过它们引用的底层数据是一样的。

那么请问下,addNum(arr) 这个arr是值传递,传的是切片的地址值,还是切片里面的结构体的array地址 ?

本文《使用 append 后在函数内切片被修改了 变装家园网》由网赚联盟( wangzhuan.org.cn )整理或原创,感谢您的阅读。

随机文章

SEO教程
搜素引擎算法
网站内容优化
GEO培训
SEO小小课堂网
SEO教程
站长导航
搜素引擎算法

百度搜索“网赚联盟”即可找到本站,微信搜索“小小课堂网”关注小小课堂网公众号。网赚联盟( wangzhuan.org.cn )欢迎用户投稿,发布者:用户投稿,文章版权归作者所有,投稿文章不代表网赚联盟立场,中二少年发布为网赚联盟原创文章,转载请注明出处:https://wangzhuan.org.cn/133273.html