2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
您在輸出中想要的是一個(gè) JSON 數(shù)組,其中包含您的結(jié)構(gòu)值的Args和字段,因此您可以通過編組以下切片值來獲得您想要的內(nèi)容:Kwargsmessage
[]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>
這適用于這種特定情況。如果你想要一個(gè)像數(shù)組元素一樣編組結(jié)構(gòu)值字段的通用解決方案,你可以創(chuàng)建一個(gè)輔助函數(shù),將字段“打包”到一個(gè)切片中:
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()接受結(jié)構(gòu)值和指向結(jié)構(gòu)的指針。使用它的例子:
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>
- 2 回答
- 0 關(guān)注
- 211 瀏覽
添加回答
舉報(bào)