当前位置: 首页 > news >正文

Go解析的数据类型可能含有不同数据结构的处理方式

最近做一个需求,各种业务消息都会往我的消息队列中写各种类型的数据,服务端需要接受各种不同的参数然后转换为本地数据结构,Go语言不确定上游传过来的数值是什么类型,然后又下面四种解决方案。

1. 类型断言和类型切换

func (MissionEventHandler) Handle(ctx context.Context, message *kafka.Message) error {var raw map[string]interface{}err := json.Unmarshal(message.Value, &raw)if err != nil {// Handle errorreturn err}switch raw["event"] {case mission.MISSION_EVENT_PAY_SUCCESS:uid, ok1 := raw["uid"].(string)time, ok2 := raw["time"].(string)num, ok3 := raw["num"].(float64) // JSON numbers are float64 by defaultif !ok1 || !ok2 || !ok3 {// Handle type assertion errorreturn errors.New("type assertion failed")}// Handle the event// ...// Add cases for other event typesdefault:// Handle unknown event}return nil
}

2. 结构体组合

type Event struct {Event string `json:"event"`
}type PaySuccessEvent struct {EventUID  string `json:"uid"`Time string `json:"time"`Num  int    `json:"num"`
}// ... Define other specific event structsfunc (MissionEventHandler) Handle(ctx context.Context, message *kafka.Message) error {var baseEvent Eventerr := json.Unmarshal(message.Value, &baseEvent)if err != nil {// Handle errorreturn err}switch baseEvent.Event {case mission.MISSION_EVENT_PAY_SUCCESS:var paySuccessEvent PaySuccessEventerr := json.Unmarshal(message.Value, &paySuccessEvent)if err != nil {// Handle errorreturn err}// Handle the event// ...// Add cases for other event typesdefault:// Handle unknown event}return nil
}

3. 使用 json.RawMessage

type GenericEvent struct {Event string          `json:"event"`Data  json.RawMessage `json:"data"`
}func (MissionEventHandler) Handle(ctx context.Context, message *kafka.Message) error {var genericEvent GenericEventerr := json.Unmarshal(message.Value, &genericEvent)if err != nil {// Handle errorreturn err}switch genericEvent.Event {case mission.MISSION_EVENT_PAY_SUCCESS:var paySuccessEvent PaySuccessEventerr := json.Unmarshal(genericEvent.Data, &paySuccessEvent)if err != nil {// Handle errorreturn err}// Handle the event// ...// Add cases for other event typesdefault:// Handle unknown event}return nil
}

4. 使用 map[string]interface{} 和反射

import ("reflect""encoding/json"
)func (MissionEventHandler) Handle(ctx context.Context, message *kafka.Message) error {var raw map[string]interface{}err := json.Unmarshal(message.Value, &raw)if err != nil {// Handle errorreturn err}switch raw["event"] {case mission.MISSION_EVENT_PAY_SUCCESS:paySuccessEvent := reflect.New(reflect.TypeOf(PaySuccessEvent{})).Interface()err := mapstructure.Decode(raw, &paySuccessEvent)if err != nil {// Handle errorreturn err}// Handle the event// ...// Add cases for other event typesdefault:// Handle unknown event}return nil
}

在第四种方法中,使用了mapstructure库,可以将通用的map值解码到相应的结构体中。

http://www.lryc.cn/news/348837.html

相关文章:

  • Java网络编程基础
  • 鸿蒙DevEco Studio 4.1 Release-模拟器启动方式错误
  • Linux与windows网络管理
  • 一站式、低成本 | 等保一体机安全解决方案
  • Grafana(CVE-2021-43798)、Apache Druid 代码执行漏洞
  • AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级
  • Cocos Creator 3.x 实现触摸拖动物体(record)
  • 漏桶算法:稳定处理大量突发流量的秘密武器!
  • 淘宝数据分析——Python爬虫模式♥
  • 5G消息和5G阅信的释义与区别 | 赛邮科普
  • 数据结构第一次实验
  • .NET WebService \ WCF \ WebAPI 部署总结 以及 window 服务 调试,webservice 的安全验证
  • 自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】
  • java static 关键字
  • CentOS 磁盘扩容与创建分区
  • Java面试八股之什么是Java反射
  • Netty-面试题(上)(四十九)
  • 【热门话题】Vue.js:现代前端开发的轻量级框架之旅
  • 【LAMMPS学习】八、基础知识(6.5)PyLammps 教程
  • GPT-4o正式发布;零一万物发布千亿参数模型;英国推出AI评估平台
  • 多模态大语言模型的演化:综述
  • Qt---绘图和绘图设备
  • 【2024】前端,该卷什么呢?
  • C++干货--引用
  • 部署 Sentinel 控制台:实现流量管理和监控
  • 10、Go Gin 连接Redis以及CookieSession
  • Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误
  • 国外新闻媒体推广:多元化媒体分发投放-大舍传媒
  • 【Windows】回忆Win98
  • 探索QChart:Qt中的数据可视化艺术