GO 中的这个结构到底发生了什么?结构会被复制吗?

问题描述 投票:0回答:0

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}}

go pointers memory
© www.soinside.com 2019 - 2024. All rights reserved.