上一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.htmlphp
创建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
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函数调用它: