Open
Description
问题描述
请在此描述你的问题,提问前请参考提问的智慧
原文是这么说的:
myAppend 函数里,虽然改变了 s,但它只是一个值传递,并不会影响外层的 s,因此第一行打印出来的结果仍然是 [1 1 1]。
这个地方我在第一次看到的时候有点歧义,虽说slice是一个值传递,但是slice中是包含是指向数组的指针的。按理说,值传递的也是数组的指针。
经过验证,不影响的准确原因应该是append触发了slice的扩容,扩容会导致copy,也就是说slice结构体中指向数组的指针发生了变化。因此外层的s不会发生变化。
如果是直接修改slice元素,内外层都会改变
func myAppend(s []int) []int {
//s = append(s, 100)
s[0] = 100
fmt.Printf("s point out func: %p, %p\n", s, &s)
return s
}
我个人的理解,如有不对,欢迎讨论~
Metadata
Metadata
Assignees
Labels
No labels