一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - 在go語言中安裝與使用protobuf的方法詳解

在go語言中安裝與使用protobuf的方法詳解

2020-05-08 11:03Dr_Zhang Golang

protobuf以前只支持C++, Python和Java等語言, Go語言出來后, 作為親兒子, 那有不支持的道理呢? 這篇文章主要給大家介紹了關于在go語言中使用protobuf的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。

簡介

本文主要給大家介紹了關于go語言安裝使用protobuf的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

protobuf是Google開發出來的一個語言無關、平臺無關的數據序列化工具,在rpc或tcp通信等很多場景都可以使用。通俗來講,如果客戶端和服務端使用的是不同的語言,那么在服務端定義一個數據結構,通過protobuf轉化為字節流,再傳送到客戶端解碼,就可以得到對應的數據結構。這就是protobuf神奇的地方。并且,它的通信效率極高,“一條消息數據,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二進制序列化的10分之一”。

安裝

編譯安裝protobuf的編譯器protoc

?
1
2
3
4
5
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar zxvf protobuf-2.6.1.tar.gz
cd protobuf-2.6.1./configure
make
make install

        執行 protoc  -h 查看安裝是否成功

安裝插件 protoc-gen-go,它是一個go程序,編譯它之后將可執行文件執行路徑寫入環境變量

?
1
go get github.com/golang/protobuf/protoc-gen-go

獲取proto包

?
1
go get github.com/golang/protobuf/proto

在go中使用

protobuf的使用方法是將數據結構寫入到.proto文件中,使用protoc編譯器編譯(間接使用了插件)得到一個新的go包,里面包含go中可以使用的數據結構和一些輔助方法。

編寫test.proto文件

?
1
2
3
4
5
6
7
8
9
10
11
12
package example;
 
enum FOO { X = 17; };
 
message Test {
 required string label = 1;
 optional int32 type = 2 [default=77];
 repeated int64 reps = 3;
 optional group OptionalGroup = 4 {
 required string RequiredField = 5;
 }
}

    編譯:

    執行 protoc --go_out=. *.proto 生成 test.pb.go 文件

    將test.pb.go文件放入example文件夾(對應上面package)中,作為example包

try

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main
 
import (
 "log"
 
 "github.com/golang/protobuf/proto"
 "example"
)
 
func main() {
 test := &example.Test {
  Label: proto.String("hello"),
  Type: proto.Int32(17),
  Reps: []int64{1, 2, 3},
  Optionalgroup: &example.Test_OptionalGroup {
   RequiredField: proto.String("good bye"),
  },
 }
 data, err := proto.Marshal(test)
 if err != nil {
  log.Fatal("marshaling error: ", err)
 }
 newTest := &example.Test{}
 err = proto.Unmarshal(data, newTest)
 if err != nil {
  log.Fatal("unmarshaling error: ", err)
 }
 // Now test and newTest contain the same data.
 if test.GetLabel() != newTest.GetLabel() {
  log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
 }
 //test.GetOptionalgroup().GetRequiredField()
 //etc
}

一些對應關系

  • message Test對為 struct 結構,其屬性字段有了對應的get方法,在go中可以使用test.GetLabel()test.GetType()獲取test對象的屬性
  • OptionalGroup對應為 struct中的內嵌struct
  • proto文件中repeated屬性對于slice結構
  • test.Reset()可以使其所有屬性置為0值
  • 使用Marshal和Unmarshal可以輕松的編碼和解碼

這些只是一些特性,想要仔細研究可以查看github上的wiki:https://github.com/golang/protobuf

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://segmentfault.com/a/1190000010477733

延伸 · 閱讀

精彩推薦
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
主站蜘蛛池模板: 高h生子双性美人受 | 亚洲高清在线天堂精品 | 国产精品亚洲w码日韩中文 国产精品香蕉在线观看不卡 | 日韩一级在线观看 | 日本视频免费在线观看 | 久久亚洲午夜牛牛影视 | 波多野结衣xxxxx在线播放 | 青柠影院在线观看免费完整版1 | 丁香五香天堂 | 亚洲欧美在线免费观看 | 久久99亚洲热最新地址获取 | 亚洲国产剧情中文视频在线 | 日本另类z0zx高清 | 和直男装修工在工地啪 | 日本特黄一级大片 | 国产91精品久久久久久 | 摸进老太婆的裤裆小说 | 久久亚洲精品AV成人无 | 天天干夜夜添 | 91短视频在线观看2019 | 精品99一区二区三区麻豆 | 非洲黑人女bbwxxxx | 国产va欧美va在线观看 | 朝鲜女人free性xxe | 国产高清在线精品一区二区三区 | 成品人视频免费观看 | 海绵宝宝第二季全集免费观看 | 精品久久香蕉国产线看观看麻豆 | 国产一久久香蕉国产线看观看 | 午夜精品国产自在现线拍 | 动漫在线观看h | 欧美一区精品 | 欧美一级乱妇老太婆特黄 | 日韩精品久久不卡中文字幕 | 荡女淫春2未删减版 | 无人影院在线播放视频 | 国内精品伊人久久大香线焦 | 奇米网7777 | 亚洲四虎 | 校花小雪灌满了男人们的浓浆 | 性插图动态图无遮挡 |