在结构内部更改结构的引用

时间:2018-09-30 02:25:39

标签: go

我一直在尝试更新结构中的map变量,但是没有运气。

我希望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

1 个答案:

答案 0 :(得分:1)

基本上,Set方法上需要一个指针接收器,以便能够更改结构的状态。

  

带有指针接收器的方法可以修改接收器指向的值。由于方法通常需要修改其接收者,因此指针接收者比值接收者更为普遍。

Get还应具有一个指针接收器以保持一致性:

  

接下来是一致性。如果类型的某些方法必须具有指针接收器,则其余的方法也应该具有指针接收器,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参见section on method sets

有关更多示例,请参见a tour of go

以下是您的代码修复程序:

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)
    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]]

亲自尝试here