gRPC in ASP.NET Core 3.x — Protocol Buffer(2)Go语言的例子(下)

第一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html

gRPC in ASP.NET Core 3.x — Protocol Buffer(2)Go语言的例子(上)

接着上一篇文章。

写入到JSON

首先写一个func:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

在这里,使用了jsonpb里面的Marshaler这个struct,这个struct上有一个方法叫做MarshalToString,它可以把proto.Message类型转化为JSON字符串。

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

然后修改main方法,添加两行代码:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

运行 go run main.go:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

下面查看一下jsonpb.Marshaler 的源码:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

可以看到里面有几个属性,它们可以用来配置JSON转化。

我可以设置缩紧为一个tab:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

然后再次执行go程序,结果如下:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

而json里的这些属性名是怎么转化的呢?打开proto生成的go文件:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

可以看到前4个属性的tags除了有protobuf的,后边还有json的,所以生成json的属性名等信息就来自这些tags。

从JSON读取

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

这里就是使用jsonpb.UnmarshalString这个方法,其余的都很简单就不解释了。

运行结果如下:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

枚举的例子

在src下面建立second文件夹,里面建立enum.proto文件,

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

代码如下:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

执行:protoc –proto_path=src/ –go_out=src/ src/second/enum.proto

生成的代码如下:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

go里面没有枚举类型,所以生成的是const常量。

同时还生成了两个map:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

一个是数值作为key,文字作为value,另一个map正好反过来。

再看一下这个消息本身的struct:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

然后建立一个函数,并在main里面调用:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

函数返回的是指针,然后在main函数里使用了Gender_name这个map,通过em.Gender的数值获取到对应到文字并输出。

运行结果如下:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

复杂类型

在src下面建立third文件夹,并建立complex.proto文件:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

可以看到DepartmentMessage里面到employees属性是EmployeeMessage的一个集合。

而且DepartmentMessage有一个parent_department属性,它的类型为本身。

执行:protoc –proto_path=src/ –go_out=src/ src/third/complex.proto

可以看到这生成的文件里面有俩个struct:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

然后建立函数,并在main里面调用:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

注意这里面的指针。

输出结果是:

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

Go的例子就到这了。

Original: https://www.cnblogs.com/yangxu-pro/p/12298524.html
Author: yangxu-pro
Title: gRPC in ASP.NET Core 3.x — Protocol Buffer(2)Go语言的例子(下)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535806/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • muduo源码分析之回调模块

    这次我们主要来说说 muduo库中大量使用的回调机制。 muduo主要使用的是利用 Callback的方式来实现回调,首先我们在自己的 EchoServer构造函数中有这样几行代码…

    Go语言 2023年5月25日
    044
  • golang 标准库template的代码生成

    最近,随着 antd Pro v5 的升级,将项目进行了升级,现在生成的都是 ts 代码。这个项目的自动生成代码都是基于 golang 的标准库 template 的,所以这篇博客…

    Go语言 2023年5月25日
    047
  • Excelize 发布 2.6.1 版本,支持工作簿加密

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Mic…

    Go语言 2023年5月25日
    070
  • go微服务框架Kratos笔记(五)使用nacos作为服务注册和服务发现中心

    引言 上篇介绍了如何使用nacos作为配置管理中心,并使用viper来解析配置官方介绍nacos不仅可以用来做配置中心还支持服务注册、发现以及动态DNS服务功能 nacos的安装 …

    Go语言 2023年5月25日
    055
  • Golang实现set

    Golang语言本身未实现set,但是实现了map golang的map是一种无序的键值对的集合,其中键是唯一的 而set是键的不重复的集合,因此可以用map来实现set 由于ma…

    Go语言 2023年5月25日
    062
  • Go编译过程

    一、 Go编译流程 二、过程说明 词法解析 读取Go源文件,将字符序列转换为符号(token)序列,比如将”:=”转换为_Define 代码中的标识符、关键…

    Go语言 2023年5月25日
    065
  • HTTP 尝试获取 Client IP

    HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是 通过其它唯一标识来挖掘更多潜在价值. 本文主要就一个内容, 如何最大可能尝试…

    Go语言 2023年5月25日
    063
  • Go语言学习笔记1

    1.Go语言环境搭建及基础知识 Go语言官方网站(http://golang.org)代码包文档网站(http://godoc.org)Go语言中文网(http://studygo…

    Go语言 2023年5月29日
    067
  • 从Go编程看IO多路复用Select

    IO多路复用通过某种机制使进程监听某些文件描述符,当文件描述符中有读或写就绪时,进程能够收到系统内核发送的相应通知从而进行相应的IO操作;IO多路复用有:select、poll、e…

    Go语言 2023年5月25日
    059
  • Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

    一. lal 简介 lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器。类似于 nginx-rtmp-module等服务,但支持更多的协议…

    Go语言 2023年5月25日
    067
  • golang多版本管理工具

    前言 以往我安装 go环境都是去网站上下载对应文件,然后本地解压。每次发布新版本都这样做太麻烦了,所以我在寻找多版本管理工具。 [En] It’s too troubl…

    Go语言 2023年5月25日
    067
  • go-containerregistry 实战篇之容器镜像下载

    go-containerregistry 实战篇之容器镜像下载 一、库介绍 go-containerregistry 是 google 公司开源的用于处理容器镜像的golang客户…

    Go语言 2023年5月25日
    073
  • GO语言 文件操作实例

    package main import ( "bufio" "fmt" "io/ioutil" "os&quo…

    Go语言 2023年5月29日
    056
  • Go语言之循环与条件判断

    Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1、基本使用 for i := 0; i < 10;…

    Go语言 2023年5月25日
    062
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    082
  • 使用go语言遇到的一些问题记录

    一、参数校验问题 使用go做web服务时,经常需要对请求参数进行校验,有些必填参数需要校验是否为空。 经常会遇到参数a为int类型,但是其值取值范围为0-xxx。0也是有意义的。 …

    Go语言 2023年5月29日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球