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

栏目: IT技术 · 发布时间: 4年前

内容简介:前两篇文章半年前写的:

前两篇文章半年前写的:

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(2)

之前把protocol buffer的基础知识讲了一遍,今天使用 Go 语言做一些例子。

最终目的是要做一个ASP.NET Core 和 Go Web之间的gRPC通信实例。

建立Go项目

在GOPATH的src下面建立一个文件夹 protobuf-go,然后在里面执行命令

go mod init github.com/solenovex/protobuf-go

这个命令是用来初始化go module的。

命令执行后在该目录生成go.mod文件,其内容如下:

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

其实直接执行go mod init 也行,默认会取当前文件夹的名字作为项目名。

如果你使用的是Goland,那么需要启用Go modules集成:

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

然后我们需要安装Protocol buffer的 Go 支持库:

go get -u github.com/golang/protobuf/protoc-gen-go

安装好之后:

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

下面会出现require github.com/…. 后边显示indirect,说明我们的代码还没有对其进行直接引用

建立main.go,代码如下:

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

然后执行命令 go run main.go 如果输出 "hello world!" 就说明一切正常。

建立proto

在项目下建立src/first文件夹,在里面建立person.proto文件:

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

下面需要通过这个proto文件,生成go的代码,命令行执行:

protoc --proto_path src/ --go_out=src/ src/first/person.proto

执行完之后,在src/first文件夹下会生成一个文件person.pb.go:

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

我们看一下这个文件里的PersonMessage 这个struct:

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

这里面前4个属性就是proto文件里面定义的那4个属性,每个属性后边都跟着一个字符串tags,它里面提供了一些反射需要的信息。

例如id属性后边这个:

它表示:

  • 针对protocol buffer转换,它的类型是varint,tag为1,opt应该是proto2里面遗留下来的东西不用去管,名子为id,协议是proto3.

  • 针对json序列化,它的名为id,omitempty大概可以理解为如果值为该类型的默认值,那么id这个key就会被忽略掉。

该文件里面的其余内容我就不介绍了,但是注意,这个文件不可以修改!

使用proto生成的代码

在main.go里面建立一个新的函数NewPersonMessage,然后main函数调用它:

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

在NewPersonMessage函数里面,我们New了一个生成文件里面的PersonMessage这个struct,并把4个属性赋了值,最后把它赋给变量pm。

可以通过pm.xx属性来修改它的值,也可以通过pm.GetXx()来获取其属性的值。

执行go run main.go之后结果如下:

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

修改package名

proto生成的go文件的package名并不是很符合约定,有一种约定是proto生成的go文件的package名应该以诗上层目录名+pb:

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

所以我可以修改proto文件,添加一个option:

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

option go_package 的值就是 生成go文件的package名。

再次执行:

protoc --proto_path src/ --go_out=src/ src/first/person.proto

这次生成的go文件的package就是:

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

把数据写入到文件

下面把NewPersonMessage添加一个返回类型:

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

返回PersonMessage的指针。

然后在main函数里通过NewPersonMessage函数获取一个PersonMessage,然后再建立一个writeToFile函数,把数据写入到文件里:

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

这里面writeToFile函数的第一个参数是文件名,第二个参数是proto.Message类型,它是一个接口,其代码如下:

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

而person.proto生成的PersonMessage struct正好拥有这些方法,所以它就是实现了该接口,所以在main在调用writeToFile函数的时候,可以将PersonMessage传递进去。

writeToFile里面的代码很简单,就是把数据写入到制定的文件里,文件权限模式为0644。

然后执行 go run main.go 会生成person.bin文件:

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

它是个二进制文件,编辑器无法打开查看内容。

从文件读取数据

添加一个readFromFile函数,用来从文件读取数据:

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

然后在main函数里面new一个PersonMessage的指针,它的各属性值都没填,把这个指针传入到readFromFile函数里面,在里面使用proto.Unmarshal方法把数据写入到该指针指向的struct里面。

最后在main函数里进行打印,其结果如下:


以上所述就是小编给大家介绍的《gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(上)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Code Complete

Code Complete

Steve McConnell / Microsoft Press / 2004-6-19 / GBP 40.99

在线阅读本书 Widely considered one of the best practical guides to programming, Steve McConnells original CODE COMPLETE has been helping developers write better software for more than a decade. Now......一起来看看 《Code Complete》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试