为了账号安全,请及时绑定邮箱和手机立即绑定

戈朗|将指针分配给无法正常工作的指针接收器

戈朗|将指针分配给无法正常工作的指针接收器

Go
慕沐林林 2022-09-19 10:12:55
我不明白为什么在为另一个对象分配指针时,指针接收器不会更新。下面是一个示例:获取是导出的获取器,获取未导出,我希望 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


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信