英文:
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()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论