创建然后通过反射修改地图。

huangapple go评论76阅读模式
英文:

Creating then modifying a map by reflection

问题

我有一个派生自map的新类型,如下所示:

type mapp map[string]interface{}

它有一个小函数:

func (c mapp) Set() error {
    // c是nil
    c["a"] = "b"
    return nil
}

还有一个接口:

type Setter interface {
    Set() error
}

在main函数中:

func main() {
    var aa mapp
    out := reflect.ValueOf(&aa)
    s := out.Interface().(Setter)
    s.Set()
}

这段代码在结构体上可以正常工作,为什么在map类型上会失败?

你可以在这里的playground上查看代码:https://play.golang.org/p/Z1LFqb6kF7

非常感谢,

Asaf.

英文:

I have a new type derived from map such:

type mapp map[string]interface{}

with a small function on it

func (c mapp) Set() error {
    // c is nil
    c["a"] = "b"
	return nil
}

type Setter interface {
  Set() error
}

func main() {
    var aa mapp
	out := reflect.ValueOf(&aa)
    s := out.Interface().(Setter)
	s.Set()
}

This code works on a struct, why this code fails when it comes to a type of a map?

Here's a playground: https://play.golang.org/p/Z1LFqb6kF7

Many thanks,

Asaf.

答案1

得分: 3

Go的映射(map)(以及切片)是通过make函数创建的。在reflect包中,相应的函数是reflect.MakeMap

out := reflect.ValueOf(&aa).Elem()
out.Set(reflect.MakeMap(out.Type()))
s := out.Interface().(Setter)
s.Set()
英文:

Go maps (and slices) are created via make. The equivalent function in reflect is reflect.MakeMap

out := reflect.ValueOf(&aa).Elem()
out.Set(reflect.MakeMap(out.Type()))
s := out.Interface().(Setter)
s.Set()

huangapple
  • 本文由 发表于 2017年1月12日 03:01:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/41598695.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定