上一篇文章(大約半年前寫的):http://www.javashuo.com/article/p-yssafgti-mk.htmlhtml
創建Go項目
在GOPATH的src下面創建一個文件夾 protobuf-go,而後在裏面執行命令
go mod init github.com/solenovex/protobuf-go
這個命令是用來初始化go module的。
命令執行後在該目錄生成go.mod文件,其內容以下:
其實直接執行go mod init 也行,默認會取當前文件夾的名字做爲項目名。
若是你使用的是Goland,那麼須要啓用Go modules集成:
而後咱們須要安裝Protocol buffer的 Go 支持庫:
go get -u github.com/golang/protobuf/protoc-gen-go
安裝好以後:
下面會出現require github.com/…. 後邊顯示indirect,說明咱們的代碼尚未對其進行直接引用
創建main.go,代碼以下:
而後執行命令 go run main.go 若是輸出 "hello world!" 就說明一切正常。
創建proto
在項目下創建src/first文件夾,在裏面創建person.proto文件:
下面須要經過這個proto文件,生成go的代碼,命令行執行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
執行完以後,在src/first文件夾下會生成一個文件person.pb.go:
咱們看一下這個文件裏的PersonMessage 這個struct:
這裏面前4個屬性就是proto文件裏面定義的那4個屬性,每一個屬性後邊都跟着一個字符串tags,它裏面提供了一些反射須要的信息。
例如id屬性後邊這個:
它表示:
- 針對protocol buffer轉換,它的類型是varint,tag爲1,opt應該是proto2裏面遺留下來的東西不用去管,名子爲id,協議是proto3.
- 針對json序列化,它的名爲id,omitempty大概能夠理解爲若是值爲該類型的默認值,那麼id這個key就會被忽略掉。
該文件裏面的其他內容我就不介紹了,可是注意,這個文件不能夠修改!
使用proto生成的代碼
在main.go裏面創建一個新的函數NewPersonMessage,而後main函數調用它:
在NewPersonMessage函數裏面,咱們New了一個生成文件裏面的PersonMessage這個struct,並把4個屬性賦了值,最後把它賦給變量pm。
能夠經過pm.xx屬性來修改它的值,也能夠經過pm.GetXx()來獲取其屬性的值。
執行go run main.go以後結果以下:
修改package名
proto生成的go文件的package名並非很符合約定,有一種約定是proto生成的go文件的package名應該以詩上層目錄名+pb:
因此我能夠修改proto文件,添加一個option:
option go_package 的值就是 生成go文件的package名。
再次執行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
此次生成的go文件的package就是:
把數據寫入到文件
下面把NewPersonMessage添加一個返回類型:
返回PersonMessage的指針。
而後在main函數裏經過NewPersonMessage函數獲取一個PersonMessage,而後再創建一個writeToFile函數,把數據寫入到文件裏:
這裏面writeToFile函數的第一個參數是文件名,第二個參數是proto.Message類型,它是一個接口,其代碼以下:
而person.proto生成的PersonMessage struct正好擁有這些方法,因此它就是實現了該接口,因此在main在調用writeToFile函數的時候,能夠將PersonMessage傳遞進去。
writeToFile裏面的代碼很簡單,就是把數據寫入到制定的文件裏,文件權限模式爲0644。
而後執行 go run main.go 會生成person.bin文件:
它是個二進制文件,編輯器沒法打開查看內容。
從文件讀取數據
添加一個readFromFile函數,用來從文件讀取數據:
而後在main函數裏面new一個PersonMessage的指針,它的各屬性值都沒填,把這個指針傳入到readFromFile函數裏面,在裏面使用proto.Unmarshal方法把數據寫入到該指針指向的struct裏面。
最後在main函數裏進行打印,其結果以下:
原文出處:https://www.cnblogs.com/cgzl/p/12296678.htmlgit