国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Go with Protobuf

這篇具有很好參考價值的文章主要介紹了Go with Protobuf。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原文在這里。

本教程為 Go 程序員提供了使用Protocol buffer的基本介紹。

本教程使用proto3向 Go 程序員介紹如何使用 protobuf。通過創(chuàng)建一個簡單的示例應(yīng)用程序,它向你展示了如何:

  • .proto中定義消息格式
  • 使用protocol buffer編譯器
  • 使用Go protocol buffer API讀寫消息

這并不是protocol buffer在Go中使用的完整指南。更多細節(jié),詳見Protocol Buffer Language Guide、Go API Reference、Go Generated Code Guide和Encoding Reference。

為什么使用Protocol Buffer

我們要使用的例子是一個非常簡單的“通訊錄”應(yīng)用程序,它可以從文件中讀寫聯(lián)系人的信息。通訊錄中每個人都有一個姓名、ID、郵箱和練習(xí)電話。

你如何序列化并取回這樣結(jié)構(gòu)化的數(shù)據(jù)呢?下面有幾條建議:

  • 原始內(nèi)存中數(shù)據(jù)結(jié)構(gòu)可以發(fā)送/保存為二進制。這是一種隨時間推移而變得脆弱的方法,因為接收/讀寫的代碼必須編譯成相同的內(nèi)存布局,endianness等。另外,文件已原始格式積累數(shù)據(jù)和在網(wǎng)絡(luò)中到處傳輸副本,因此擴展這種格式十分困難。
  • 你可以編寫已臨時的方法來講數(shù)據(jù)元素編碼到單個字符串中 --- 例如用“12:3:-23:67”來編碼4個int。這是一種簡單而靈活的方法,盡管它確實需要編寫一次性的編碼和解析代碼,并且解析會增加少量的運行時成本。這對于編碼非常簡單的數(shù)據(jù)最有效。
  • 序列化為XML。這種方法非常有吸引力,因為XML(某種程度上)是人類可讀的,而且有許多語言的綁定庫。如果你希望與其他應(yīng)用程序/項目共享數(shù)據(jù),這可能是一個不錯的選擇。然而,XML是出了名的空間密集型,對它進行編碼/解碼會給應(yīng)用程序帶來巨大的性能損失。而且,在XML DOM樹中導(dǎo)航要比在類中導(dǎo)航簡單字段復(fù)雜得多。

Protocol buffers是解決這個問題的靈活、高效、自動化的解決方案。使用Protocol buffers,你編寫一個描述要存儲的數(shù)據(jù)結(jié)構(gòu)的.proto文件。然后,Protocol buffer編譯器會創(chuàng)建一個類,該類實現(xiàn)了Protocol buffer數(shù)據(jù)的自動編碼和解析,使用高效的二進制格式。生成的類為構(gòu)成Protocol buffer的字段提供了獲取器和設(shè)置器,并處理了讀取和寫入Protocol buffer的細節(jié)。重要的是,Protocol buffer格式支持隨著時間的推移擴展格式的想法,以使代碼仍然能夠讀取使用舊格式編碼的數(shù)據(jù)。

從哪能找到示例代碼呢?

我們的示例是一組用Protocol buffer編碼的命令行應(yīng)用程序,用于管理地址簿數(shù)據(jù)文件。命令add_person_go用于向數(shù)據(jù)文件添加新條目。命令list_people_go解析數(shù)據(jù)文件并將數(shù)據(jù)打印到控制臺。

你可以從這里下載。

定義Protocol文件

通訊錄程序從定義.proto文件開始。.proto文件中的定義很簡單:為要序列化的每個數(shù)據(jù)結(jié)構(gòu)添加一個message,然后為消息中的每個字段指定名稱和類型。在我們的示例中,定義消息的.proto文件是addressbook.proto。

.proto文件以一個包聲明開頭,這有助于防止不同項目之間的命名沖突。

syntax = "proto3";
package tutorial;

import "google/protobuf/timestamp.proto";

go_package選項定義了包含此文件中所有生成代碼的包的導(dǎo)入路徑。 Go包名稱將是導(dǎo)入路徑的最后一個路徑組件。例如,我們的示例將使用“tutorialpb”作為包名稱。

option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

接下來,需要定義message。消息只是一個包含一組類型化字段的聚合。許多標(biāo)準(zhǔn)簡單數(shù)據(jù)類型都可用作字段類型,包括boolint32、float、doublestring。你也可以通過使用其他消息類型作為字段類型來為消息添加更多結(jié)構(gòu)。

message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;

  enum PhoneType {
    PHONE_TYPE_UNSPECIFIED = 0;
    PHONE_TYPE_MOBILE = 1;
    PHONE_TYPE_HOME = 2;
    PHONE_TYPE_WORK = 3;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;

  google.protobuf.Timestamp last_updated = 5;
}

