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