Serialization 用Go语言加载和存储

Serialization 用Go语言加载和存储,serialization,go,marshalling,Serialization,Go,Marshalling,我是新手,想知道是否有办法在Python中的Go-like pickle中加载和存储预计算的变量。 我的代码正在从一些数据创建一个映射和一个数组,我不想每次代码运行时都花时间计算这些数据。 我想在下次运行代码时直接加载该映射和数组。 有人能帮我吗 TIA:)我不知道pickle是如何工作的,如果您想将结构转储到文件中,可能您可以使用,请参阅更多详细信息 此外,我还发现了一个可以读写Python pickle的包。也许gob包是最接近的: 计算变量一次,然后将它们全部保存在一个文件中, 然后打开该

我是新手,想知道是否有办法在Python中的Go-like pickle中加载和存储预计算的变量。
我的代码正在从一些数据创建一个映射和一个数组,我不想每次代码运行时都花时间计算这些数据。
我想在下次运行代码时直接加载该映射和数组。
有人能帮我吗


TIA:)

我不知道pickle是如何工作的,如果您想将结构转储到文件中,可能您可以使用,请参阅更多详细信息


此外,我还发现了一个可以读写Python pickle的包。

也许gob包是最接近的:

计算变量一次,然后将它们全部保存在一个文件中,
然后打开该文件并全部加载。
没有要打开的文件时,这是第一次,请计算并保存一次。
如果您喜欢,您可以使用自己的文件格式,或者使用,比如


这:

data := calcOnce()
读取文件:

rd, err := ioutil.ReadFile(once)
如果没有错误,则加载所有变量,否则计算并保存一次

以下是工作代码:

1-使用
“encoding/json”
,在以下设备上试用:


2-使用
“encoding/gob”
,试穿:


3-有关协议,请参见:

太短,无法回答:。另见:
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
}
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
}