为什么保持不变? append()是否生成新的片段?
package main import ( "fmt" ) var a = make([]int,7,8) func Test(slice []int) { slice = append(slice,100) fmt.Println(slice) } func main() { for i := 0; i < 7; i++ { a[i] = i } Test(a) fmt.Println(a) }
在你的例子中,Test函数的slice参数在调用者的范围内接收变量a的副本。
由于slice变量保存一个仅引用底层数组的“slice descriptor”,所以在Test函数中,您可以连续修改slice变量中的slice描述符,但这并不影响调用者及其变量。
在Test函数内部,第一个追加将重新分配片段变量下的后备数组,复制其原始内容,并附加100,这就是您正在观察的内容。退出测试后,切片变量超出范围,切片引用的(新)底层数组也将超出范围。
如果要使测试行为像追加一样,您必须从其返回新的切片 – 就像append一样 – 并且要求Test的呼叫者以与使用append相同的方式使用它:
func Test(slice []int) []int { slice = append(slice,100) fmt.Println(slice) return slice } a = Test(a)
请仔细阅读this article,因为它基本上显示了如何在内部执行切片之后手动执行附件。然后阅读this。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。