Mac下Go安装配置并使用Protobuf

简介:
首先使用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看起来是这样的文件夹结构:


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

预期的结果是这样的:


下面是测试代码的完整打包:
/Files/tx7do/test_pb_go.zip
目录
相关文章
|
Go iOS开发 MacOS
手把手教你在Mac上从零搭建Go语言开发环境
手把手教你在Mac上从零搭建Go语言开发环境
2061 0
|
6月前
|
关系型数据库 MySQL 开发工具
mysql -- MAC下安装配置mysql
mysql -- MAC下安装配置mysql
|
3月前
|
移动开发 JavaScript 开发工具
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
|
3月前
|
Go
Go - 如何编写 ProtoBuf 插件 (一) ?
Go - 如何编写 ProtoBuf 插件 (一) ?
39 2
|
3月前
|
Go
Go - 如何编写 ProtoBuf 插件 (三) ?
Go - 如何编写 ProtoBuf 插件 (三) ?
23 1
|
3月前
|
Go
Go - 如何编写 ProtoBuf 插件(二)?
Go - 如何编写 ProtoBuf 插件(二)?
74 0
|
JSON Linux 测试技术
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
|
前端开发 安全 Go
在Mac OS X上运行Go语言的GUI程序
在Mac OS X上运行Go语言的GUI程序
380 3
|
Go 开发工具 iOS开发
Mac 下搭建 Go 开发环境 | 学习笔记
快速学习 Mac 下搭建 Go 开发环境
|
Go 开发工具
Mac安装go 环境搭建教程
Mac安装go 环境搭建教程