Go语言开发小技巧易错点100例(八)

往期回顾:

  • Go语言开发小技巧&易错点100例(一)
  • Go语言开发小技巧&易错点100例(二)
  • Go语言开发小技巧&易错点100例(三)
  • Go语言开发小技巧&易错点100例(四)
  • Go语言开发小技巧&易错点100例(五)
  • Go语言开发小技巧&易错点100例(六)
  • Go语言开发小技巧&易错点100例(七)

本期看点(技巧类用【技】表示,易错点用【易】表示)

  • JSON Marshal和Proto Marshal在Protobuf Message结构体上使用的不同【易】
  • channel方式代替time.Sleep()方法【技】

正文开始

JSON Marshal和Proto Marshal在gRPC Message上使用的不同

我们先定义一个Proto Buffer文件,内容为一个Message,有两个属性,其中一个属性为string类型,一个为onef类型:

syntax = "proto3";option go_package = "/test";package cmd;message UserInfo {string name = 1;oneof address {string school_addr = 2;string home_addr = 3;}
}

接下来我们编译成pb.go文件

protoc -I=. --go_out=.. ./hello.proto

具体编译后的结构体:

type UserInfo struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsName string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`// Types that are assignable to Address://	*UserInfo_SchoolAddr//	*UserInfo_HomeAddrAddress isUserInfo_Address `protobuf_oneof:"address"`
}// ...type UserInfo_SchoolAddr struct {SchoolAddr string `protobuf:"bytes,2,opt,name=school_addr,json=schoolAddr,proto3,oneof"`
}// ...type UserInfo_HomeAddr struct {HomeAddr string `protobuf:"bytes,3,opt,name=home_addr,json=homeAddr,proto3,oneof"`
}

然后我们写两个测试方法:

方法一:JSON Marshl的方式序列化结构体

func TestJSONMarshal(t *testing.T) {u := UserInfo{Name:    "zs",Address: &UserInfo_HomeAddr{HomeAddr: "Beijing"},}marshal, _ := json.Marshal(u)fmt.Println(string(marshal))var u2 UserInfo_ = json.Unmarshal(marshal, &u2)fmt.Println(u2)
}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUlVgySx-1690033591008)(Go语言开发小技巧&易错点100例(八).assets/image-20230722211709041.png)]

方法二:Proto Marshal的方式序列化结构体

func TestProtoMarshal(t *testing.T) {u := UserInfo{Name:    "zs",Address: &UserInfo_HomeAddr{HomeAddr: "Beijing"},}marshal, _ := proto.Marshal(u)fmt.Println(string(marshal))var u2 UserInfo_ = proto.Unmarshal(marshal, u2)fmt.Println(u2)
}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5L9h37K-1690033591011)(Go语言开发小技巧&易错点100例(八).assets/image-20230722211642116.png)]

对比上述的结果,我们会发现有些不同

  • 序列化后的内容不同,JSON Marshal序列化后的内容可读性较高但是内容占用空间多
  • 反序列化时Proto Marshal的方式能够自动识别oneof类型的属性

因此我们得出结论,在直接序列化Message时最好使用Proto Marshal的方式进行序列化,防止特殊的属性不能够识别,而且该序列化的方式更加节省空间,缺点则是序列化的结果可读性不高。

channel方式代替time.Sleep()方法

最新发现的新操作,直接上代码:

func TestSleep(t *testing.T) {<-time.After(time.Second) // 相当于time.Sleep(time.Second)}

本期到此结束~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9722.shtml

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

相关文章

100多个常用快捷键

Ctrl A: 全选Ctrl C: 复制Ctrl V: 粘贴Ctrl X: 剪切Ctrl Z: 撤销Ctrl Y: 重做Ctrl S: 保存Ctrl P: 打印Ctrl F: 查找Ctrl H: 替换Ctrl G: 转到Ctrl N: 新建Ctrl O: 打开Ctrl W: 关闭窗口Ctrl Q: 退出程序Ctrl F1: 折叠/展开功能区Ctrl F5: 刷新Ctrl F7: 拼写…

【论文笔记】RCM-Fusion: Radar-Camera Multi-Level Fusion for 3D Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2307.10249 1. 引言 目前的一些雷达-相机融合3D目标检测方法进行实例级的融合&#xff0c;从相机图像生成3D提案&#xff0c;并与雷达点云相关联以修正提案。但这种方法没有在最初阶段使用雷达&#xff0c;依赖于相机3D检测器&…

Spring中如何用注解方式存取JavaBean?有几种注入方式?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 本篇文章将讲解如何在spring中使用注解的方式来存取Bean对象&#xff0c;spring提供了多种注入对象的方式&#xff0c;常见的注入方式包括 构造函数注入&#xff0c;Setter 方法注入和属性…

如何在局域网外SSH远程访问连接到家里的树莓派?

文章目录 如何在局域网外SSH远程访问连接到家里的树莓派&#xff1f;如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpol…

Linux-free

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中&#xff0c;free命令是最经常使用的命令之一。 1&#xff0e;命令格式&#xff1a; free [参数] 2&#xff0e;命令功能&#xff1a; free 命令显示系统使用和…

word图自动编号引用

一.引用&#xff0c;插入题注&#xff0c;新建标签&#xff0c;图1-&#xff0c;这样生成的就是图1-1这种&#xff0c;确定 再添加图片就点击添加题注就行&#xff0c;自动生成图1-2这种 二.图例保存为书签 插入&#xff0c;书签&#xff0c;书签命名&#xff0c;如图1 三…

Tensorflow(二)

一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络&#xff0c;主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理&#xff…

Centos7.9安全部署_防火墙配置_端口配置_协议配置_IP配置_全部亲测---记录022_大数据工作笔记0182

在我们平时搭建大数据平台的时候,由于防火墙的限制,会让搭建集群的时候,报各种错误,但是,有些网络环境要求比较严格的地方,防火墙又要求必须要放开,尤其是.. 有些网络环境会安全组进行定时扫描,说实话,我们用的很多开源软件,一般都是低版本的话都有漏洞,但是升级的话又会很容易…

vue2开发前的准备和注意事项

目录 注意事项 1、创建vue脚手架 2、项目启动 3、安装路由VueRouter 4、安装axios【需要自行安装】 5、安装vuex 6、安装ElementUI【自行安装】 7、打包【提交项目】 注意事项 components文件夹&#xff1a;主要写会重复用到的模块 views&#xff1a;写页面 文件命名格…

微信小程序分享页面代码

在微信小程序中实现分享功能需要以下几个步骤&#xff1a; 1. 在app.json文件中配置分享参数&#xff0c;例如标题、路径等。示例如下&#xff1a; json { "pages": [ "pages/index/index" ], "window": { "navigationBarTit…

sqlite触发器1

SQLite 的触发器&#xff08;Trigger&#xff09;可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发&#xff0c;或在一个或多个指定表的列发生更新时触发。 SQLite 只支持 FOR EACH ROW 触发器&#xff08;Trigger&#xff09;&#xff0c;没有 FOR EACH STATEM…

SpringBoot+Jpa+Thymeleaf实现增删改查

SpringBootJpaThymeleaf实现增删改查 这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。 1、pom依赖 pom 包里面添加Jpa 和 Thymeleaf 的相关包引用 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…

VS构建项目报错信息及解决办法02

报错信息及解决3&#xff1a; 报错信息详情&#xff1a; fatal error C1083: 无法打开包括文件: “dirent.h”: No such file or directory 原因&#xff1a;项目为Linux环境下的&#xff0c;而在windows下VS中的MSVC并没有实现“dirent.h”头文件。 解决办法&#xff1a;自…

Ubuntu 20.04下的录屏与视频剪辑软件

ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 &#xff08;1&#xff09;直接在终端输入以下命…

DAY2,Qt(继续完善登录框,信号与槽的使用 )

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff0c;来回切换页面&#xff1b; ---mychat.h chatroom.h---两个页面头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> /…

P5721 【深基4.例6】数字直角三角形

【深基4.例6】数字直角三角形 题目描述 给出 n n n&#xff0c;请输出一个直角边长度是 n n n 的数字直角三角形。所有数字都是 2 2 2 位组成的&#xff0c;如果没有 2 2 2 位则加上前导 0 0 0。 输入格式 输入一个正整数 n n n。 输出格式 输出如题目要求的数字直…

Linux | cramfs下载、安装

Linux | cramfs下载、安装 1.下载 cramfs-1.1.tar.gz 2.编译、安装 [fly@752fac4b02e9 eeasy]$ tar zxf cramfs-1.1.tar.gz [fly@752fac4b02e9 eeasy]$ cd cramfs-1.1/ [fly@752fac4b02e9 cramfs-1.1]$ ls COPYING cramfsck.c GNUmakefile linux mkcramfs.c NOTES READ…

STC12C5A60S2 单片机串口2的通信功能测试

根据手册说明&#xff0c;STC12C5A60S2 系列单片机可以直接使用 reg51.h 的头文件&#xff0c;只是在用到相应的特殊功能寄存器时&#xff0c;要做相应的定义即可。 笔记来自视频教程链接: https://www.bilibili.com/video/BV1Qq4y1Z7iS/?spm_id_from333.880.my_history.page…

EtherNet/IP转Modbus网关以连接AB PLC

本案例为西门子S7-1200 PLC通过捷米特Modbus转EtherNet/IP网关捷米特JM-EIP-RTU连接AB PLC的配置案例。 网关分别从ETHERNET/IP一侧和MODBUS一侧读写数据&#xff0c;存入各自的缓冲区&#xff0c;网关内部将缓冲区的数据进行交换&#xff0c;从而实现两边数据的传输。 网关做为…

Vlan端口隔离(第二十四课)

一、端口隔离 1、端口隔离技术概述 1)端口隔离技术出现背景:为了实现报文之间的二层隔离,可以将不同的端口加入不同的VLAN,但这样会浪费有限的VLAN ID资源。 2)端口隔离的作用:采用端口隔离功能,可以实现同一VLAN内端口之间的隔离。 3)如何实现端口隔离功能:只需要…