Currentrly 我正在学习 GO,无法理解在这种和平代码中到底发生了什么。
receiver func 在原始结构 User 上工作(因为指针),所以在 func 内部我们改变了原始 obj。但是 struct Address 是否也将是原始的,或者它将是原始 'a' 的副本?
func main() {
a := Address{"Freedom", "Kyiv"}
u := User{"Valeriy", "Zalyzhnyi", a}
fmt.Println(a)
fmt.Println(u)
u.updateStreet("Peremohy")
fmt.Println(a)
fmt.Println(u)
}
func (u *User) updateStreet(street string) {
u.address.street = street
}
type User struct {
firstName string
lastName string
address Address
}
type Address struct {
street string
city string
}
这是我的输出
{Freedom Kyiv}
{Valeriy Zalyzhnyi {Freedom Kyiv}}
{Freedom Kyiv}
{Valeriy Zalyzhnyi {Peremohy Kyiv}}
由此我了解到 u.address 已更改,我还看到 'u' 内部的这个 'a' 与原始对象不同。 那么在引擎盖下和内存中到底发生了什么? 根据输出,这种行为对我来说是完全出乎意料的。 我期待的是,由于指针,我们在两种情况下('a' 和 'u')都使用原始对象。第二次(在 func 'update..' 之后)打印 fmt.Println(a) 会给我们 {Peremohy Kyiv} 因为第二个 fmt.Println(u) 给了我们 {Valeriy Zalyzhnyi {Peremohy Kyiv}}