gpt4 book ai didi

go - 为什么结构副本上的更改会反射(reflect) go 中的原始结构?

转载 作者:行者123 更新时间:2023-12-01 22:40:24 25 4
gpt4 key购买 nike

我对 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", &copyOfP, 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 的副本并且不反射(reflect)原始 p怎么回事。

这里发生了什么事?

最佳答案

func main() {

// history.ReadlineTest()

p := point{20, []int{1, 2, 3, 4, 5}}

fmt.Printf("Address: %p, Value: %v\n", &p.list[0], p)
passByValue(p, 1)
fmt.Printf("Address: %p, Value: %v\n", &p.list[0], 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", &copyOfP.list[0], copyOfP)
}
Address: 0xc00001a0c0, Value: {20 [1 2 3 4 5]}
From passByValue Address: 0xc00001a0c0, Value: {20 [1 3 4 5]}
Address: 0xc00001a0c0, Value: {20 [1 3 4 5 5]}

“列表” slice 重用了相同的内存。

关于go - 为什么结构副本上的更改会反射(reflect) go 中的原始结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61100900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com