encoding/gob

下記の内容は以下のバージョンのgoで確認しています。

Note

go1.10.3 linux/amd64

概要

典型的にはgolangの変数をrpcでやり取りするときに使えるらしい。 もしくはPythonのpickleのように、変数をそのままファイルに書き出し、読み込みが可能

人間に読める形式に変換する必要がないようなファイルであれば、gobで出力し書き出した方が楽なので、 用途によっては便利。

Warning

gobを使って読み出せるファイルサイズは1GBまでに制限されている(ファイルの書き出しは制限されていない)

https://golang.org/src/encoding/gob/decoder.go

import

import (
    "encoding/gob"
)

ファイルへの書き込み/読み込み

package main

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

type Person struct {
    Name string
    Age  int
}

func read_data(path string, d *Person) error {
    var err error = nil

    _, err = os.Stat(path)
    if os.IsNotExist(err) {
            fmt.Printf("Not Exist %s.", path)
            return err
    }

    f, err := os.Open(path)
    if err != nil {
            fmt.Printf("Failed to open :%s", path)
            return err
    }
    defer f.Close()

    dec := gob.NewDecoder(f)
    if err := dec.Decode(d); err != nil {
            fmt.Println(err)
            return err
    }

    return err
}

func write_data(path string, d *Person) error {
    f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
            return err
    }
    defer f.Close()

    enc := gob.NewEncoder(f)
    if err := enc.Encode(d); err != nil {
            fmt.Println(err)
            return err
    }

    return nil

}

func main() {
    data_path := "data.gob"
    data_before := Person{Name: "John", Age: 10}
    data_after := Person{Name: "", Age: 0}

    write_data(data_path, &data_before)
    read_data(data_path, &data_after)

    fmt.Printf("before %+v\n", data_before)
    fmt.Printf("after %+v\n", data_after)
}