Вычислить переменные и сохранить их все сразу в файл,
затем открыть этот файл и загрузить их все.
Когда нет открытого файла, это первый раз, поэтому рассчитывайте и сохраняйте его один раз.
Вы можете использовать свой собственный формат файла, если вы хотите, или использовать standard library, как "encoding/json"
, "encoding/gob"
, "encoding/csv"
, "encoding/xml"
, ....
Это:
data := calcOnce()
читает файл:
rd, err := ioutil.ReadFile(once)
и, если нет ошибки, загружает все переменные, otherwis e вычисляет и сохраняет их один раз.
Вот рабочий код:
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- для протобуфа см .: Efficient Go serialization of struct to disk
Слишком короткий для ответа: https://godoc.org/encoding/gob. См. Также: http://stackoverflow.com/questions/38129076/is-it-possible-to-pickle-instances-of-structs-in-golang –