更改结构内部结构的引用

我一直在尝试更新结构中的地图变量,但没有成功。


我预计 Golang 中的地图是通过引用传递的,因此将一个引用分配给另一个引用应该可行,但事实并非如此。


我可能在这里遗漏了一些明显的东西,如果是这样的话,我们深表歉意!


package main


import (

        "fmt"

)


type Foo struct {

        t map[string]interface{}

}


func (F Foo) Set(ta map[string]interface{}) {

        F.t = ta

}

func (F Foo) Get() map[string]interface{} {

        return F.t

}


func main() {

        t := make(map[string]interface{})

        t["t"] = "sf"

        t["array"] = []int{1, 2, 3}


        fmt.Println(t) // prints map[t:sf array:[1 2 3]]

        var f Foo


        f.Set(t)

        // why the following?

        fmt.Println(f.t) //prints map[]


        f.t = t

        fmt.Println(f.t) //prints map[t:sf array:[1 2 3]]

}

游乐场:https://play.golang.org/p/i1ESV1BdjGQ


眼眸繁星
浏览 85回答 1
1回答

牧羊人nacy

基本上,您的Set方法需要一个指针接收器才能更改结构的状态。具有指针接收器的方法可以修改接收器指向的值。由于方法通常需要修改其接收者,因此指针接收者比值接收者更常见。Get还应该有一个指针接收器以保持一致性:接下来是一致性。如果该类型的一些方法必须有指针接收者,其余的也应该有,所以无论该类型如何使用,方法集都是一致的。这是您的代码的修复:package mainimport (    "fmt")type Foo struct {    t map[string]interface{}}func (F *Foo) Set(ta map[string]interface{}) {    F.t = ta}func (F *Foo) Get() map[string]interface{} {    return F.t}func main() {    t := make(map[string]interface{})    t["t"] = "sf"    t["array"] = []int{1, 2, 3}    fmt.Println(t)    var f Foo    f.Set(t)    fmt.Println(f.Get()) //prints map[t:sf array:[1 2 3]]    f.t = t    fmt.Println(f.Get()) //prints map[t:sf array:[1 2 3]]}产出map[t:sf array:[1 2 3]]map[t:sf array:[1 2 3]]map[t:sf array:[1 2 3]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go