Go 言語のプロトコル バッファーとエンコードおよびデコード技術

WBOY
リリース: 2023-06-01 09:22:53
オリジナル
1471 人が閲覧しました

Go 言語は、一般的な静的型付けプログラミング言語であり、特に高性能で同時実行性の高いネットワーク アプリケーション開発に適しています。 Web アプリケーションでは、異なるシステム間で情報を何らかの形式で交換する必要があるため、データのシリアル化と逆シリアル化は非常に重要です。

Go 言語は、プロトコル バッファーと呼ばれる軽量のデータ交換形式を提供します。これは Google によって開発され、分散システムでのデータ交換に広く使用されています。プロトコル バッファは、言語やプラットフォームに依存しないバイナリ データ形式であり、データ転送の効率を大幅に向上させ、開発者の作業負荷を軽減できます。

この記事では、読者がこの機能をよりよく理解し、ネットワーク アプリケーション開発を簡素化するためにこの機能を使用できるように、Go 言語でのプロトコル バッファーとエンコードおよびデコード技術について説明します。

プロトコル バッファ

プロトコル バッファは、シンプルなインターフェイスを使用してデータ構造を記述し、エンコードを通じてデータをバイナリ形式にシリアル化する軽量のデータ交換形式です。プロトコル バッファは、ネットワーク アプリケーションで異なるシステム間でデータを交換するためによく使用されます。その主な利点は次のとおりです。

  • 言語に依存しない: プロトコル バッファーは複数のプログラミング言語をサポートし、その説明ファイルはテキスト形式で表されます。
  • コンパクトさ: プロトコル バッファーのエンコードは非常にコンパクトなので、データ送信中のネットワーク帯域幅の使用を大幅に削減できます。
  • 拡張性: プロトコル バッファーは、既存の解析コードに影響を与えることなくデータ構造の変更をサポートします。

次に、プロトコル バッファーを使用する簡単な例を示します。

プロトコル バッファー形式ファイルを定義する

プロトコル バッファー形式ファイルは、.proto で表されます。ファイル拡張子のテキスト ファイル表現。たとえば、次の .proto ファイルは、Name という名前の文字列フィールドと Age という名前の整数フィールドを含む単純なメッセージを定義します。

syntax = "proto3";

message Person {
  string Name = 1;
  int32 Age = 2;
}
ログイン後にコピー

プロトコル バッファー フォーマット ファイルを定義することで、プロトコル バッファー フォーマット ファイルの構造とタイプを記述することができます。データを取得し、データをシリアル化および逆シリアル化するためのコードを生成します。

Go 言語コードの生成

.proto ファイルを定義した後、protoc ツールを使用してそれを Go 言語コードにコンパイルする必要があります。まず、protoc ツールをインストールする必要があります:

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip
$ unzip protoc-3.15.8-linux-x86_64.zip -d protoc3
$ sudo mv protoc3/bin/* /usr/local/bin/
$ sudo mv protoc3/include/* /usr/local/include/
ログイン後にコピー

次に、次のコマンドを使用して Go 言語コードを生成できます:

$ protoc --go_out=. person.proto
ログイン後にコピー

生成された Go 言語コードは次のとおりです:

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: person.proto

package main

import (
  "fmt"
  "proto"
  "bufio"
  "os"
)

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

  // Encode to binary format
  data, err := proto.Marshal(person)
  if err != nil {
    fmt.Println("Error:", err)
  }

  // Decode from binary format
  newPerson := &proto.Person{}
  err = proto.Unmarshal(data, newPerson)
  if err != nil {
    fmt.Println("Error:", err)
  }

  fmt.Println("Name:", newPerson.Name)
  fmt.Println("Age:", newPerson.Age)
}
ログイン後にコピー

In 上記の例では、最初に Person 構造体オブジェクトを作成し、そのフィールドに値を入力します。次に、オブジェクトをバイナリ形式にシリアル化し、データ変数に保存します。最後に、それを新しい Person 構造体オブジェクトに逆シリアル化し、出力します。

コーディングとデコーディングのスキル

プロトコル バッファーを使用する場合、この機能をより適切に使用するには、いくつかの基本的なコーディングとデコーディングのスキルを習得する必要があります。エンコードとデコードのヒントを以下に示します。

  1. 形式の変換

メッセージをバイナリ形式にシリアル化する前に、一部のフィールドを別の形式に変換する必要がある場合があります。たとえば、文字列をバイト配列に変換し、数値を固定長文字列に変換する必要がある場合があります。バイナリ形式に変換した後、同じ手法を使用して元の形式に復元できます。

  1. 複数のメッセージ

プロトコル バッファーは、複数のメッセージを同じバイナリ配列にシリアル化することをサポートしています。これは通常、複数のソケットを作成するオーバーヘッドを回避するために複数のメッセージを送信するために使用されます。デコードするときは、バイナリ配列全体を反復して複数のメッセージに分割する必要があります。

  1. オプション フィールド

プロトコル バッファは、特定のフィールドをオプションとしてマークすることをサポートしています。これらのフィールドは存在しない可能性があります。フィールドが存在しない場合は、代わりにデフォルト値が使用されます。コーディング中に、各オプションのフィールドが存在するかどうかを確認し、存在する場合のみバイナリ配列にシリアル化する必要があります。デコードするときは、各フィールドが存在するものとしてマークされているかどうかを確認し、存在する場合のみメッセージ オブジェクトに復元する必要があります。

結論

この記事では、Go 言語のプロトコル バッファーとエンコードおよびデコード技術を紹介しました。プロトコル バッファを使用すると、異なるシステム間でデータをより簡単に交換できるようになり、ネットワーク アプリケーションのパフォーマンスと効率が大幅に向上します。また、実際のアプリケーションでプロトコル バッファーをより適切に使用するのに役立つ、いくつかの基本的なエンコードおよびデコード技術も紹介しました。この記事を通じて読者がプロトコル バッファーとエンコードおよびデコード技術についてより深く理解し、これらの技術を使用してより効率的で信頼性の高いネットワーク アプリケーションを開発できるようになることを願っています。

以上がGo 言語のプロトコル バッファーとエンコードおよびデコード技術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート