type Params struct {
MyNum string `json:"req_num"`
}
因此,我需要将MyNum
的值分配给另一个变量,给定我在beego
框架中编写的某些功能的"req_num
"字符串键。 这在Go
可能吗,如果是,如何?
我看着反射库,找不到方法。
这是我正在尝试做的一个例子。 params 是 Params 类型的变量,MyNum 的值初始化为"123"。f 当前未获得"123"。当我将其记录到控制台时,它说"。
b := "req_num"
r := reflect.ValueOf(params)
f := reflect.Indirect(r).FieldByName(b)
编辑:我将为多个参数执行此操作(上面我将b设置为示例字段值"req_num"(,我想编写它,这样我就不必知道存储在b中的字段的名称。
使用 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
围棋游乐场中的可运行示例
可以通过将编码器管道传输到解码器来避免在内存中分配整个 JSON 文档:
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"])
围棋游乐场中的可运行示例
遍历类型中的字段,查找具有给定 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 %qn", v.Field(i).Interface().(string))
}
}
https://play.golang.org/p/_8sI_oCitml