// Our address book file is just one of these.
message AddressBook {
  repeated Person people = 1;
}

在上面例子中,Person消息包含PhoneNumber消息,同時Person消息包含在AddressBook消息中。你甚至可以定義消息類型嵌套在其它消息中 --- 就像上面PhoneNumber定義在Person中。你也可以定義enum類型,如果你想讓你的字段只是用預(yù)定義列表中的一個值 --- 這里你想聲明的電話類型可以是MOBILE、HOMEWORK其中之一。

“= 1”,“= 2”標(biāo)記每個字段在二進制編碼中的唯一的“tag”。序號1-15編碼的字節(jié)數(shù)比較高的數(shù)字少一位,因此,作為一種優(yōu)化,你可以決定對常用或重復(fù)的元素使用這些標(biāo)記,而對不常用的可選元素使用標(biāo)記16或更高。重復(fù)字段中的每個元素都需要重新編碼標(biāo)記號,因此重復(fù)字段是此優(yōu)化的特別好的候選項。

如果未設(shè)置字段值,則會使用默認(rèn)值:對于數(shù)字類型,使用零;對于字符串,使用空字符串;對于布爾值,使用false。對于嵌套的消息,默認(rèn)值始終是消息的“默認(rèn)實例”或“原型”,該實例沒有任何字段設(shè)置。調(diào)用訪問器以獲取未明確設(shè)置的字段的值始終返回該字段的默認(rèn)值。

如果字段是repeated的,那么該字段可以重復(fù)任意次數(shù)(包括零次)。重復(fù)值的順序?qū)⒂蓀rotocol buffer處理??梢詫⒅貜?fù)字段視為動態(tài)大小的數(shù)組。

你可以在Protocol Buffer語言指南中找到撰寫.proto文件的完整指南,包括所有可能的字段類型。但不要尋找類繼承類似的功能 - 因為protocol buffer不支持這一點。

編譯Protocol Buffers

現(xiàn)在你已經(jīng)有.proto文件了,接下來你需要生成讀寫AddressBook(包括PersonPhoneNumber)消息的類。現(xiàn)在,你需要運行protocol buffer編譯器protoc

  • 如果你還沒安裝編譯器,可從這里下載并根據(jù)README編譯安裝。
  • 使用如下命令按照Go protocol buffers插件:
    $ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    
    protoc-gen-go編譯器插件將安裝在$GOBIN中,默認(rèn)為$GOPATH/bin。protocol buffer編譯器protoc必須能夠在你的$PATH中找到它。
  • 現(xiàn)在運行編譯器,指明源目錄(應(yīng)用程序源文件目錄,不指定的話默認(rèn)使用當(dāng)前目錄),目標(biāo)路徑(你要存放生成的代碼的目錄,通常與$SRC_DIR一樣),.proto文件路徑。這樣,你可以:
    $ protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook.proto
    
    因為要生成Go代碼,所以使用--go_out選項。若要生成其它支持的語言,提供類似選項即可。
    生成的github.com/protocolbuffers/protobuf/examples/go/tutorialpb/addressbook.pb.go文件將保存在你指定的目錄下。

Protocol Buffer API

生成的addressbook.pb.go為你提供了下面這些有用的類型:

  • 包含People字段的AddressBook結(jié)構(gòu)體
  • 包含NameId、EmailPhones字段的People
  • 包含NumberType字段的Person_PhoneNumber
  • 自定義枚舉類型的Person.PhoneType

你可以在Go 生成的代碼指南中詳細了解生成的代碼的細節(jié),但在大多數(shù)情況下,你可以將這些代碼視為完全普通的 Go 類型。

以下是list_people命令的單元測試示例,演示了如何創(chuàng)建一個Person實例:

p := pb.Person{
    Id:    1234,
    Name:  "John Doe",
    Email: "jdoe@example.com",
    Phones: []*pb.Person_PhoneNumber{
        {Number: "555-4321", Type: pb.Person_PHONE_TYPE_HOME},
    },
}

創(chuàng)建Message

使用protocol buffers的目的是將數(shù)據(jù)序列化,以便在其他地方進行解析。在 Go 中,你可以使用proto庫的Marshal函數(shù)來序列化你的protocol buffers數(shù)據(jù)。protocol buffers消息的結(jié)構(gòu)體指針實現(xiàn)了proto.Message接口。調(diào)用proto.Marshal返回編碼后的protocol buffers數(shù)據(jù)。例如,我們在add_person命令中使用了這個函數(shù):

book := &pb.AddressBook{}
// ...

