В выводе требуется массив JSON, содержащий поля Args
и Kwargs
вашего значения структуры message
, так что вы можете получить то, что хотите, маршируя следующее значение среза:
[]interface{}{message.Args, message.Kwargs}
Например:
message := Message{
[]interface{}{1, 2, 3, 4},
map[string]interface{}{"a": 2, "b": 3},
}
err := json.NewEncoder(os.Stdout).
Encode([]interface{}{message.Args, message.Kwargs})
fmt.Println(err)
Вывод вышеизложенного (попробуйте на Go Playground ):
[[1,2,3,4],{"a":2,"b":3}]
<nil>
Это работает для этого конкретного случая. Если вам нужно общее решение, которое собирает поля со структурным значением, например, элементы массива, вы можете создать вспомогательную функцию, которая «упаковывает» поля в срез:
func getFields(i interface{}) (res []interface{}) {
v := reflect.ValueOf(i)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil
}
for i := 0; i < v.NumField(); i++ {
f := v.Field(i)
if f.CanInterface() {
res = append(res, f.Interface())
}
}
return res
}
Выше getFields()
принимает значения структуры и указатели на структуры. Пример использования его:
message := Message{
[]interface{}{1, 2, 3, 4},
map[string]interface{}{"a": 2, "b": 3},
}
err := json.NewEncoder(os.Stdout).Encode(getFields(message))
fmt.Println(err)
err = json.NewEncoder(os.Stdout).Encode(getFields(&message))
fmt.Println(err)
Вывод (попробуйте на Go Playground ):
[[1,2,3,4],{"a":2,"b":3}]
<nil>
[[1,2,3,4],{"a":2,"b":3}]
<nil>