ホーム プログラミング言語 golang go file processing Go言語はデータ転送にGobを使用します






Go言語はデータ転送にGobを使用します




 
 
データ構造をネットワーク経由で送信したり、ファイルに保存したりするには、データ構造をエンコードしてからデコードする必要があります。もちろん、 JSON 、 XML 、Google のプロトコル バッファなど、すでに多くのエンコード方法が利用可能です。そして今、Go 言語エンコーディング/gob パッケージによって提供される別の方法があります。

 

Gob は、プログラム データをバイナリ形式でシリアル化および逆シリアル化するための Go 言語独自の形式であり、エンコード パッケージに含まれています。この形式のデータは Gob (Go binary の略) と呼ばれます。 Pythonの「ピクル」やJavaの「シリアル化」に似ています。

Gob は JSON のパックと同じで、送信者は Encoder を使用してデータ構造をエンコードします。受信側はメッセージを受信した後、Decoder を使用してシリアル化されたデータをローカル変数に変更します。

Go 言語は、JSON または Gob を通じて構造体オブジェクトをシリアル化できます。JSON シリアル化の方が一般的ですが、Gob エンコーディングを使用すると、JSON がサポートできない構造体メソッドのシリアル化を実現できます。また、Gob パッケージを使用して構造体をシリアル化し、ローカルに保存することも非常に簡単です。単純。

Gob は外部で定義可能な言語中立のエンコーディングではなく、JSON や XML などのテキスト形式よりもバイナリ形式を好みます。 Gob は Go とは異なる言語ではありませんが、エンコードおよびデコードのプロセスでは Go のリフレクションが使用されます。

Gob は、アプリケーションとマシン間のデータ転送だけでなく、パラメータやリモート メソッド呼び出しの結果の転送にもよく使用されます。 JSON や XML とどう違うのですか? Gob 固有は、Go 言語で記述された 2 つのサービス間の通信など、純粋な Go 環境で使用されます。このようにして、サービスをより効率的かつ最適に実装できます。

Gob ファイルまたはストリームは完全に自己記述的で、それに含まれるすべての型には対応する説明があり、ファイルの内容を知らなくても Go 言語でデコードできます。

エクスポート可能なフィールドのみがエンコードされ、ゼロ値は無視されます。構造体をデコードするときは、名前が一致し、互換性のある型を持つフィールドのみがデコードされます。ソース データ型が新しいフィールドを追加した場合でも、Gob デコード クライアントはこの方法で通常どおり動作できます。デコード クライアントは引き続き既存のフィールドを認識し、具体的な Go タイプを無視して、送信者の観点からは固定長のない可変長として整数がエンコードされるなど、多くの柔軟性も提供します。

次のような構造体 T があるとします。

type T struct { X, Y, Z int }
var t = T{X: 7, Y: 0, Z: 8}

受信時には、構造体 U タイプの変数 u を使用してこの値を受信できます。

type U struct { X, Y *int8 }
var u U

受信時、X の値は 7、Y の値は 0 (Y の値はゼロ値であるため t から渡されません) JSON が使用されるのと同じ方法で、Gob は一般的な io を使用します。 NewEncoder() 関数を介した .Writer インターフェイス。Encoder オブジェクトを作成し、Encode() を呼び出します。反対のプロセスは、共通の io.Reader インターフェイスを使用して、NewDecoder() 関数を介して Decoder オブジェクトを作成し、Decode を呼び出します。

gobファイルを作成する

以下は、Go 言語が gob ファイルを作成する方法を示す簡単なサンプル プログラムです。コードは次のとおりです。

package main

import (
    "encoding/gob"
    "fmt"
    "os"
)

func main() {
    info := map[string]string{
        "name":    "IT基礎",
        "website": "https://it-kiso.com/golang/",
    }
    name := "demo.gob"
    file, _ := os.OpenFile(name, os.O_RDWR|os.O_CREATE, 0777)
    defer file.Close()
    enc := gob.NewEncoder(file)
    if err := enc.Encode(info); err != nil {
        fmt.Println(err)
    }
} 

上記のコードを実行すると、現在のディレクトリにdemo.gobファイルが生成されます。ファイルの内容は次のとおりです。

0eff 8104 0102 ff82 0001 0c01 0c00 0041
ff82 0002 046e 616d 6510 43e8 afad e8a8
80e4 b8ad e696 87e7 bd91 0777 6562 7369
7465 1e68 7474 703a 2f2f 632e 6269 616e
… …

gobファイルを読む

gob ファイルの読み取りは、gob ファイルの作成と同じくらい簡単です。サンプル コードは次のとおりです。

package main

import (
    "encoding/gob"
    "fmt"
    "os"
)

func main() {
    var M map[string]string
    File, _ := os.Open("demo.gob")
    D := gob.NewDecoder(File)
    D.Decode(&M)
    fmt.Println(M)
} 

操作の結果は次のようになります。

go run main.go
map[name:IT基礎 website:https://it-kiso.com/golang/]

 

「 Go言語はデータ転送にGobを使用します」についてわかりやすく解説!絶対に観るべきベスト2動画

【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
【セイト先生】Go言語使う企業が増えてるって本当!?Go言語を使う企業の特徴は??#エンジニア #プログラミング #Go