您可以通过 json 键字段动态迭代 Go 中的结构字段吗?


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

最新更新