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.mzph.cn/bicheng/12104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最短木板长度 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教 一、题目描述 小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长…

@PostMapping和@GetMapping的区别

这两个注解用了很久了,一直没有认真的了解过,单纯的就认为, 前端用get请求,我就用getmapping,或者后端对于数据的增加的时候就用postmapping, 上周的时候,修改一个接口,后端是post…

NASA数据即——Aqua AIRS 第 3 级光谱出射长波辐射 (OLR) 月报 (AIRSIL3MSOLR)

Aqua AIRS Level 3 Spectral Outgoing Longwave Radiation (OLR) Monthly (AIRSIL3MSOLR) Aqua AIRS 第 3 级光谱出射长波辐射 (OLR) 月报 (AIRSIL3MSOLR) 简介 这个 L3 光谱出射长波辐射(OLR)是根据密歇根大学黄向磊开发的算法,利用 AIRS…

前端XHR请求数据

axios封装了XHR(XMLHttpRequest) 效果 项目结构 Jakarta EE9&#xff0c;Web项目。 无额外的maven依赖 1、Web页面 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言&#xff0c;包含以下三个组成部分。 ECMAScript&#xff1a;由 ECMA-262 定义并提供核心功能。文档对象模型&#xff08;DOM&#xff09;&#xff1a;提供与网页内容交互的方法和接口。浏览器对象模型&…

鸿蒙内核源码分析 (内存池管理) | 如何高效切割合并内存块

动态分配 系列篇将动态分配分成上下两篇&#xff0c;本篇为下篇&#xff0c;阅读之前建议翻看上篇。 鸿蒙内核源码分析(TLFS算法) 结合图表从理论视角说清楚 TLFS 算法鸿蒙内核源码分析(内存池管理) 结合源码说清楚鸿蒙内核动态内存池实现过程&#xff0c;个人认为这部分代码…

羊大师分析,羊奶助力共筑健康中国新生活

羊大师分析&#xff0c;羊奶助力共筑健康中国新生活 在健康中国行动的大背景下&#xff0c;我们越来越注重生活方式的健康与营养。羊大师发现&#xff0c;羊奶作为一种营养丰富、易于吸收的天然食品&#xff0c;正逐渐成为我们追求健康生活的得力助手。 羊奶富含优质蛋白质、矿…

vue3自定义指令​(通过指令钩子获得dom和钩子参数)

实现文本框自动获得焦点 Index.vue: <script setup> import { ref, onMounted } from vue import ./index.cssconst vFocus {mounted: (el, binding) > {el.focus()console.log(binding)} }onMounted(() > {}) </script><template><div class&qu…

设计说明-行为型-状态模式-State

状态接口 public interface State {//状态接口void insertQuarter();//投币void ejectQuarter();//退币void turnCrank();//按下“出纸巾”按钮void dispense();//出纸巾 } 有纸巾类 public class HasQuarterState implements State {private TissueMachine tissueMachine;O…

Python实战开发及案例分析(21)—— 广度优先

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是图和树结构中的一种基本搜索算法。它从根节点开始逐层遍历&#xff0c;先访问所有邻近节点&#xff0c;然后再遍历这些邻近节点的邻居。BFS通常使用队列来实现这一过程。在Python中&#xff0c;可以使用collec…

前端学习——工具的使用

文章目录 1. 引入一个组件需要什么步骤2. 监听变量的修改3. async与await实现异步调用4. position: relative5. 定时执行方法 1. 引入一个组件需要什么步骤 引入一个组件&#xff0c;一定不要加{} &#xff08;对&#xff09;import editForm from “./component/editForm”; …

Python中tkinter编程入门4

在Python中tkinter编程入门3-CSDN博客中创建了Button控件&#xff0c;点击该控件就会产生一个点击事件&#xff0c;在创建Button控件时指定该点击事件的处理程序后&#xff0c;按键控件就会对用户的点击事件产生响应。 1 定义事件处理器 定义事件处理器就是一个自定义的函数。…

前端连续发送同一个请求时,终止上一次请求

场景&#xff1a;几个tab页之间快速的切换&#xff08;tab页只是参数不同&#xff0c;下边的数据渲染给同一个data&#xff09;就会导致如果我在1,2,3&#xff0c;tab页按照顺序快速点击&#xff0c;发送三个请求&#xff0c;我想要展示的是3但是如果1或者2请求响应的时间比3长…

Python tensor向量维度转换,不同维度的向量转化为相同的维度,经过全连接层MLP的维度转换,代码实战

问题&#xff1a;在机器学习特征工程中&#xff0c;假如每类特征需要转化为相同的维度进行拼接&#xff0c;那该怎么办呢&#xff1f;接一个全连接层MLP就可以了。 例子&#xff1a;将&#xff08;128,64&#xff09; 维度的向量转化为&#xff08;128,32&#xff09;维。 impo…

CountDownLatch的 常用场景及使用示例

CountDownLatch的 常用场景及使用示例 CountDownLatch是Java并发编程中一个非常实用的同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。其核心功能在于控制线程的执行流程&#xff0c;确保某些关键操作或准备工作完全就绪后&#xff0c;再释放等…

Stm32串口搭配DMA实现自定义printf、scanf

前言:本文仅供学习参考使用&#xff0c;主要目的是让大家快速使用串口调试&#xff0c;文章所提及的GCC适用于Clion&#xff0c;Vscode等第三方编辑器的用户。作者有时间会继续更新^_^ 一、GCC环境 1、标准库 (1)、使用方法 在主函数while(1)初始化中&#xff0c;添加Seria…

柯桥法语学习-5大法语听写网站:全力助攻你的dictée!

提到法语dicte&#xff0c;绝对可是法语学生们的老大难&#xff0c;简直就是心痛得不能自已啊&#xff01;所以今天&#xff0c;法语君整理了5个听写网站助攻大家的dicte哦&#xff01; Projet Voltaire 01 一个很容易让你对dicte上瘾的APP 写邮件、实习报告或者动机信时&…

vue + koa2 + crypto-js + md5加密:创建加密账户、登录验证

一、前端页面设置 1、创建账户 import CryptoJS from crypto-js; const loginFun function () {request({url: /user/register,method: post,data: {username: ruleForm.username,password: CryptoJS.MD5(ruleForm.password).toString(),role: ruleForm.role}}).then((res) …

徐翔——投资的心性

徐翔&#xff0c;1976年出生。 1993年&#xff0c;徐翔当时还是个高中生&#xff0c;17岁的他带着父母给的几万元本钱进入股票市"那个时候&#xff0c;宁波老百姓家里几万元很正常,而且家里就我一个小孩。”徐翔说。场。1994年&#xff0c;18岁的徐翔放弃高考&#xff0c…

XML的现状及其发展

XML&#xff08;Extensible Markup Language&#xff09;是一种用于描述结构化数据的标记语言&#xff0c;它具有良好的可读性和可扩展性&#xff0c;并且被广泛应用于数据交换、数据存储和配置文件等领域。 目前&#xff0c;XML仍然是一种非常重要的数据交换格式。它被广泛应…