go - 如何使用反射初始化结构的映射字段

标签 go

如何使用反射初始化结构的映射字段?

panic 的示例代码,我想让它工作(Playground):

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Names map[string]string
}

func main() {
    var u interface{} = User{}
    names := make(map[string]string)
    names["test"] = "test"

    v := reflect.ValueOf(u)
    n := reflect.ValueOf(names)

    field := v.FieldByName("Names")
    field.Set(n)

    fmt.Println(v.Interface())
    fmt.Println(u)
}
panic: reflect: reflect.flag.mustBeAssignable using unaddressable value

goroutine 1 [running]:
reflect.flag.mustBeAssignableSlow(0x15, 0x0)
    /usr/local/go/src/reflect/value.go:247 +0x180
reflect.flag.mustBeAssignable(...)
    /usr/local/go/src/reflect/value.go:234
reflect.Value.Set(0x101ec0, 0x0, 0x15, 0x101ec0, 0x43e280, 0x15)
    /usr/local/go/src/reflect/value.go:1531 +0x40
main.main()
    /tmp/sandbox776916734/prog.go:21 +0x200

最佳答案

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Names map[string]string
}

func main() {
    var u interface{} = &User{} // the key is here
    names := make(map[string]string)
    names["test"] = "test"

    v := reflect.ValueOf(u)
    n := reflect.ValueOf(names)

    field := v.Elem().FieldByName("Names")
    field.Set(n)

    fmt.Println(v.Interface())
    fmt.Println(u)
}

关于go - 如何使用反射初始化结构的映射字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60203038/

相关文章:

go - 如何在字符串前面加上err?

go - 后台打印程序概念/API 和 channel : issue passing jobs to a queue from serveHTTP

go - 如何获取目录总大小?

variables - 仅当条件为真时,如何在 go 中创建变量?

json - 为什么我从 mongodb 获取我的 json 中某些字段的所有零值?

amazon-web-services - 多年来无法预签名 URL?

go - 索引表达式和指针解引用表达式的优先级

go - 如何使用反射动态构建结构 slice

go - 访问Docker Swarm集群上Couchbase容器的IP地址

xml - 在 Golang 中从 JSON 构造 XML 的最佳方法