猿问

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

我不明白为什么在为另一个对象分配指针时,指针接收器不会更新。下面是一个示例:

  • 获取是导出的获取器,

  • 获取未导出,

我希望 Get() 返回一个指向对象的指针,该指针包含在由字符串索引的指针映射中。

我不明白为什么get()方法的指针接收器没有更新。

我每次都尝试了不同的策略,结果几乎相同:取消引用,在变量声明中使用&而不是*...

去游乐场在这里: https://play.golang.org/p/zCLLvucbMjy

有什么想法吗?谢谢!

package main


import (

    "fmt"

)


type MyCollection map[string]*MyType

type MyType struct {

    int

}


var collection MyCollection


func 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}"

}


慕沐林林
浏览 81回答 1
1回答

婷婷同学_

您需要取消引用接收方,并从映射中为其分配取消引用值,即 。*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
随时随地看视频慕课网APP

相关分类

Go
我要回答