2016-10-26 3 views
0

Я новичок в Go и задавался вопросом, есть ли способ загрузить и сохранить предварительно вычисленные переменные в Go, как pickle в Python.
Мой код создает карту и массив из некоторых данных, и я не хочу тратить время на их вычисление при каждом запуске кода.
Я хочу загрузить эту карту и массив сразу после запуска кода.
Может кто-нибудь мне помочь?Загрузить и сохранить в Go Язык

ТИА :)

+1

Слишком короткий для ответа: https://godoc.org/encoding/gob. См. Также: http://stackoverflow.com/questions/38129076/is-it-possible-to-pickle-instances-of-structs-in-golang –

ответ

2

Я не знаю о том, как рассол работы, если вы хотите сбросить в файл-структуру, может быть, вы можете использовать gob package, получить более подробную информацию по этому How do I dump the struct into the byte array without reflection?.

также , Я нашел пакет, который может читать и писать Python's pickle https://github.com/hydrogen18/stalecucumber.

0

Вычислить переменные и сохранить их все сразу в файл,
затем открыть этот файл и загрузить их все.
Когда нет открытого файла, это первый раз, поэтому рассчитывайте и сохраняйте его один раз.
Вы можете использовать свой собственный формат файла, если вы хотите, или использовать 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