Mac下Go安装配置并使用Protobuf
2023-09-27 14:28:00 时间
首先使用Home Brew安装Protobuf:
brew install protobuf
安装好之后,查看是否安装成功
protoc --version
如果成功会有如下类似的版本号显示:
libprotoc 3.1.0 这表明我安装成功,并且版本号是3.1.0。
接着安装protobuf的golang插件
go get -u -v github.com/golang/protobuf/proto
go get -u -v github.com/golang/protobuf/protoc-gen-go
因为protoc需要依赖调用protoc-gen-go,所以,它的路径必须要添加到环境变量里面去。
它存在于$GOPATH/bin之下。
我使用的shell是zsh,因此需要修改配置`/.zshrc
在最后添加配置:
export GOPATH=$HOME/Documents/golang/
export GOBIN=$GOPATH/bin
export PATH="$GOBIN:$PATH" 保存,然后重开zsh,即可。
我的workspace看起来是这样的文件夹结构:
![](http://www.cppblog.com/images/cppblog_com/tx7do/golang_protobuf_folder.png)
protobuf协议源文件放在了protocol/proto下面
helloworld.proto
syntax = "proto2";
package test;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
在这里需要注意几点:
1.如果不定义package,编译器会自行的将文件名生成package名,如上面的例子将会生成一一个package helloword;
2.因为golang遵循的是驼峰规则,message和field的名字首字母将会自动转为大写字母(如果首字母为下划线,则下划线会被自动转换为大写的X),而package名则不会;
接着我们就可以用命令行编译出go代码了:
protoc --go_out=. helloworld.proto 运行该命令之后,如果协议没有语法错误,则会在proto文件同级目录下生成一个hellword.pb.go的代码文件,接着我们就能直接拿来用了。
如果是一个proto文件,使用一条命令生成是没有问题的,但是在现实中,并不会只有一个,会有多个,那么就需要有批量的生成工具了,在mac/linux下面使用shell脚本可以搞定,在Windows下可以用bat批处理脚本搞定,下面给一个mac下的shell脚本示例代码:
generate_code.sh
path=$(dirname $0)
path=${path/\./$(pwd)}
#echo $path
# /////////////////////////////////////////////////////////////////////////////
#
# 编译Protobuf协议
#
# /////////////////////////////////////////////////////////////////////////////
protoc --version
protoc --go_out=$path/../ -I=$path $path/helloworld.proto 记得修改文件可执行权限,我就很偷懒,用:chmod 777 generate_code.sh搞定。
最后写go的测试代码了:
testpb.go
package main
import (
"./protocol"
"fmt"
"github.com/golang/protobuf/proto"
"log"
)
func main() {
// 创建一个消息
data_encode := test.Helloworld{
Id: proto.Int32(11),
Str: proto.String("hello world!"),
Opt: proto.Int32(17),
}
// 进行编码
data, err := proto.Marshal(data_encode)
if err != nil {
log.Fatal("marshaling error: ", err)
}
// 进行解码
data_decode := test.Helloworld{}
err = proto.Unmarshal(data, data_decode)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
// 测试结果
if data_encode.GetId() != data_decode.GetId() {
log.Fatalf("data mismatch %q != %q", data_encode.GetId(), data_decode.GetId())
}
fmt.Println("ID:", data_decode.GetId())
fmt.Println("Str:", data_decode.GetStr())
fmt.Println("Opt:", data_decode.GetOpt())
这里需要注意的是,import里面所填写的是go文件的路径,而无需要填写文件名,也就是go文件的搜索路径,默认的根目录是$GOPATH/src,如果是放在src里面,则直接写"protocol"即可,但是我不希望如此,我把它放在了测试go文件的同级目录下了,那么,我就需要这样写"./protocol"(需要注意的是,斜杠只能写/而不能\)。
好了,现在开始编译:
go build testpb.go
接着是执行:
./testpb
预期的结果是这样的:
![](http://www.cppblog.com/images/cppblog_com/tx7do/golang_protobuf_result.png)
下面是测试代码的完整打包:
/Files/tx7do/test_pb_go.zip
一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境 时光荏苒,过隙白驹,进入2023年,著名敏捷开发语言Python也放出了3.10最终版,本次我们来展示一下在不同的系统和平台中,高效部署Python3.10开发环境,这里我们并不依赖其他的三方软件,只通过Python官方的安装包进行配置,编辑器我们依然使用微软开源的Vscode,争取在一分钟以内就可以在一台干净的开发机上部署好环境,省去一些不必要的步骤。
Go语言,Protobuf 入门详解! Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
brew install protobuf
安装好之后,查看是否安装成功
protoc --version
如果成功会有如下类似的版本号显示:
libprotoc 3.1.0 这表明我安装成功,并且版本号是3.1.0。
接着安装protobuf的golang插件
go get -u -v github.com/golang/protobuf/proto
go get -u -v github.com/golang/protobuf/protoc-gen-go
因为protoc需要依赖调用protoc-gen-go,所以,它的路径必须要添加到环境变量里面去。
它存在于$GOPATH/bin之下。
我使用的shell是zsh,因此需要修改配置`/.zshrc
在最后添加配置:
export GOPATH=$HOME/Documents/golang/
export GOBIN=$GOPATH/bin
export PATH="$GOBIN:$PATH" 保存,然后重开zsh,即可。
我的workspace看起来是这样的文件夹结构:
![](http://www.cppblog.com/images/cppblog_com/tx7do/golang_protobuf_folder.png)
protobuf协议源文件放在了protocol/proto下面
helloworld.proto
syntax = "proto2";
package test;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
在这里需要注意几点:
1.如果不定义package,编译器会自行的将文件名生成package名,如上面的例子将会生成一一个package helloword;
2.因为golang遵循的是驼峰规则,message和field的名字首字母将会自动转为大写字母(如果首字母为下划线,则下划线会被自动转换为大写的X),而package名则不会;
接着我们就可以用命令行编译出go代码了:
protoc --go_out=. helloworld.proto 运行该命令之后,如果协议没有语法错误,则会在proto文件同级目录下生成一个hellword.pb.go的代码文件,接着我们就能直接拿来用了。
如果是一个proto文件,使用一条命令生成是没有问题的,但是在现实中,并不会只有一个,会有多个,那么就需要有批量的生成工具了,在mac/linux下面使用shell脚本可以搞定,在Windows下可以用bat批处理脚本搞定,下面给一个mac下的shell脚本示例代码:
generate_code.sh
path=$(dirname $0)
path=${path/\./$(pwd)}
#echo $path
# /////////////////////////////////////////////////////////////////////////////
#
# 编译Protobuf协议
#
# /////////////////////////////////////////////////////////////////////////////
protoc --version
protoc --go_out=$path/../ -I=$path $path/helloworld.proto 记得修改文件可执行权限,我就很偷懒,用:chmod 777 generate_code.sh搞定。
最后写go的测试代码了:
testpb.go
package main
import (
"./protocol"
"fmt"
"github.com/golang/protobuf/proto"
"log"
)
func main() {
// 创建一个消息
data_encode := test.Helloworld{
Id: proto.Int32(11),
Str: proto.String("hello world!"),
Opt: proto.Int32(17),
}
// 进行编码
data, err := proto.Marshal(data_encode)
if err != nil {
log.Fatal("marshaling error: ", err)
}
// 进行解码
data_decode := test.Helloworld{}
err = proto.Unmarshal(data, data_decode)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
// 测试结果
if data_encode.GetId() != data_decode.GetId() {
log.Fatalf("data mismatch %q != %q", data_encode.GetId(), data_decode.GetId())
}
fmt.Println("ID:", data_decode.GetId())
fmt.Println("Str:", data_decode.GetStr())
fmt.Println("Opt:", data_decode.GetOpt())
这里需要注意的是,import里面所填写的是go文件的路径,而无需要填写文件名,也就是go文件的搜索路径,默认的根目录是$GOPATH/src,如果是放在src里面,则直接写"protocol"即可,但是我不希望如此,我把它放在了测试go文件的同级目录下了,那么,我就需要这样写"./protocol"(需要注意的是,斜杠只能写/而不能\)。
好了,现在开始编译:
go build testpb.go
接着是执行:
./testpb
预期的结果是这样的:
![](http://www.cppblog.com/images/cppblog_com/tx7do/golang_protobuf_result.png)
下面是测试代码的完整打包:
/Files/tx7do/test_pb_go.zip
一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境 时光荏苒,过隙白驹,进入2023年,著名敏捷开发语言Python也放出了3.10最终版,本次我们来展示一下在不同的系统和平台中,高效部署Python3.10开发环境,这里我们并不依赖其他的三方软件,只通过Python官方的安装包进行配置,编辑器我们依然使用微软开源的Vscode,争取在一分钟以内就可以在一台干净的开发机上部署好环境,省去一些不必要的步骤。
Go语言,Protobuf 入门详解! Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
相关文章
- SQL中的go、begin、end的用法
- Raspberry Pi 安装 go 后提示错误 Exec format error
- Minimizing Go WebAssembly Binary Size
- GO 环境配置
- Go 语言极速入门
- GO语言学习笔记之Linux环境下安装GO语言
- 0151-Go-信号
- 0119-Go-错误恢复
- 0112-Go-原子计数器
- 0096-Go-错误处理
- 0079-Go-switch 分支
- ubuntu安装go语言
- intelliJ idea安装go开发环境 并 搭建go项目 打包
- Windows 平台下 Go 语言的安装和环境变量设置
- Go数组、字符串、切片原理和优化
- Go_13:Go常用功能总结一阶段
- [golang][history]The Go Annotated Specification Go注释规范18c5b488a3b2e218c0e0cf2a7d4820d9da93a554
- [golang]Go常见问题:# command-line-arguments: ***: undefined: ***
- [golang]写了一个可以用 go 来写脚本的工具:gosl
- 以太坊go-ethereum客户端docker安装(一)
- 如何为Linux安装Go语言