// Write the new address book back to disk.
out, err := proto.Marshal(book)
if err != nil {
    log.Fatalln("Failed to encode address book:", err)
}
if err := ioutil.WriteFile(fname, out, 0644); err != nil {
    log.Fatalln("Failed to write address book:", err)
}

讀取Message

要解析已編碼的消息,可以使用proto庫的Unmarshal函數(shù)。調(diào)用此函數(shù)將數(shù)據(jù)解析為protocol buffers,并將結(jié)果放book中。因此,要在list_people命令中解析文件,我們使用以下代碼:

// Read the existing address book.
in, err := ioutil.ReadFile(fname)
if err != nil {
    log.Fatalln("Error reading file:", err)
}
book := &pb.AddressBook{}
if err := proto.Unmarshal(in, book); err != nil {
    log.Fatalln("Failed to parse address book:", err)
}

擴展

在發(fā)布protocol buffer生成的代碼后不久,你肯定會想提升你的protocol buffer定義。如果你想新的buffer可以被后向兼容,并且舊的buffer可以被前向兼容,--- 你確實想這樣做 --- 那你需要遵守下面的規(guī)則。在新版的protocol buffer中:

  • 必須不能改變已有字段的序號。
  • 可以刪除repeated字段。
  • 可以新增repeated字段,但必須使用新的序號(序號在protocol buffer中沒被用過,也沒被刪除)。

還有一些其它的擴展要遵守,但很少會用到它們。

遵循這些規(guī)則,舊代碼將可以輕松地讀取新的消息,并且會忽略任何新字段。對于舊代碼來說,已刪除的單字段將只是它們的默認(rèn)值,而已刪除的重復(fù)字段將為空。新代碼也可以透明地讀取舊消息。

但請記住,舊消息中不會包含新字段,因此你需要合理地處理默認(rèn)值。使用類型特定的默認(rèn)值:對于字符串,默認(rèn)值是空字符串。對于布爾值,默認(rèn)值是false。對于數(shù)值類型,默認(rèn)值是零。


Go with Protobuf

聲明:本作品采用署名-非商業(yè)性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請注明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意文章來源地址http://www.zghlxwxcb.cn/news/detail-710664.html


