2016-08-05 7 views
-1

私はこの行くコード突然変異が起こるたびに新しいオブジェクト?

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

を持っている出力は、変異後のオブジェクトのアドレスが異なっているなぜ私は 1.だろ

main() address: 0x1040a120 0x10434120 
Modify() address: 0x1040a130 0x10434120 
Modify() address: 0x1040a138 0x10434120 
Modify() address: 0x1040a140 0x10434120 
Modify() address: 0x1040a148 0x10434120 

です。 2.なぜ最初のものが16バイトをとり、それ以降はわずか8バイトです。 3.なぜ突然変異したフィールドが同じメモリアドレスを使用しているのですか?

ありがとうございます!

答えて

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

playground example

関連する問題