最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang Protocol Buffer案例詳解

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

Golang Protocol Buffer教程

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

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

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

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

使用json表示占用空間更小:

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

如果使用protocol buffer格式表示:

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

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

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

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

2. 簡(jiǎn)單示例

首先下載必要的依賴(lài):

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

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

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

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

syntax="proto3";

package main;

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

然后在該文件的路徑下運(yùn)行下面命令:

protoc --go_out=. *.proto

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

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序列化對(duì)象
  fmt.Println(data)


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

  // 打印 `newElliot` 對(duì)象進(jìn)行驗(yàn)證
  fmt.Println(newElliot.GetAge())
  fmt.Println(newElliot.GetName())

}

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

go run main.go test.pb.go

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

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

3. 嵌套示例

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

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

syntax="proto3";

package main;

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

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

因?yàn)镻erson 類(lèi)型已經(jīng)被修改了,需要重新運(yùn)行 protoc 命令:

protoc --go_out=. *.proto

現(xiàn)在同時(shí)修改代碼進(jìn)行測(cè)試,填充 elliot 對(duì)象使用 SocialFollowers 類(lèi)型對(duì)象:

package main

import (
    "fmt"
    "log"

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

func main() {

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

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

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

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

運(yùn)行程序輸出結(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • RxJava的消息發(fā)送和線(xiàn)程切換實(shí)現(xiàn)原理

    RxJava的消息發(fā)送和線(xiàn)程切換實(shí)現(xiàn)原理

    這篇文章主要介紹了RxJava的消息發(fā)送和線(xiàn)程切換實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 帶你深入概括Java!六、方法和方法重載?。ㄍ扑])

    帶你深入概括Java!六、方法和方法重載?。ㄍ扑])

    這篇文章主要介紹了Java方法和方法重載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot獲取ApplicationContext的3種方式

    SpringBoot獲取ApplicationContext的3種方式

    這篇文章主要為大家詳細(xì)介紹了SpringBoot獲取ApplicationContext的3種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • SpringCloud?eureka(server)微服務(wù)集群搭建過(guò)程

    SpringCloud?eureka(server)微服務(wù)集群搭建過(guò)程

    這篇文章主要介紹了微服務(wù)SpringCloud-eureka(server)集群搭建,?項(xiàng)目搭建的主要步驟和配置就是創(chuàng)建項(xiàng)目和引入pom依賴(lài),本文通過(guò)圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • springboot動(dòng)態(tài)加載Echarts柱狀圖

    springboot動(dòng)態(tài)加載Echarts柱狀圖

    這篇文章主要為大家詳細(xì)介紹了springboot動(dòng)態(tài)加載Echarts柱狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式

    Java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式

    在實(shí)際開(kāi)發(fā)中,有時(shí)需要在不同平臺(tái)、不同應(yīng)用場(chǎng)景中對(duì)圖片格式進(jìn)行轉(zhuǎn)換,本文主要介紹了如何使用 Java 語(yǔ)言實(shí)現(xiàn)將 PNG 格式的圖片轉(zhuǎn)換為 BMP 格式的圖片,需要的可以了解下
    2025-03-03
  • MyBatis動(dòng)態(tài)SQL實(shí)現(xiàn)配置過(guò)程解析

    MyBatis動(dòng)態(tài)SQL實(shí)現(xiàn)配置過(guò)程解析

    這篇文章主要介紹了MyBatis動(dòng)態(tài)SQL實(shí)現(xiàn)配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java實(shí)現(xiàn)滑塊拼圖驗(yàn)證碼

    Java實(shí)現(xiàn)滑塊拼圖驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)滑塊拼圖驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java?天生就是多線(xiàn)程

    Java?天生就是多線(xiàn)程

    這篇文章主要介紹了Java天生就是多線(xiàn)程,程序天生就是多線(xiàn)程程序,因?yàn)閳?zhí)行main()方法的是一個(gè)名稱(chēng)為main的線(xiàn)程,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • 淺談Spring Bean的基本配置

    淺談Spring Bean的基本配置

    這篇文章主要介紹了淺談Spring Bean的基本配置,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java Spring的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

五寨县| 瑞安市| 河源市| 茌平县| 聂荣县| 怀柔区| 崇明县| 商丘市| 弥勒县| 灵璧县| 温州市| 乳源| 准格尔旗| 房产| 武清区| 邵武市| 嘉兴市| 临桂县| 宁乡县| 阿克陶县| 乌拉特中旗| 上虞市| 鸡泽县| 宝清县| 高平市| 崇礼县| 勃利县| 建宁县| 丹阳市| 建湖县| 彭泽县| 深泽县| 林口县| 通海县| 凤山市| 宁强县| 海兴县| 云和县| 奉贤区| 墨脱县| 临沂市|