2016-08-05 40 views
-1

我有這樣的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) 
    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.爲什麼變異字段仍然使用相同的內存地址。

謝謝!

回答

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

相關問題