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)

大家都在看

  • 【golang】pprof性能调优工具的具体使用(带案例)

    前言 大晚上的,老是刷到有关pprof的文章,忍不住看了几篇文章…写个学习笔记记录下~ 正文: 1.pprof是什么? pprof是go内置的性能调优工具,可以借助一些…

    Go语言 2023年5月25日
    067
  • Golang:手撸一个支持六个级别的日志库

    Golang标准日志库提供的日志输出方法有Print、Fatal、Panic等,没有常见的Debug、Info、Error等日志级别,用起来不太顺手。这篇文章就来手撸一个自己的日志…

    Go语言 2023年5月25日
    063
  • 基于LSM的Key-Value数据库实现初篇

    前篇文章对LSM的基本原理,算法流程做了简单的介绍,这篇文章将实现一个简单的 基于LSM算法的 迷你Key-Value数据库,结合上篇文章的理论与本篇文章的实践使之对LSM算法有更…

    Go语言 2023年5月25日
    065
  • 编译kubeadm使生成证书有效期为100年

    问题 编译 检查结果 问题 当我使用kubeadm部署成功k8s集群时在想默认生成的证书有效期是多久,如下所示 /etc/kubernetes/pki/apiserver.crt …

    Go语言 2023年5月25日
    050
  • go语言并发编程

    引言 说到go语言最厉害的是什么就不得不提到并发,并发是什么?,与并发相关的并行又是什么?并发:同一时间段内执行多个任务并行:同一时刻执行多个任务 进程、线程与协程 进程: 进程是…

    Go语言 2023年5月25日
    060
  • GO语言程序查询数据库字段为空遇到的几个问题总结

    如果字段值可能为空,那么从表里面读取数据的时候程序使用的变量类型应该使用 sql.NullXXX 类型,比如下面的日期类型: 开始的时候,deleteAt 使用的也是 time.T…

    Go语言 2023年5月25日
    068
  • [go-websocket 搭建一对一,一对多的聊天室] 第二篇:websocket间的通信

    源码地址https://gitee.com/bin-0821/chat-room-demo-go-websocket 关于websocket,上一篇文章讲述了如何通过websock…

    Go语言 2023年5月25日
    068
  • Ebiten-纯Golang开发的跨平台游戏引擎

    Go语言不是让你玩的啊喂! 昨天跟好基友聊开发的事,他说他等着闲下来的时候就用 PYGame写个像那个最近挺火的”文X游X”一样的游戏.(没收广告费啊!) …

    Go语言 2023年5月25日
    074
  • sync:一. 原子操作(atomic)

    原子操作是指在程序运行中不能被中断的操作,原子操作是无锁的常常是由CPU指令直接实现,而锁一般由操作系统的调度器实现,所以原子操作的效率一般更高。 golang中原子操作支持的类型…

    Go语言 2023年5月25日
    050
  • 使用Go http重试请求

    原文连接:https://www.zhoubotong.site/post/78.html开发中对于http请求是经常遇到,一般可能网络延迟或接口返回超时,对于发起客户端的请求, …

    Go语言 2023年5月25日
    047
  • Go语言之变量与基础数据类型

    Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1、Go 的特性: 跨平台的编…

    Go语言 2023年5月25日
    049
  • 开始读 Go 源码了

    学完 Go 的基础知识已经有一段时间了,那么接下来应该学什么呢?有几个方向可以考虑,比如说 Web 开发,网络编程等。 在写项目的过程中,发现一个问题。实现功能是没问题的,但不知道…

    Go语言 2023年5月25日
    040
  • muduo源码分析之回调模块

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

    Go语言 2023年5月25日
    035
  • go 连接MSSQLServer数据库【遇到的坑】

    前言:项目测试需要用到mssqlserver数据库连接,遇到坑,自己爬 直接上代码: go;gutter:true; package main</p> <p&gt…

    Go语言 2023年5月25日
    046
  • GO环境配置

    一、环境安装及配置 引用链接:Go语言环境安装及配置 Go版本安装 百度网盘msi地址:版本v1.18.1提取码:m1mc GoLand工具 链接:【版本2020.1】提取码:7x…

    Go语言 2023年5月25日
    068
  • 服务注册与发现的原理和实现

    什么是服务注册发现? 对于搞微服务的同学来说,服务注册、服务发现的概念应该不会太陌生。 简单来说,当服务A需要依赖服务B时,我们就需要告诉服务A,哪里可以调用到服务B,这就是服务注…

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