亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang Protocol Buffer案例詳解

 更新時間:2021年08月17日 14:47:46   作者:夢想畫家  
這篇文章主要介紹了Golang Protocol Buffer案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

Golang Protocol Buffer教程

本文介紹如何在Go應(yīng)用中利用Protocol Buffer數(shù)據(jù)格式。主要包括什么是Protocol Buffer數(shù)據(jù)格式,其超越傳統(tǒng)數(shù)據(jù)格式XML或JSON的優(yōu)勢是什么。

1. Protocol Buffer數(shù)據(jù)格式

Protocol Buffer,本質(zhì)就是一種數(shù)據(jù)格式,和JSON或XML一樣,不同的語言用于結(jié)構(gòu)化數(shù)據(jù)序列化或反序列化。該數(shù)據(jù)格式的優(yōu)勢是較xml或json更小,源于Google。假如我們有一個對象,我們用三種數(shù)據(jù)結(jié)構(gòu)進行表示:

<person>
  <name>Elliot</name>
  <age>24</age>
</person>

使用json表示占用空間更?。?/p>

{
  "name": "Elliot",
  "age": 24
}

如果使用protocol buffer格式表示:

[10 6 69 108 108 105 111 116 16 24]

如果您仔細觀察上面編碼可能會看到,從數(shù)組位置2開始名字elliot被拼出來,e = 69, l = 108等等。后面是年齡的字節(jié)表示,24歲。

不過編碼格式內(nèi)容比我們看到的要多,下面會更詳細地解釋,如果您愿意可看其官方文檔。

現(xiàn)在這個示例數(shù)據(jù),Json和 Protocol Buffer格式幾乎沒有太大差別,但當(dāng)遇到數(shù)據(jù)量很大場景時,差別就體現(xiàn)出來了。

2. 簡單示例

首先下載必要的依賴:

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

下載完成后,確保能夠在命令行中可以運行 protoc 命令。下面我們定義 protobuf 結(jié)構(gòu),這里定義上面用來對比不同數(shù)據(jù)格式之間差異的person 對象。

首先指定我們使用的語法格式,這里使用 proto3,然后指定存放的包名。最后定義對象,Peson類型的消息及其包括的字段 name 和 age。

person.proto結(jié)構(gòu)定義如下:

syntax="proto3";

package main;

message Person {
      string name = 1;
      int32 age = 2;
}

然后在該文件的路徑下運行下面命令:

protoc --go_out=. *.proto

即在當(dāng)前目錄下 生成所有擴展名為 proto文件的 .pb.go 文件。
現(xiàn)在我們定義Person類型對象使用 protobuf格式進行序列化。代碼如下;

import (
    "fmt"
    "log"

    "github.com/golang/protobuf/proto"
)

func main() {
  elliot := &Person{
    Name: "Elliot",
    Age:  24,
  }

  data, err := proto.Marshal(elliot)
  if err != nil {
    log.Fatal("marshaling error: ", err)
  }

  // 打印原始的protobuf序列化對象
  fmt.Println(data)


  // 反序列化進行驗證
  newElliot := &Person{}
  err = proto.Unmarshal(data, newElliot)
  if err != nil {
    log.Fatal("unmarshaling error: ", err)
  }

  // 打印 `newElliot` 對象進行驗證
  fmt.Println(newElliot.GetAge())
  fmt.Println(newElliot.GetName())

}

使用go run 命令運行,需要在main.go 后面?zhèn)魅?person.pb.go,命令如下:

go run main.go test.pb.go

在ide環(huán)境中可以直接運行。輸出結(jié)果如下:

[10 6 69 108 108 105 111 116 16 24]
name:"Elliot" age:24

3. 嵌套示例

我們已經(jīng)完成了一個非常簡單的示例,但現(xiàn)實中消息格式通常會遇到多個嵌套字段,下面增加嵌套類型字段。

我們?nèi)匀皇褂们懊?Person 類型,僅增加社交網(wǎng)絡(luò)的粉絲字段。SocialFollowers的消息類型如下:

syntax="proto3";

package main;

message SocialFollowers {
  int32 youtube = 1;
  int32 twitter = 2;
}

message Person {
  string name = 1;
  int32 age = 2;
  SocialFollowers socialFollowers = 3;
}

因為Person 類型已經(jīng)被修改了,需要重新運行 protoc 命令:

protoc --go_out=. *.proto

現(xiàn)在同時修改代碼進行測試,填充 elliot 對象使用 SocialFollowers 類型對象:

package main

import (
    "fmt"
    "log"

    "github.com/golang/protobuf/proto"
)

