ホームページ  >  記事  >  バックエンド開発  >  golangゴブとは何ですか

golangゴブとは何ですか

青灯夜游
青灯夜游オリジナル
2023-02-02 17:42:384166ブラウズ

gob は、Golang パッケージに付属するデータ構造シリアル化のためのエンコード/デコード ツールで、エンコードには Encoder、デコードには Decoder が使用されます。 Gob は、io.Writer インターフェイスを使用して、NewEncoder() 関数を通じて Encoder オブジェクトを作成し、Encode() メソッドを呼び出してエンコード操作を実装します。io.Reader インターフェイスを使用して、NewDecoder() 関数を通じて Decoder オブジェクトを作成し、呼び出しますDecode() メソッドを使用してデコード操作を完了します。

golangゴブとは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

gob の正式名は次のとおりです: Go binary

Golang にはデータ構造シリアル化エンコード/デコード ツール が付属しています。つまり、gob は話すことができます。 Go のデータ構造は何かにシリアル化されますが、逆シリアル化することもできます。シリアル化がどのようなものになるかについては後ほど説明しますが、文字列に変換されるかバイナリ ストリームに変換されるかは関係ありません。いずれにせよ、機能はシリアル化です。

Gob を使用する場合、Encoder オブジェクトと Decoder オブジェクトに注意する必要があります。名前のとおり、1 つはエンコード時に使用され、もう 1 つはデコード時に使用されます。この 2 つのオブジェクトを取得する方法を見てみましょう。

golangゴブとは何ですか

golangゴブとは何ですか

## したがって、Encoder オブジェクトと Decoder オブジェクトを取得するには、これら 2 つの関数を呼び出す必要があることは明らかです。ここでのパラメータは io.Writer および io.Reader インターフェイス タイプであることに注意してください。これら 2 つのインターフェイスは前の講義で紹介したため、ここで必要なパラメータはそれぞれ io.Writer および io.Reader インターフェイス タイプを実装するオブジェクトです。

エンコーダとデコーダにはそれぞれ 1 つのメイン メソッドがあります:

golangゴブとは何ですか

golangゴブとは何ですか

ここを見ると、すでに次の結論が得られます :

Gob は io.Writer インターフェイスを使用し、NewEncoder() 関数を通じて Encoder オブジェクトを作成し、Encode() メソッドを呼び出してエンコード操作を実装します; io.Reader インターフェイスを使用して Decoder を作成しますNewDecoder() 関数を通じてオブジェクトを取得し、Decode() メソッドを呼び出してデコード操作を完了します。

次に、この Encoder と Decoder を使用して gob を簡単に始めてみましょう。最初の例を見てみましょう

例 1: データ構造とバイト。( 間のバッファ変換)

 1package main
 2
 3import (
 4    "bytes"
 5    "fmt"
 6    "encoding/gob"
 7    "io"
 8)
 9
10//准备编码的数据
11type P struct {
12    X, Y, Z int
13    Name    string
14}
15
16//接收解码结果的结构
17type Q struct {
18    X, Y *int32
19    Name string
20}
21
22func main() {
23    //初始化一个数据
24    data := P{3, 4, 5, "CloudGeek"}
25    //编码后得到buf字节切片
26    buf := encode(data)
27    //用于接收解码数据
28    var q *Q
29    //解码操作
30    q = decode(buf)
31    //"CloudGeek": {3,4}
32    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
33
34}
35
36func encode(data interface{}) *bytes.Buffer {
37    //Buffer类型实现了io.Writer接口
38    var buf bytes.Buffer
39    //得到编码器
40    enc := gob.NewEncoder(&buf)
41    //调用编码器的Encode方法来编码数据data
42    enc.Encode(data)
43    //编码后的结果放在buf中
44    return &buf
45}
46
47func decode(data interface{}) *Q {
48    d := data.(io.Reader)
49    //获取一个解码器,参数需要实现io.Reader接口
50    dec := gob.NewDecoder(d)
51    var q Q
52    //调用解码器的Decode方法将数据解码,用Q类型的q来接收
53    dec.Decode(&q)
54    return &q
55}

例 2: ファイルへのデータ構造のシリアル化と逆シリアル化

 1package main
 2
 3import (
 4    "encoding/gob"
 5    "os"
 6    "fmt"
 7)
 8
 9//试验用的数据类型
10type Address struct {
11    City    string
12    Country string
13}
14
15//序列化后数据存放的路径
16var filePath string
17
18func main() {
19    filePath = "./address.gob"
20    encode()
21    pa := decode()
22    fmt.Println(*pa) //{Chengdu China}
23}
24
25//将数据序列号后写到文件中
26func encode() {
27    pa := &Address{"Chengdu", "China"}
28    //打开文件,不存在的时候新建
29    file, _ := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)
30    defer file.Close()
31
32    //encode后写到这个文件中
33    enc := gob.NewEncoder(file)
34    enc.Encode(pa)
35}
36
37//从文件中读取数据并反序列化
38func decode() *Address {
39    file, _ := os.Open(filePath)
40    defer file.Close()
41
42    var pa Address
43    //decode操作
44    dec := gob.NewDecoder(file)
45    dec.Decode(&pa)
46    return &pa
47}
上記 2 つの例のいずれでもない 難しいので、エラー処理とデシリアライズを削除しました。これら 2 つの例を辛抱強く読めば、gob のエンコードとデコードの本質を理解できるはずです。

gob とは何かを理解した上で、開発に gob を使用する必要がある場合は、公式ドキュメントを詳しく読んで詳細を学ぶことをお勧めします: https://golang.org/pkg/encoding/gob /

【関連する推奨事項:

Go ビデオ チュートリアル プログラミング教育 ]

以上がgolangゴブとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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