我一直在尝试更新结构中的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]]
}
答案 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