網站首頁 編程語言 正文
引言
本文記錄了mac環境下protobuf的編譯安裝,并通過一個示例來演示proto自動生成go代碼。
本文使用的mac os 12.3系統,不建議使用homebrew安裝,系統版本太高,會安裝報錯,所以自己下載新版壓縮包編譯構建安裝。
1、安裝protobuf編譯器
在 官方github 選擇適合自己系統的Proto編譯器程序進行下載安裝
本文使用的mac os 12.3系統,不建議使用homebrew安裝,系統版本太高,會報錯,所以自己下載壓縮包構建安裝。
- 下載地址:鏈接: https://pan.baidu.com/s/1NIMErRKrP3-DNmvA8SgKxg? 提取碼: 27av?
如需壓縮包請在評論區留言。
2.在/usr/local/下新建文件夾protobuf
3.將下載文件拷貝到:/usr/local/protobuf/
4.配置環境變量:
vim ~/.bash_profile
增加:
# protobuf export PROTOBUF=/usr/local/protobuf export PATH=$PROTOBUF/bin:$PATH
使環境變量生效:
source ~/.bash_profile
解壓:
tar zxvf protobuf-all-3.20.1.tar.gz
cd 進入 protobuf-3.20.1/目錄下,在終端按順序執行:
sudo ./configure sudo make sudo make check sudo make install
執行命令:protoc --version
檢查是否安裝成功
2、下載protobuf的golang支持庫,安裝protoc-gen-go
protoc-gen-go
用來將?.proto
?文件轉換為 Golang 代碼。
在終端運行命令:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
這條命令會安裝,并將protoc-gen-go
可執行文件復制到$GOBIN
文件夾下
注意:原來的github.com/golang/protobuf/protoc-gen-go
這個庫已經被棄用,我們需要使用 google.golang.org/protobuf
這個庫
% 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、新建一個go moudle項目,創建擴展名為.proto
的文件,并編寫代碼。比如創建idl/user.proto文件,內容如下:
syntax = "proto3"; package user; option go_package ="./user"; message User { int64 user_id = 1; string user_name = 2; string password = 3; }
2、編譯.proto文件,生成Go語言文件。執行如下命令:
protoc --go_out=. ./idl/*.proto
將會自動生成對應的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結構體數據 out, err := proto.Marshal(&user1) if err != nil { log.Fatalln("Failed to encode User:", err) } fmt.Println(out) //反序列化user結構體 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)) }
運行結果:
% 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
相關推薦
- 2022-10-23 C#實現觀察者模式(Observer?Pattern)的兩種方式_C#教程
- 2022-11-10 Android光線傳感器使用方法詳解_Android
- 2022-02-22 解決:DevTools failed to load SourceMap:... net::ERR_
- 2023-03-21 Golang使用Gin創建Restful?API的實現_Golang
- 2022-12-21 C語言中continue的用法詳解_C 語言
- 2022-12-13 C++?Boost實現數字與字符串轉化詳解_C 語言
- 2022-07-19 使用普通指針實現數組倒敘和字符串的壓縮
- 2022-04-20 Appium自動化測試中獲取Toast信息操作_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支