我在一個模塊中有以下結構:type Event struct { Name string `json:"name"` Version string `json:"version"` Payload interface{} `json:"payload"`}目標是,我可以接受任意結構,并使用一些消息傳遞服務將類型的最終結構作為json序列化字符串發送。PayloadEventjson.Marshal但是,當我嘗試在另一個項目中時,我無法訪問 中的字段,因為 Go 顯然不知道其最終類型。json.UnmarshalEvent.Payload我試圖使用這樣的東西:type EventPayload struct{ Name string `json:"name"`}// ...event := &events.Event{}event.Payload = &EventPayload{}if err := json.Unmarshal(msg.Data, event); err != nil { return err}event.Payload.Name // Won't work: "type interface{} has no field or method Status"然而,Go仍然認為,那是一個.event.Payloadinterface{}在這種情況下,我如何判斷Go正確的結構類型?
2 回答

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
您可以完全按照您描述的方式執行操作,只需使用類型斷言來恢復基礎類型即可。,前提是字段預填充了具體類型,則將使用該具體類型。json.Unmarshalinterface{}
event := &Event{}
event.Payload = &EventPayload{}
msg := []byte(`{"Name": "foo", "Version": "1", "Payload": {"Name": "bar"}}`)
if err := json.Unmarshal(msg, event); err != nil {
panic(err)
}
pl := event.Payload.(*EventPayload)
fmt.Println(pl.Name)
工作示例(稍作修改,可在操場上運行):https://play.golang.org/p/IDXLKeMGw8_1

FFIVE
TA貢獻1797條經驗 獲得超6個贊
在這種情況下,我如何判斷Go正確的結構類型?
你不能。這不是編碼/json的方式。Unmarshal作品。您要么必須將marshal取消到適當的類型或其他類型中,要么使用json。原始消息并做第二次取消marshaling或其他什么,但他們的方式你接近它根本不起作用。
- 2 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消