2016-10-26 11 views
0

私は新しいです。PythonでpickleのようにGoで事前計算された変数をロードして保存する方法があるのだろうかと思っていました。
私のコードは、いくつかのデータからマップと配列を作成しています。コードを実行するたびに、それらの計算に時間を費やしたくありません。
コードを実行する次回にマップと配列を直接ロードしたいです。
誰か助けてもらえますか?Go言語での読み込みと保存

TIA :)あなたがファイルに構造体をダンプしたい場合、私は、どのように漬物仕事のことは知らない

+1

回答が短すぎる:https://godoc.org/encoding/gob。参照:http://stackoverflow.com/questions/38129076/is-it-possible-to-pickle-instances-of-structs-in-golang –

答えて

0

は、そのファイルを開いて、それらすべてをロード後、一度あなたの変数を計算し、一度ファイルにそれらをすべて保存し、

開くファイルがない場合は初めてですので、一度計算して保存してください。
あなたは、"encoding/json""encoding/gob""encoding/csv""encoding/xml"のように、あなたが好きな場合は、独自のファイル形式を使用するか、またはstandard libraryを使用することができます....


この:

data := calcOnce() 

がファイル読み取ります。

rd, err := ioutil.ReadFile(once) 

エラーがなければ、すべての変数がロードされます。otherwis eはそれらを1回計算して保存します。ここで

は、作業コードです:

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

関連する問題