go實踐十六 使用protobuf讀寫檔案

2021-09-25 22:02:26 字數 3759 閱讀 2212

最近的專案中,一直使用json做資料傳輸。json用起來的確很方便。但相對於protobuf資料量更大些。做乙個移動端應用,為使用者省點流量還是很有必要的。正好也可以學習一下protobuf的使用

跟json相比protobuf效能更高,更加規範

但也失去了一些便利性

protobuf github: 

本文使用的是 /download/v3.9.0/protobuf-all-3.9.0.tar.gz

[root@izj6c4jirdug8kh3uo6rdez package]# wget /download/v3.9.0/protobuf-all-3.9.0.tar.gz

# 解壓

[root@izj6c4jirdug8kh3uo6rdez package]# tar -zxvf proto*

# 切換到解壓後的目錄

[root@izj6c4jirdug8kh3uo6rdez protobuf-3.9.0]# cd proto*

# 設定安裝目錄

[root@izj6c4jirdug8kh3uo6rdez protobuf-3.9.0]# ./configure --prefix=/usr/local/proto

# 編譯安裝

[root@izj6c4jirdug8kh3uo6rdez protobuf-3.9.0]# make && make install

# 新增到bin目錄

[root@izj6c4jirdug8kh3uo6rdez protobuf-3.9.0]# ln -s /usr/local/proto/bin/protoc /usr/bin/protoc

# 檢視版本

[root@izj6c4jirdug8kh3uo6rdez protobuf-3.9.0]# protoc --version

libprotoc 3.9.0

# protoc-gen-go是用來將protobuf的的**轉換成go語言**的乙個外掛程式

# proto是protobuf在golang中的介面模組

# 設定 protoc-gen-go 命令

[root@izj6c4jirdug8kh3uo6rdez protobufffile]# ln -s /usr/local/go/gopath/bin/protoc-gen-go /usr/bin/protoc-gen-go

protobufffile的目錄結構

├── protobuf                        # proto檔案統一存放目錄

│   ├── protobuf.proto          # proto檔案

├── main.go                         # 專案單入口              

//指定版本

//注意proto3與proto2的寫法有些不同

syntax = "proto3";

//包名,通過protoc生成時go檔案時

package protobuf;

//宣告乙個訊息體描述乙個請求或者響應的訊息格式

fmt.printf("使用protobuf建立檔案 %s\n",filename)

fobj,_ := os.create(filename) //建立檔案

defer fobj.close() //關閉檔案 ,defer 會在程式最後執行

buffer,_ := proto.marshal(msg) //序列化資料

fobj.write(buffer) //寫入檔案

}func protobuffread()

pberr := proto.unmarshal(buffer, msg) //反序列化資料

checkerror(pberr)

fmt.printf("讀取檔案:%s \r\nname:%s\nid:%d\nopt:%d\n",filename,msg.getname(),msg.getid(),msg.getsin())

}//檢查錯誤

func checkerror(err error)

}

[root@izj6c4jirdug8kh3uo6rdez protobufffile]# cd protobuf

[root@izj6c4jirdug8kh3uo6rdez protobuf]# ll

total 4

-rw-r--r-- 1 root root 302 aug 6 12:37 protobuf.proto

[root@izj6c4jirdug8kh3uo6rdez protobuf]# protoc --go_out=. *.proto

[root@izj6c4jirdug8kh3uo6rdez protobuf]# ll

total 8

-rw-r--r-- 1 root root 3186 aug 6 12:38 protobuf.pb.go

-rw-r--r-- 1 root root 302 aug 6 12:37 protobuf.proto

[root@izj6c4jirdug8kh3uo6rdez protobufffile]# go mod init protobufffile

go: creating new go.mod: module protobufffile

[root@izj6c4jirdug8kh3uo6rdez protobufffile]# go build
[root@izj6c4jirdug8kh3uo6rdez protobufffile]# ./protobufffile

使用protobuf建立檔案 ./protobufffile.txt

讀取檔案:protobufffile.txt

name:hello world

id:17

opt:18

參考:

參考:

Mac下Go安裝配置並使用Protobuf

首先使用home brew安裝protobuf brew install protobuf 安裝好之後,檢視是否安裝成功 protoc version 如果成功會有如下類似的版本號顯示 libprotoc 3.1.0 這表明我安裝成功,並且版本號是3.1.0。接著安裝protobuf的golang外...

go實踐十三 使用redis

使用 go run testcolly.go 執行該檔案即可 redis set 10秒生存時間 err client.setnx test value 10 time.second result if err nil redis get value client.get test if err n...

CUDA實踐指南(十六)

共享記憶體啟用塊中線程之間的協作。當乙個塊中的多個執行緒使用全域性記憶體中的相同資料時,共享記憶體只能用於從全域性記憶體訪問一次資料。共享記憶體還可以用來避免未合併的記憶體訪問,方法是從全域性記憶體中載入和儲存合併模式的資料,然後將其重新排列在共享記憶體中。除了儲存體衝突之外,共享記憶體中的變形對非...