概述
- 关于 protoBuf 参考:
- 电脑本机安装:https://github.com/protocolbuffers/protobuf
- 选择合适的版本
- 安装后注意检查环境变量
- 安装后,查看版本
- $
protoc --version
- $
- 本机安装 protobuf的件protoc-gen-go插件和protoc-gen-go-grpc插件
- 这个插件把 protobuf 文件转化为 go 文件
- $
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest - $
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
- 目前这个 protoc-gen-go 插件包安装可能会有问题,跟随我的步骤来解决
- 这个包按照上述命令安装后,不在
$GOPATH/bin, 则进行检查 go env 中的GOBIN - 查看 $
go env,看下GOBIN是否为 “”, 如果如此,则进行设置,类似 - $
go env -w GOBIN=/Users/xxx/gopath/bin - 再次执行上述安装
protoc-gen-go的命令 - 再次检查 gopath/bin 目录中,发现出现了这个二进制文件,执行 $
protoc-gen-go正常运行
- 这个包按照上述命令安装后,不在
- 同样,protoc-gen-go-grpc插件亦如此检查
测试运行
-
在上述环境准备好之后,可以进行测试了
-
我们在当前项目中写一个proto文件叫做 test.proto
syntax = "proto3"; option go_package = "./protoService"; message UserInfo { string name = 1; int32 age = 2; repeated string hobby = 3; PhoneType phone = 4; } // enum为关键字,作用为定义一种枚举类型 enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } -
之后执行 $
protoc --go_out=. *.proto -
这时候可以看到在当前目录下生成 proto 目录,进入里面,生成一个
test.pb.go文件 -
类似的,再次创建一个 greeter.proto 文件,用于生成 grpc 文件
syntax = "proto3"; package greeter; option go_package = "./protoService"; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings. message HelloReply { string message = 1; } -
接着执行 $
protoc --go-grpc_out=. *.proto,就会生成 proto/greeter_grpc.pb.go 文件- 注意,这个命令生成的不全,参考下一篇文章有全面的生成命令
-
注意,gRPC 服务需要使用 service 关键字定义,并且至少包含一个 RPC 方法
-
如果 .proto 文件没有定义服务或者定义不正确,protoc 将不会生成 gRPC 代码
序列化和反序列化
-
创建一个项目,比如 demo 目录,执行 $
go mod init demo -
利用上述 test.proto 生成的包来测试,复制 protoService 包进入项目
-
安装项目依赖 $
go get google.golang.org/protobuf/proto -
新建 main.go
package main import ( "fmt" "demo/protoService" "google.golang.org/protobuf/proto" ) func main() { u := &protoService.UserInfo{ Name: "zhangsan", Age: 20, Hobby: []string{"吃饭", "睡觉", "写代码"}, } fmt.Println(u.GetHobby()) // proto.Marshald对protoBufer进行序列化 data, err1 := proto.Marshal(u) if err1 != nil { fmt.Println(err1) } fmt.Println(data) // proto.Unmarshal可以对protoBufer进行反序列化 info := protoService.UserInfo{} err2 := proto.Unmarshal(data, &info) if err2 != nil { fmt.Println(err2) } fmt.Printf("%#v", info) fmt.Println(info.GetHobby()) } -
验证 $
go run main.go, 查看输出[吃饭 睡觉 写代码] [10 8 122 104 97 110 103 115 97 110 16 20 26 6 229 144 131 233 165 173 26 6 231 157 161 232 167 137 26 9 229 134 153 228 187 163 231 160 129] protoService.UserInfo{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:(*impl.MessageInfo)(0xc00011e000)}, sizeCache:0, unknownFields:[]uint8(nil), Name:"zhangsan", Age:20, Hobby:[]string{"吃饭", "睡觉", "写代码"}, Phone:0}[吃饭 睡觉 写代码]
1708



被折叠的 条评论
为什么被折叠?



