【发布时间】:2020-04-08 12:40:23
【问题描述】:
我对 Go 中的按值传递感到困惑。我正在这样做;
package main
import (
"fmt"
)
type point struct {
x int
list []int
}
func main() {
p := point{20, []int{1, 2, 3, 4, 5}}
fmt.Printf("Address: %p, Value: %v\n", &p, p)
passByValue(p, 1)
fmt.Printf("Address: %p, Value: %v\n", &p, p)
}
func passByValue(copyOfP point, i int) {
copyOfP.list = append(copyOfP.list[:i], copyOfP.list[i+1:]...)
fmt.Printf("From passByValue Address: %p, Value: %v\n", ©OfP, copyOfP)
}
输出:
Original p Address: 0xc00000c080, Value: {20 [1 2 3 4 5]}
passByValue copyOfP Address: 0xc00000c0c0, Value: {20 [1 3 4 5]}
Original p Address: 0xc00000c080, Value: {20 [1 3 4 5 5]}
copyOfP 不应该是 p 的副本,也不应该反映原来的 p 什么。
这里发生了什么?
【问题讨论】:
-
copyOfP 是 p 的副本,您的代码或输出中没有任何内容暗示与此事实相矛盾的任何内容。
-
请参加围棋之旅并阅读有关切片的博客文章。
标签: go