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

上一篇文章(大约半年前写的):http://www.javashuo.com/article/p-yssafgti-mk.htmlhtml

创建Go项目

在GOPATH的src下面创建一个文件夹 protobuf-go,而后在里面执行命令
go mod init github.com/solenovex/protobuf-go

这个命令是用来初始化go module的。
命令执行后在该目录生成go.mod文件,其内容以下:
其实直接执行go mod init 也行,默认会取当前文件夹的名字做为项目名。
 
若是你使用的是Goland,那么须要启用Go modules集成:
 
而后咱们须要安装Protocol buffer的 Go 支持库:
go get -u github.com/golang/protobuf/protoc-gen-go

安装好以后:
下面会出现require github.com/…. 后边显示indirect,说明咱们的代码尚未对其进行直接引用

 
创建main.go,代码以下:
 
而后执行命令 go run main.go 若是输出 "hello world!" 就说明一切正常。

 

创建proto

在项目下创建src/first文件夹,在里面创建person.proto文件:
 
下面须要经过这个proto文件,生成go的代码,命令行执行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
 
执行完以后,在src/first文件夹下会生成一个文件person.pb.go:
 
咱们看一下这个文件里的PersonMessage 这个struct:
这里面前4个属性就是proto文件里面定义的那4个属性,每一个属性后边都跟着一个字符串tags,它里面提供了一些反射须要的信息。

例如id属性后边这个:
它表示:
  • 针对protocol buffer转换,它的类型是varint,tag为1,opt应该是proto2里面遗留下来的东西不用去管,名子为id,协议是proto3.
  • 针对json序列化,它的名为id,omitempty大概能够理解为若是值为该类型的默认值,那么id这个key就会被忽略掉。
      
该文件里面的其他内容我就不介绍了,可是注意,这个文件不能够修改!

 

使用proto生成的代码

在main.go里面创建一个新的函数NewPersonMessage,而后main函数调用它:
在NewPersonMessage函数里面,咱们New了一个生成文件里面的PersonMessage这个struct,并把4个属性赋了值,最后把它赋给变量pm。
能够经过pm.xx属性来修改它的值,也能够经过pm.GetXx()来获取其属性的值。
 
执行go run main.go以后结果以下:
 
修改package名
proto生成的go文件的package名并非很符合约定,有一种约定是proto生成的go文件的package名应该以诗上层目录名+pb:
 
因此我能够修改proto文件,添加一个option:
option go_package 的值就是 生成go文件的package名。
 
再次执行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
 
此次生成的go文件的package就是:
 

把数据写入到文件

下面把NewPersonMessage添加一个返回类型:
返回PersonMessage的指针。

 
而后在main函数里经过NewPersonMessage函数获取一个PersonMessage,而后再创建一个writeToFile函数,把数据写入到文件里:
这里面writeToFile函数的第一个参数是文件名,第二个参数是proto.Message类型,它是一个接口,其代码以下:

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

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

而后执行 go run main.go 会生成person.bin文件:
它是个二进制文件,编辑器没法打开查看内容。
 

从文件读取数据

添加一个readFromFile函数,用来从文件读取数据:
 
而后在main函数里面new一个PersonMessage的指针,它的各属性值都没填,把这个指针传入到readFromFile函数里面,在里面使用proto.Unmarshal方法把数据写入到该指针指向的struct里面。
最后在main函数里进行打印,其结果以下:
 

 

原文出处:https://www.cnblogs.com/cgzl/p/12296678.htmlgit

相关文章
相关标签/搜索