用Go语言加载和存储

时间:2016-10-26 02:58:31

标签: serialization go marshalling

我是Go的新手,想知道是否有办法在Go中加载和存储预先计算的变量,就像Python中的pickle一样。
我的代码是从一些数据创建一个地图和一个数组,每次代码运行时我都不想花时间计算这些数据。
我想在下次运行代码时直接加载该地图和数组 有人可以帮我这个吗?

TIA:)

3 个答案:

答案 0 :(得分:2)

我不知道pickle是如何工作的,如果你想将一个struct转储到文件中,可能你可以使用gob package,看看这个How do I dump the struct into the byte array without reflection?的更多细节。

另外,我找到了一个可以读写Python的pickle https://github.com/hydrogen18/stalecucumber的包。

答案 1 :(得分:0)

计算一次变量并将它们全部保存在文件中,
然后打开该文件并加载它们。
当没有要打开的文件时,这是第一次,所以计算并保存一次 您可以根据需要使用自己的文件格式,也可以使用standard library"encoding/json""encoding/gob""encoding/csv""encoding/xml",.... / p>

这:

data := calcOnce()

读取文件:

rd, err := ioutil.ReadFile(once)

如果没有错误加载所有变量,否则计算并保存一次。

这是工作代码:

1-使用"encoding/json",在The Go Playground上尝试:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type Data struct {
    A [2]int
    B map[int]string
}

func main() {
    data := calcOnce()

    fmt.Println(data) // {[101 102] map[1:Hello  2:World.]}
}

func calcOnce() Data {
    const once = "date.json"
    rd, err := ioutil.ReadFile(once)
    if err != nil {
        //calc and save once:
        data := Data{[2]int{101, 102}, map[int]string{1: "Hello ", 2: "World."}}
        buf, err := json.Marshal(data)
        if err != nil {
            panic(err)
        }
        //fmt.Println(string(buf))
        err = ioutil.WriteFile(once, buf, 0666)
        if err != nil {
            panic(err)
        }
        return data
    }
    var d *Data
    err = json.Unmarshal(rd, &d)
    if err != nil {
        panic(err)
    }
    return *d
}

2-使用"encoding/gob",在The Go Playground上尝试:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "io/ioutil"
)

type Data struct {
    A [2]int
    B map[int]string
}

func main() {
    data := calcOnce()

    fmt.Println(data) // {[1010 102] map[2:World. 1:Hello ]}
}

func calcOnce() Data {
    const once = "date.bin"
    rd, err := ioutil.ReadFile(once)
    if err != nil {
        //calc and save once:
        data := Data{[2]int{101, 102}, map[int]string{1: "Hello ", 2: "World."}}
        buf := &bytes.Buffer{}
        err = gob.NewEncoder(buf).Encode(data)
        if err != nil {
            panic(err)
        }
        err = ioutil.WriteFile(once, buf.Bytes(), 0666)
        if err != nil {
            panic(err)
        }
        return data
    }
    var d Data
    err = gob.NewDecoder(bytes.NewReader(rd)).Decode(&d)
    if err != nil {
        panic(err)
    }
    return d
}

3- for protobuf参见:Efficient Go serialization of struct to disk

答案 2 :(得分:-1)

也许gob包最接近: https://golang.org/pkg/encoding/gob/