为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号