iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

Protocol Buffers(Protobuf)

Protocol Buffers(Protobuf)是一種輕量、高效且可擴展的數據交換格式,由 Google 開發並開源。
Protocol Buffers

什麼是 Protocol Buffers?

Protobuf 定義了一種接口描述語言(Interface Definition Language,IDL),可以使用這種語言來定義數據結構數據格式。定義完成後,Protobuf 提供了一個代碼生成工具,可以根據這些定義自動生成用於多種編程語言的序列化反序列化代碼。

為什麼使用 Protobuf?

數據交換是一個問題。傳統的文本格式如 JSONXML 雖然易於閱讀和處理,但它們存在一些效率問題。這就是 Protobuf 出現的原因。

  • 高效性:二進制表示非常緊湊,佔用很少的存儲空間。相對於 JSON 或 XML,它更節省帶寬,並且序列化和反序列化的速度更快。

  • 可讀性:定義文件是可讀的,可以使用版本控制工具進行跟蹤和管理。也可以通過 Proto 定義文件來自動生成代碼,使得 Protobuf 非常易於使用。

  • 可擴展性:在不影響現有數據結構的情況下,添加新字段或更改現有字段的規範。這對於應對數據模式的變化非常有用。

  • 多語言支持:提供多種語言的原生支持,包括 Golang、Java、C++、Python 等,這使不同語言的應用程序能夠相互通信。

在 Golang 中使用 Protobuf

Golang 的 Protobuf 由兩個部分組成

  1. .proto 文件:用於定義數據的結構
    這個 .proto 文件定義了一個 Person 消息,它包含兩個字段:name 和 age。name 字段是字符串,age 字段是整數。
syntax = "proto3";

package example;

message Person {
  string name = 1;
  int32 age = 2;
}
  1. Go 程式碼:用於生成 Go 語言的代碼來序列化和反序列化數據。
protoc --go_out=. person.proto
package main

import (
  "fmt"
  "github.com/golang/protobuf/proto"
)

type Person struct {
  Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
  Age int32 `protobuf:"varint,2,opt,name=age" json:"age,omitempty"`
}

func main() {
  person := &Person{
    Name: "John Doe",
    Age: 30,
  }

  // 序列化數據
  data, err := proto.Marshal(person)
  if err != nil {
    fmt.Println(err)
    return
  }

  // 反序列化數據
  newPerson := &Person{}
  err = proto.Unmarshal(data, newPerson)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Println(newPerson)
}

碎語

在 Golang 中,可以輕鬆使用 Protobuf,只需定義 Proto 文件,編譯然後在程式碼中使用生成的程式碼。這使得數據交換變得更加簡單且高效,並有助於減少帶寬和存儲的使用。


上一篇
17 | 簡化分散式系統
下一篇
19 | 即時通信
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言