胖sir:不知道你有沒有這樣的疑惑,工作中發現很多新接觸GO的小伙伴安裝protoc的環境需要折騰很久
剛開始我裝環境的時候也是花了好長時間,最后如何裝好的也不知原因,網上查找了各種資源,也沒有一篇文章可以很好的解決這個問題.
兵長:這個好說,今天咱們就來梳理和總結一下,如何快速高效的安裝好protoc的環境
前提,先介紹一下protoc是干啥的?
簡而言之,protoc是用於將proto文件編程成各種語言源碼文件的工具
例如此處我們可以將proto
文件通過protoc工具,編譯生成適用於GO語言開發的源碼文件xxx.pb.go
,一般會和GRPC進行配套使用,如果對這個感興趣,可以在后台留言哦,此處暫且先單一說明一下protoc的環境如何一次性搞定
目前看來windows上的protoc安裝相對來說疑問還是比較多的,其實安裝還是非常簡單的,我們就來說說吧
windows 下安裝go protoc
1、下載最新版的golang安裝程序
2、 解壓,把GOPATH的路徑添加到環境變量
例如:要是不知道GOPATH在哪里獲取, 可以在終端里面敲入 go env
進行查看
3、命令行執行
go get github.com/golang/protobuf
若如上命令執行失敗,請配置代理
go env -w GO111MODULE=on //打開模塊
go env -w GOPROXY=https://goproxy.cn,direct //啟用代理
4、%GOPATH%/src/github.com/golang/protobufxxxxx/protoc-gen-go
go build
go install
執行之后,看到自己GOPATH/bin
目錄下會生成如下程序,說明環境配置成功
5、開始使用protoc
目錄結構為:
test.proto
syntax="proto3"; //版本號
package mypro; //包名
enum ClassName{ //枚舉
class1=0; //標號 必須從 0開始
class2=1;
class3=2;
}
message Student{ //消息,對應於Go的結構體
string name=1; //1:標號,唯一 即可(相當於數據庫中的Id,不一定要從1 ,2的順序依次排列。)
int32 age=2; //必須指定整型的范圍,如int32,int64
string address=3;
ClassName cn=4;
}
message Students{
repeated Student person=1; // repeated 修飾,相當於Go中切片
string school=2;
}
執行:protoc --go_out=. *.proto , 會生成 .pb.go文件
main.go
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"mypro.com/mypro" //引入的proto的包 , go語言中,一個目錄里面的所有文件都應設置成一個包
)
func main() {
s1 := &mypro.Student{} //第一個學生信息
s1.Name = "jz01"
s1.Age = 23
s1.Address = "cq"
s1.Cn = mypro.ClassName_class2 //枚舉類型賦值
ss := &mypro.Students{}
ss.Person = append(ss.Person, s1) //將第一個學生信息添加到Students對應的切片中
s2 := &mypro.Student{} //第二個學生信息
s2.Name = "jz02"
s2.Age = 25
s2.Address = "cd"
s2.Cn = mypro.ClassName_class3
ss.Person = append(ss.Person, s2) //將第二個學生信息添加到Students對應的切片中
ss.School = "cqu"
fmt.Println("Students信息為:", ss)
// Marshal takes a protocol buffer message
// and encodes it into the wire format, returning the data.
buffer, _ := proto.Marshal(ss)
fmt.Println("序列化之后的信息為:", buffer)
// Use UnmarshalMerge to preserve and append to existing data.
data := &mypro.Students{}
proto.Unmarshal(buffer, data)
fmt.Println("反序列化之后的信息為:", data)
}
在main.go的同級目錄 執行 go mod init xxx , 模塊化 如:go mod init mypro.com
在main.go 同級目錄 執行 go build , 若執行成功,則正確解析protobuf
當需要使用到grpc + protobuf的時候,protoc工具編譯proto文件時,需要加上grpc插件,具體的使用方式,感興趣的可以后台私信小魔童哪吒哦
以上為本期全部內容,如有疑問可以在評論區或后台提出你的疑問,我們一起交流,一起成長。
好家伙要是文章對你還有點作用的話,請幫忙點個關注,分享到你的朋友圈,分享技術,分享快樂
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
作者:小魔童哪吒