網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
引言
本文記錄了mac環(huán)境下protobuf的編譯安裝,并通過(guò)一個(gè)示例來(lái)演示proto自動(dòng)生成go代碼。
本文使用的mac os 12.3系統(tǒng),不建議使用homebrew安裝,系統(tǒng)版本太高,會(huì)安裝報(bào)錯(cuò),所以自己下載新版壓縮包編譯構(gòu)建安裝。
1、安裝protobuf編譯器
在 官方github 選擇適合自己系統(tǒng)的Proto編譯器程序進(jìn)行下載安裝
本文使用的mac os 12.3系統(tǒng),不建議使用homebrew安裝,系統(tǒng)版本太高,會(huì)報(bào)錯(cuò),所以自己下載壓縮包構(gòu)建安裝。
- 下載地址:鏈接: https://pan.baidu.com/s/1NIMErRKrP3-DNmvA8SgKxg? 提取碼: 27av?
如需壓縮包請(qǐng)?jiān)谠u(píng)論區(qū)留言。
2.在/usr/local/下新建文件夾protobuf
3.將下載文件拷貝到:/usr/local/protobuf/
4.配置環(huán)境變量:
vim ~/.bash_profile
增加:
# protobuf export PROTOBUF=/usr/local/protobuf export PATH=$PROTOBUF/bin:$PATH
使環(huán)境變量生效:
source ~/.bash_profile
解壓:
tar zxvf protobuf-all-3.20.1.tar.gz
cd 進(jìn)入 protobuf-3.20.1/目錄下,在終端按順序執(zhí)行:
sudo ./configure sudo make sudo make check sudo make install
執(zhí)行命令:protoc --version
檢查是否安裝成功
2、下載protobuf的golang支持庫(kù),安裝protoc-gen-go
protoc-gen-go
用來(lái)將?.proto
?文件轉(zhuǎn)換為 Golang 代碼。
在終端運(yùn)行命令:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
這條命令會(huì)安裝,并將protoc-gen-go
可執(zhí)行文件復(fù)制到$GOBIN
文件夾下
注意:原來(lái)的github.com/golang/protobuf/protoc-gen-go
這個(gè)庫(kù)已經(jīng)被棄用,我們需要使用 google.golang.org/protobuf
這個(gè)庫(kù)
% go get -u github.com/golang/protobuf/protoc-gen-go go: module github.com/golang/protobuf is deprecated: Use the "google.golang.org/protobuf" module instead. go: added github.com/golang/protobuf v1.5.2 go: added google.golang.org/protobuf v1.28.0
3、protobuf使用示例
1、新建一個(gè)go moudle項(xiàng)目,創(chuàng)建擴(kuò)展名為.proto
的文件,并編寫代碼。比如創(chuàng)建idl/user.proto文件,內(nèi)容如下:
syntax = "proto3"; package user; option go_package ="./user"; message User { int64 user_id = 1; string user_name = 2; string password = 3; }
2、編譯.proto文件,生成Go語(yǔ)言文件。執(zhí)行如下命令:
protoc --go_out=. ./idl/*.proto
將會(huì)自動(dòng)生成對(duì)應(yīng)的user目錄,存放生成的user.pb.go文件:
3、在main程序中使用Protobuf生成的代碼:
使用proto將user序列化輸出out,在將out反序列化成user
package main import ( "encoding/json" "fmt" "github.com/starine/go-protoc-example/user" "google.golang.org/protobuf/proto" "log" ) func main() { fmt.Println("Hello World. \n") user1 := user.User{} user1.Password = "123456" user1.UserName = "starine" bytes, _ := json.Marshal(user1) fmt.Println(string(bytes)) //序列化user結(jié)構(gòu)體數(shù)據(jù) out, err := proto.Marshal(&user1) if err != nil { log.Fatalln("Failed to encode User:", err) } fmt.Println(out) //反序列化user結(jié)構(gòu)體 user2 := user.User{} err = proto.Unmarshal(out, &user2) if err!=nil { log.Fatalln("Failed to parse User:", err) } bytes, _ = json.Marshal(user2) fmt.Println(string(bytes)) }
運(yùn)行結(jié)果:
% go run main.go
Hello World.?{"user_name":"starine","password":"123456"}
[18 7 115 116 97 114 105 110 101 26 6 49 50 51 52 53 54]
{"user_name":"starine","password":"123456"}Process finished with the exit code 0
原文鏈接:https://juejin.cn/post/7101304169524527140
相關(guān)推薦
- 2022-08-26 如何使用pandas對(duì)超大csv文件進(jìn)行快速拆分詳解_python
- 2023-03-21 解讀torch.nn.GRU的輸入及輸出示例_python
- 2021-12-16 linux下wget命令的基本使用方法_Linux
- 2022-04-23 pytorch實(shí)現(xiàn)圖像識(shí)別(實(shí)戰(zhàn))_python
- 2022-05-01 Qt實(shí)戰(zhàn)案例之如何利用QProcess類實(shí)現(xiàn)啟動(dòng)進(jìn)程_C 語(yǔ)言
- 2023-04-08 c#?線程定時(shí)器?System.Threading.Timer的使用_C#教程
- 2022-06-30 python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解_python
- 2023-02-12 基于Redis驗(yàn)證碼發(fā)送及校驗(yàn)方案實(shí)現(xiàn)_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支