我目前正在学习golang,并具有以下代码。
这个想法是让一个对象带有许多指向它的指针,我想使用其中一个指针来修改和删除该对象。
package main
import "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>
更改对象的内部效果符合我的预期(#3)。
但是,当我尝试删除实际对象(#4)时,似乎
nil
只是指针本身,而没有接触实际对象。我想念什么?
最佳答案
Go中的所有分配均按值复制。
m := map[string]*obj{
"foo": o1,
"bar": o2,
}
是一个赋值,因此foo的值是o1的副本。
为了实现您的目标,您需要再一层间接
o1 := &obj{1, "hello"}
o2 := &obj{2, "world"}
m := map[string]**obj{
"foo": &o1,
"bar": &o2,
}
http://play.golang.org/p/XutneOziaM
关于pointers - 执行:通过其指针删除对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36531948/