Можете ли вы динамически проходить через структурные поля в Go через поле ключа json? - PullRequest
0 голосов
/ 25 мая 2018
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.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Используйте кодек 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

Пример запуска на игровой площадке Go

Вы можете избежать выделения всего документа 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"])

Пример запуска на игровой площадке Go

0 голосов
/ 25 мая 2018

Перебирайте поля в типе, ища поле с заданным именем тега 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))
    }
}

https://play.golang.org/p/_8sI_oCitml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...