type Params struct {
MyNum string `json:"req_num"`
}
所以我需要将MyNum
的值分配给给定“req_num
”字符串键的另一个变量,以便我在beego
框架中编写一些功能。这可能在Go
中,如果是这样的话?
我看了一下反射库,找不到办法。
这是我想要做的一个例子。 params是Params类型的变量,MyNum的值初始化为“123”让我们说。 f目前没有“123”。当我将其记录到控制台时,它会显示“”。
b := "req_num"
r := reflect.ValueOf(params)
f := reflect.Indirect(r).FieldByName(b)
编辑:我将为多个参数执行此操作(上面我将b设置为示例字段值“req_num”)并且我想编写它以便我不必知道存储在b中的字段的名称。
答案 0 :(得分:1)
遍历类型中的字段,查找具有给定JSON标记名称的字段。该值位于值的相应字段中。
name := "req_num"
v := reflect.ValueOf(Params{MyNum: "Hello"})
t := v.Type()
for i := 0; i < t.NumField(); i++ {
if strings.Split(t.Field(i).Tag.Get("json"), ",")[0] == name {
fmt.Printf("the value is %q\n", v.Field(i).Interface().(string))
}
}
答案 1 :(得分:1)
使用JSON编解码器完成工作:
p, _ := json.Marshal(Params{MyNum: "123"}) // encode to JSON
var m map[string]interface{}
json.Unmarshal(p, &m) // decode to map
fmt.Println(m["req_num"]) // get value from the map
Runnable example in the Go Playground
您可以避免将piping和encoder分配到内存中的整个JSON文档到decoder:
value := Params{MyNum: "123"}
r, w := io.Pipe()
go func() {
json.NewEncoder(w).Encode(value)
w.Close()
}()
var m map[string]interface{}
json.NewDecoder(r).Decode(&m)
fmt.Println(m["req_num"])