我目前正在學(xué)習(xí) golang,并有以下代碼。這個想法是讓一個對象有多個指向它的指針,我想使用其中一個指針修改和刪除該對象。package mainimport "fmt"type obj struct { a int b string}func main() { o1 := &obj{1, "hello"} o2 := &obj{2, "world"} m := map[string]*obj{ "foo": o1, "bar": o2, } fmt.Printf("1: %t %v\n", o1, o1) fmt.Println("2:", m, m["foo"], o1) o1.b = "WWWW" fmt.Println("3:", m, m["foo"], o1) o1 = nil fmt.Println("4:", m, m["foo"], o1)}http://play.golang.org/p/lqQviVuTQN輸出:1: &{%!t(int=1) %!t(string=hello)} &{1 hello}2: map[foo:0x10434120 bar:0x10434130] &{1 hello} &{1 hello}3: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} &{1 WWWW}4: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} <nil>更改對象的內(nèi)部結(jié)構(gòu)按我的預(yù)期工作(#3)。但是,當(dāng)我嘗試刪除實(shí)際對象(#4)時,它似乎只是nil指針本身而不觸及實(shí)際對象。我錯過了什么?
2 回答

GCT1015
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個贊
Go 中的所有賦值都是按值復(fù)制的。
m := map[string]*obj{
"foo": o1,
"bar": o2,
}
是一個賦值,所以 foo 的值是 o1 的一個副本。為了實(shí)現(xiàn)你的目標(biāo),你需要多一層間接
o1 := &obj{1, "hello"}
o2 := &obj{2, "world"}
m := map[string]**obj{
"foo": &o1,
"bar": &o2,
}
http://play.golang.org/p/XutneOziaM

慕桂英3389331
TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個贊
解釋@Uvelichitel 關(guān)于按值復(fù)制的說明,
o1 := <0x10434120>
m := map[string]*obj{
"foo": <0x10434120>,
}
o1.a = "WWW" // <0x10434120>.a = "WWW" changing both places
o1 = nil
m["foo"] // still is <0x10434120>
- 2 回答
- 0 關(guān)注
- 317 瀏覽
添加回答
舉報
0/150
提交
取消