我有这个代码
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.为什么变异字段仍然使用相同的内存地址。
谢谢!
答案 0 :(得分:4)
方法是打印接收器参数u
的地址,**User
。
打印u
而不是&u
,您会发现地址保持不变。不会在每个突变上创建新的User
值。
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)
}