ホームページ >バックエンド開発 >Golang >Golang 関数の構造型のエンコードおよびデコード手法

Golang 関数の構造型のエンコードおよびデコード手法

王林
王林オリジナル
2023-05-15 23:21:11982ブラウズ

Golang は、プログラマーが効率的なコードを迅速に作成できるように、多くの組み込み型と関数を提供する非常に強力なプログラミング言語です。その中でもストラクチャー型は非常によく使われるタイプです。ネットワーク通信、データの保存と送信などを扱う場合、通常、構造型データをバイナリ データにエンコードするか、JSON 形式の文字列にシリアル化して送信する必要があります。この記事では、Golang 関数の構造タイプのコーディングおよびデコード手法をいくつか紹介します。

  1. 構造型の定義

Golang では、構造型の定義には type キーワードと struct キーワードを使用する必要があります。たとえば、次は 2 つのフィールドを含む Person 構造タイプを定義します: Name と Age:

type Person struct {
    Name string
    Age int
}
  1. JSON エンコードとデコード

JSON は軽量で、簡単に実行できます。読み取りおよび書き込みデータ交換フォーマット。 Golang では、json パッケージの Marshal() 関数と Unmarshal() 関数を使用して、構造型の JSON エンコードとデコードを実装できます。

  • JSON エンコード

エンコードするときは、構造体の型を []byte 型のバイト配列に変換する必要があります。これは、 json.Marshal( ) 関数。たとえば、次の例では、タイプ person のインスタンス p を JSON 形式の文字列にエンコードします。

p := Person{"Tina", 28}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))   // {"Name":"Tina","Age":28}
  • JSON デコード

デコードするときは、JSON を解析する必要があります。文字列を構造体型に変換します。これは、json.Unmarshal() 関数を通じて実現できます。たとえば、次の例では、JSON 文字列 jsonStr を Person タイプのインスタンスにデコードします。

jsonStr := `{"Name":"Tina", "Age": 28}`
var p Person
_ = json.Unmarshal([]byte(jsonStr), &p)
fmt.Println(p)  // {Tina 28}
  1. バイト シーケンスのエンコードとデコード

ネットワーク通信またはデータ ストレージのプロセス中構造体の型をバイト列にシリアル化して送信する必要もあります。たとえば、Person 型インスタンス p をバイト シーケンス byteData にシリアル化するには、次のようにします。

buf := new(bytes.Buffer)
binary.Write(buf, binary.LittleEndian, &p)
byteData := buf.Bytes()
fmt.Printf("%x
", byteData)   // 54696e61001c0000

bytes.Buffer 関数と binary.Write() 関数を使用して、構造型 p をバイト シーケンス byteData にシリアル化します。 binary.Write() 関数の 2 番目のパラメーターはバイト オーダー処理方法を指定します。ここでは LittleEndian 形式が使用されます。

同様に、binary.Read() 関数を使用して、同じ形式で byteData を逆シリアル化することもできます。例:

var q Person
err := binary.Read(bytes.NewReader(byteData), binary.LittleEndian, &q)
if err != nil {
    fmt.Println(err)
}
fmt.Println(q)  // {Tina 28}
  1. Gob エンコードとデコード

Gob は Golang に付属するエンコード形式で、RPC 呼び出しやデータ送信中によく使用されます。 Golang では、Gob エンコードおよびデコード用の gob パッケージも提供されています。

  • Gob エンコーディング

gob.NewEncoder() 関数を使用してエンコーダ インスタンスを作成し、その Encode() メソッドを使用して構造体型をエンコードできます。バイトシーケンス。たとえば、Person 型のインスタンス p をバイト シーケンス byteData にエンコードします。

var byteData bytes.Buffer
enc := gob.NewEncoder(&byteData)
err := enc.Encode(&p)
if err != nil {
    fmt.Println(err)
}
fmt.Printf("%x
", byteData.Bytes())   // 026864073544696e61001c

bytes.Buffer 関数と gob.NewEncoder() 関数を使用して、構造型 p をバイト シーケンス byteData にエンコードします。

  • Gob デコード

デコードするときは、gob パッケージも使用する必要があります。デコーダ インスタンスを作成し、その Decode() メソッドを使用してバイト シーケンスをデコードします。たとえば、上記の例でエンコードされた byteData を person 型のインスタンス q にデコードします:

dec := gob.NewDecoder(&byteData)
var q Person
err := dec.Decode(&q)
if err != nil {
    fmt.Println(err)
}
fmt.Println(q)  // {Tina 28}

summary

構造型は Golang で一般的に使用されるデータ型であり、処理で使用されます。データを保存および送信する場合、多くの場合、構造タイプをバイナリ データにエンコードするか、送信用の文字列にシリアル化する必要があります。この記事では、JSON エンコードとデコード、バイト シーケンスのエンコードとデコード、Gob エンコードとデコードなど、Golang 関数の構造タイプのエンコードとデコードのテクニックをいくつか紹介します。これらの技術は、データ転送とストレージのタスクを迅速かつ効率的に完了するのに役立ちます。

以上がGolang 関数の構造型のエンコードおよびデコード手法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。