到了這里,關(guān)于Go with Protobuf的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 小程序入門筆記(一) 黑馬程序員前端微信小程序開發(fā)教程

    小程序入門筆記(一) 黑馬程序員前端微信小程序開發(fā)教程

    微信小程序基本介紹 小程序和普通網(wǎng)頁有以下幾點區(qū)別: 運行環(huán)境:小程序可以在手機的操作系統(tǒng)上直接運行,如微信、支付寶等;而普通網(wǎng)頁需要在瀏覽器中打開才能運行。 開發(fā)技術(shù):小程序采用前端技術(shù)進行開發(fā),如HTML、CSS、JavaScript等;而普通網(wǎng)頁也是使用類似的前

    2024年02月08日
    瀏覽(94)
  • 手機通訊錄--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第5章-課后作業(yè))

    手機通訊錄--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第5章-課后作業(yè))

    通訊錄是記錄了聯(lián)系人姓名和聯(lián)系方式的名錄,手機通訊錄是最常見的通訊錄之一,人們可以在通訊錄中通過姓名查看相關(guān)聯(lián)系人的聯(lián)系方式、郵箱、地址等信息,也可以在其中新增聯(lián)系人,或修改、刪除聯(lián)系人信息。下面是一個常見通訊錄的功能菜單,如圖1所示。 ? 圖1

    2024年02月01日
    瀏覽(89)
  • 銀行管理系統(tǒng)--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第7章-課后作業(yè))

    銀行管理系統(tǒng)--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第7章-課后作業(yè))

    從早期的錢莊到現(xiàn)如今的銀行,金融行業(yè)在不斷地變革;隨著科技的發(fā)展、計算機的普及,計算機技術(shù)在金融行業(yè)得到了廣泛的應(yīng)用。銀行管理系統(tǒng)是一個集開戶、查詢、取款、存款、轉(zhuǎn)賬、鎖定、解鎖、退出等一系列的功能的管理系統(tǒng),該系統(tǒng)中各功能的介紹如下。 開戶功

    2024年02月04日
    瀏覽(95)
  • 逢七拍手游戲--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第3章-課后作業(yè))

    逢7拍手游戲的規(guī)則是:從1開始順序數(shù)數(shù),數(shù)到有7或者包含7的倍數(shù)的時候拍手。本實例要求編寫程序,模擬實現(xiàn)逢七拍手游戲,輸出100以內(nèi)需要拍手的數(shù)字。 掌握for循環(huán)與range()函數(shù)的使用 掌握字符串中find()方法的使用 判斷一個數(shù)字是否與7相關(guān),可分為兩種情況: 1.是否為

    2024年02月06日
    瀏覽(139)
  • 中文數(shù)字對照表--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第4章-課后作業(yè))

    中文數(shù)字對照表--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第4章-課后作業(yè))

    阿拉伯?dāng)?shù)字因其具有簡單易寫、方便使用的特點成為了最流行的數(shù)字書寫方式,但在使用阿拉伯?dāng)?shù)字計數(shù)時,可以對某些數(shù)字不漏痕跡的修改成其它數(shù)字,例如,將數(shù)字“1”修改為數(shù)字“7”,將數(shù)字“3”修改為數(shù)字“8”。為了避免引起不必要的麻煩,可以使用中文大寫數(shù)字

    2024年02月05日
    瀏覽(91)
  • [學(xué)習(xí)筆記]黑馬程序員-Hadoop入門視頻教程

    [學(xué)習(xí)筆記]黑馬程序員-Hadoop入門視頻教程

    黑馬程序員大數(shù)據(jù)Hadoop入門視頻教程,適合零基礎(chǔ)自學(xué)的大數(shù)據(jù)Hadoop教程 學(xué)習(xí)目標(biāo) 1.理解大數(shù)據(jù)基本概念 2.掌握數(shù)據(jù)分析基本步驟 3.理解分布式、集群概念 4.學(xué)會VMware虛擬機的導(dǎo)入與使用 5.掌握Linux常用操作命令使用 6.掌握vi/vim編輯器基礎(chǔ)使用 1.1.1 企業(yè)數(shù)據(jù)分析方向 數(shù)據(jù)分

    2024年02月13日
    瀏覽(24)
  • [黑馬程序員Pandas教程]——Pandas快速體驗

    [黑馬程序員Pandas教程]——Pandas快速體驗

    目錄: 為什么要使用Python做數(shù)據(jù)開發(fā) Python在數(shù)據(jù)開發(fā)領(lǐng)域的優(yōu)勢 為什么要學(xué)習(xí)Pandas 其他常用Python庫介紹 主要內(nèi)容介紹 Anaconda安裝 Anaconda的虛擬環(huán)境管理 虛擬環(huán)境的作用 可以通過Anaconda界面創(chuàng)建虛擬環(huán)境 通過命令行創(chuàng)建虛擬環(huán)境 通過Anaconda管理界面安裝包 也可以通過anac

    2024年02月06日
    瀏覽(16)
  • 圖書管理系統(tǒng)登錄頁面--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第12章-課后作業(yè))

    圖書管理系統(tǒng)登錄頁面--課后程序(Python程序開發(fā)案例教程-黑馬程序員編著-第12章-課后作業(yè))

    登錄與注冊是程序中最基本的模塊。用戶只有登錄成功后,才可以使用應(yīng)用系統(tǒng)中的全部功能。若用戶沒有登錄賬號,可通過注冊界面設(shè)置登錄賬號信息。某圖書管理系統(tǒng)的登錄窗口如圖1所示。 ? 登錄界面 圖1的窗口中包含用戶名、密碼、驗證碼、登錄、注冊、退出。當(dāng)用戶

    2024年02月03日
    瀏覽(86)
  • 日記本-課后程序(JAVA基礎(chǔ)案例教程-黑馬程序員編著-第七章-課后作業(yè))

    日記本-課后程序(JAVA基礎(chǔ)案例教程-黑馬程序員編著-第七章-課后作業(yè))

    【實驗7-3】? 日記本 【任務(wù)介紹】 ? 1. 任務(wù)描述 編寫一個日記本功能的程序,使用字節(jié)流經(jīng)日記的具體信息記錄在本地的txt文件中。當(dāng)用戶輸入日記的特定內(nèi)容后,會將輸入的內(nèi)容保存至本地的txt文件中。需要輸入的內(nèi)容包括“姓名”,“天氣”、“標(biāo)題”、“內(nèi)容”的數(shù)

    2024年02月05日
    瀏覽(143)
  • 學(xué)生管理系統(tǒng)-課后程序(JAVA基礎(chǔ)案例教程-黑馬程序員編著-第六章-課后作業(yè))

    學(xué)生管理系統(tǒng)-課后程序(JAVA基礎(chǔ)案例教程-黑馬程序員編著-第六章-課后作業(yè))

    【案例6-2】 學(xué)生管理系統(tǒng) 【案例介紹】 1.任務(wù)描述 在一所學(xué)校中,對學(xué)生人員流動的管理是很麻煩的,本案例要求編寫一個學(xué)生管理系統(tǒng),實現(xiàn)對學(xué)生信息的添加、刪除、修改和查詢功能。每個功能的具體要求如下: 系統(tǒng)的首頁:用于顯示系統(tǒng)所有的操作,并根據(jù)用戶在控

    2024年02月03日
    瀏覽(101)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包