Cast interface{} to struct

我在一个模块中有以下结构:


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正确的结构类型?


精慕HU
浏览 160回答 2
2回答

一只甜甜圈

您可以完全按照您描述的方式执行操作,只需使用类型断言来恢复基础类型即可。,前提是字段预填充了具体类型,则将使用该具体类型。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

在这种情况下,我如何判断Go正确的结构类型?你不能。这不是编码/json的方式。Unmarshal作品。您要么必须将marshal取消到适当的类型或其他类型中,要么使用json。原始消息并做第二次取消marshaling或其他什么,但他们的方式你接近它根本不起作用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go