func main() {

  elliot := Person{
    Name: "Elliot",
    Age:  24,
    SocialFollowers: &SocialFollowers{
        Youtube: 2500,
        Twitter: 1400,
    },
  }

  // 序列化對象
  data, err := proto.Marshal(&elliot)
  if err != nil {
    log.Fatal("marshaling error: ", err)
  }

  // 反序列化對象進行驗證
  newElliot := &Person{}
  err = proto.Unmarshal(data, newElliot)
  if err != nil {
    log.Fatal("unmarshaling error: ", err)
  }

  // 輸出 `newElliot` 對象屬性進行驗證
  fmt.Println(newElliot.GetName())
  fmt.Println(newElliot.GetAge())
  fmt.Println(newElliot.SocialFollowers.GetTwitter())
  fmt.Println(newElliot.SocialFollowers.GetYoutube())
}

運行程序輸出結(jié)果:

Elliot
24
1400
2500

4. 總結(jié)

本文我們學(xué)習(xí)了Go應(yīng)用中如何使用 protocol buffer 數(shù)據(jù)格式。

到此這篇關(guān)于Golang Protocol Buffer案例詳解的文章就介紹到這了,更多相關(guān)Golang Protocol Buffer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結(jié)

    SpringBoot實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結(jié)

    項目開發(fā)中經(jīng)常會遇到多數(shù)據(jù)源同時使用的場景,比如冷熱數(shù)據(jù)的查詢等情況,所以接下來本文就來介紹一下如何使用實現(xiàn)自定義注解的形式來實現(xiàn)動態(tài)數(shù)據(jù)源切換吧
    2023-12-12
  • SpringBoot?DataSource數(shù)據(jù)源實現(xiàn)自動配置流程詳解

    SpringBoot?DataSource數(shù)據(jù)源實現(xiàn)自動配置流程詳解

    這篇文章主要介紹了SpringBoot?DataSource數(shù)據(jù)源實現(xiàn)自動配置流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Java搜索與圖論之DFS和BFS算法詳解

    Java搜索與圖論之DFS和BFS算法詳解

    DFS指在進行算法運算時,優(yōu)先將該路徑的當(dāng)前路徑執(zhí)行完畢,執(zhí)行完畢或失敗后向上回溯嘗試其他途徑。BFS指在進行算法運算時,優(yōu)先將當(dāng)前路徑點的所有情況羅列出來,然后根據(jù)羅列出來的情況羅列下一層。本文介紹了二者的實現(xiàn)與應(yīng)用,需要的可以參考一下
    2022-11-11
  • 詳解Java利用ExecutorService實現(xiàn)同步執(zhí)行大量線程

    詳解Java利用ExecutorService實現(xiàn)同步執(zhí)行大量線程

    這篇文章主要介紹了Java利用ExecutorService實現(xiàn)同步執(zhí)行大量線程,ExecutorService可以維護我們的大量線程在操作臨界資源時的穩(wěn)定性。
    2017-03-03
  • Java中的兩種for循環(huán)介紹

    Java中的兩種for循環(huán)介紹

    在學(xué)習(xí)Hibernate的時候?qū)W習(xí)一種在Java當(dāng)中的for循環(huán),估計是以前學(xué)習(xí)的時候沒有記住,忘記了在這里再寫下筆記
    2012-10-10
  • java實現(xiàn)的AES秘鑰生成算法示例

    java實現(xiàn)的AES秘鑰生成算法示例

    這篇文章主要介紹了java實現(xiàn)的AES秘鑰生成算法,結(jié)合實例形式分析了AES秘鑰生成算法原理與實現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • SpringMVC中RequestBody注解的List參數(shù)傳遞方式

    SpringMVC中RequestBody注解的List參數(shù)傳遞方式

    這篇文章主要介紹了SpringMVC中RequestBody注解的List參數(shù)傳遞方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • springcloud檢索中間件?ElasticSearch?分布式場景的使用

    springcloud檢索中間件?ElasticSearch?分布式場景的使用

    單機的elasticsearch做數(shù)據(jù)存儲,必然面臨兩個問題:海量數(shù)據(jù)存儲問題、單點故障問題,本文重點給大家介紹springcloud檢索中間件?ElasticSearch?分布式場景的運用,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Redis工具類封裝RedisUtils的使用示例

    Redis工具類封裝RedisUtils的使用示例

    本文主要介紹了Redis工具類封裝RedisUtils的使用示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring注解開發(fā)@Bean和@ComponentScan使用案例

    Spring注解開發(fā)@Bean和@ComponentScan使用案例

    這篇文章主要介紹了Spring注解開發(fā)@Bean和@ComponentScan使用案例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論