我不明白为什么在为另一个对象分配指针时,指针接收器不会更新。下面是一个示例:获取是导出的获取器,获取未导出,我希望 Get() 返回一个指向对象的指针,该指针包含在由字符串索引的指针映射中。我不明白为什么get()方法的指针接收器没有更新。我每次都尝试了不同的策略,结果几乎相同:取消引用,在变量声明中使用&而不是*...去游乐场在这里: https://play.golang.org/p/zCLLvucbMjy有什么想法吗?谢谢!package mainimport ( "fmt")type MyCollection map[string]*MyTypetype MyType struct { int}var collection MyCollectionfunc Get(key string) *MyType { var rslt *MyType // rslt := &MyType{}: gives almost the same result rslt.get(key) fmt.Println("rslt:", rslt) // Should print "rslt: &{2}" return rslt}func (m *MyType) get(key string) { m = collection[key] // *m = collection[key] : cannot use collection[key] (type *MyType) as type MyType in assignment fmt.Println("get m:", m) // Should print "get m: &{2}"}func main() { collection = make(map[string]*MyType) collection["1"] = &MyType{1} collection["2"] = &MyType{2} m := &MyType{1} m = Get("2") fmt.Println("final m", m) // Should print "final m: &{2}"}
1 回答
婷婷同学_
TA贡献1844条经验 获得超8个赞
您需要取消引用接收方,并从映射中为其分配取消引用值,即 。*m = *collection[key]
确保在调用变量之前已初始化,而不是 ,例如 。rslt.getrsltnilrslt := &MyType{}
func Get(key string) *MyType {
rslt := &MyType{}
rslt.get(key)
fmt.Println("rslt:", rslt) // Should print "rslt: &{2}"
return rslt
}
func (m *MyType) get(key string) {
*m = *collection[key]
fmt.Println("get m:", m) // Should print "get m: &{2}"
}
https://play.golang.org/p/zhsC9PR3kwc
请注意,原因还不够,因为接收方始终是调用方变量的副本。直接分配给接收方只会更新该副本,而不会更改调用方的变量。若要更新接收方和调用方的变量都指向的数据,必须取消引用变量。请注意,每个调用都有自己的副本。m = collection[key]
https://play.golang.org/p/um3JLjzSPrD
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消