亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Cast interface{} to struct

Cast interface{} to struct

Go
精慕HU 2022-08-30 21:41:18
我在一個模塊中有以下結構: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


查看完整回答
反對 回復 2022-08-30
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

在這種情況下,我如何判斷Go正確的結構類型?

你不能。這不是編碼/json的方式。Unmarshal作品。您要么必須將marshal取消到適當的類型或其他類型中,要么使用json。原始消息并做第二次取消marshaling或其他什么,但他們的方式你接近它根本不起作用。


查看完整回答
反對 回復 2022-08-30
  • 2 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號