每次go中发生突变时都会出现新对象?

每次go中发生突变时都会出现新对象?,go,Go,我有这个密码 package main import ( "fmt" ) type User struct { Name string Sex string } func main() { u := &User{Name: "Leto", Sex: "Male"} fmt.Printf("main() address: %p %p\n", &u, &u.Name) Modify(u) Modify(u)

我有这个密码

package main

import (
    "fmt"
)

type User struct {
    Name string
    Sex string
}

func main() {
    u := &User{Name: "Leto", Sex: "Male"}
    fmt.Printf("main() address: %p %p\n", &u, &u.Name)
    Modify(u)
    Modify(u)
    Modify2(u)
    Modify2(u)
}

func Modify(u *User) {
    u.Name = "Paul11"
    fmt.Printf("Modify() address: %p %p\n", &u, &u.Name)
}

func Modify2(u *User) {
    u.Name = "Leto"
    fmt.Printf("Modify() address: %p %p\n", &u, &u.Name)
}
输出是

main() address: 0x1040a120 0x10434120
Modify() address: 0x1040a130 0x10434120
Modify() address: 0x1040a138 0x10434120
Modify() address: 0x1040a140 0x10434120
Modify() address: 0x1040a148 0x10434120
我想知道 1.为什么变异后的对象地址不同。 2.为什么第一个需要16个字节,之后只有8个字节。 3.为什么变异字段仍然使用相同的内存地址


谢谢

这些方法是打印接收方参数
u
、一个
**用户的地址

打印
u
而不是
&u
,您会发现地址保持不变。并非每次变异都会创建一个新的
用户

func Modify(u *User) {
  u.Name = "Paul11"
  fmt.Printf("Modify() address: %p %p\n", u, &u.Name)
}

func Modify2(u *User) {
   u.Name = "Leto"
   fmt.Printf("Modify() address: %p %p\n", u, &u.Name)
}