2016-07-05 76 views
3

當我嘗試使用gob編碼器將map[mapKey]string類型的映射保存到文件中時,它不會將字符串保存在文件中。無法使用gob正確地在文件中存儲數據

這裏mapKey是struct和map的值是長json字符串。

type mapKey struct{ 
    Id1 string 
    Id2 string 
} 

每當我使用的,而不是像結構嵌套地圖:

var m = make(map[string]map[string]string) 

這是工作的罰款,並適當保存字符串。我不知道我在這裏失去了什麼。

碼編碼,解碼,並將其保存在文件中:

func Save(path string, object interface{}) error { 
    file, err := os.Create(path) 
    if err == nil { 
     encoder := gob.NewEncoder(file) 
     encoder.Encode(object) 
    } 
    file.Close() 
    return err 
} 

// Decode Gob file 
func Load(path string, object interface{}) error { 
    file, err := os.Open(path) 
    if err == nil { 
     decoder := gob.NewDecoder(file) 
     err = decoder.Decode(object) 
    } 
    file.Close() 
    return err 
} 

func Check(e error) { 
    if e != nil { 
     _, file, line, _ := runtime.Caller(1) 
     fmt.Println(line, "\t", file, "\n", e) 
     os.Exit(1) 
    } 
} 
+1

,爲什麼你不使用的嵌套地圖。可能輸入需要作爲嵌套地圖。 –

+0

@SimoEndre:根據https://blog.golang.org/go-maps-in-action博客,如果您有映射的嵌套地圖類型結構,他們建議使用Struct。 但是我是Go的新手,我不確定我是否可以使用該結構。 它沒有給出任何編譯錯誤,但它沒有保存長字符串。 – rohan

回答

4

沒有什麼特殊的編碼map[mapKey]string類型的值。

查看它使用指定的讀取器/寫入器這個非常簡單的工作示例:

func save(w io.Writer, i interface{}) error { 
    return gob.NewEncoder(w).Encode(i) 

} 
func load(r io.Reader, i interface{}) error { 
    return gob.NewDecoder(r).Decode(i) 
} 

測試其與內存中的緩衝液(bytes.Buffer):

m := map[mapKey]string{ 
    {"1", "2"}: "12", 
    {"3", "4"}: "34", 
} 
fmt.Println(m) 

buf := &bytes.Buffer{} 
if err := save(buf, m); err != nil { 
    panic(err) 
} 

var m2 map[mapKey]string 
if err := load(buf, &m2); err != nil { 
    panic(err) 
} 
fmt.Println(m2) 

輸出按預期(嘗試在Go Playground):

map[{1 2}:12 {3 4}:34] 
map[{1 2}:12 {3 4}:34] 

你有工作但知道您必須用指針值調用Load()(否則Decoder.Decode()將無法​​修改其值)。

另外幾件事情,以改善它:

  • 在你的榜樣你吞嚥通過Encoder.Encode()(檢查它,你會看到的問題是什麼返回error;一個常見的問題是使用結構mapKey沒有導出字段,在這種情況下會返回gob: type main.mapKey has no exported fields的錯誤)。
  • 此外,您應該致電File.Close()作爲延期功能。
  • 此外,如果打開文件失敗,您應該早返回,而不應關閉文件。

這是你的代碼的修正版本:

func Save(path string, object interface{}) error { 
    file, err := os.Create(path) 
    if err != nil { 
     return err 
    } 
    defer file.Close() 
    return gob.NewEncoder(file).Encode(object) 
} 

func Load(path string, object interface{}) error { 
    file, err := os.Open(path) 
    if err != nil { 
     return err 
    } 
    defer file.Close() 
    return gob.NewDecoder(file).Decode(object) 
} 

測試它:

m := map[mapKey]string{ 
    {"1", "2"}: "12", 
    {"3", "4"}: "34", 
} 
fmt.Println(m) 

if err := Save("testfile", m); err != nil { 
    panic(err) 
} 

var m2 map[mapKey]string 
if err := Load("testfile", &m2); err != nil { 
    panic(err) 
} 
fmt.Println(m2) 

產量預期:

map[{1 2}:12 {3 4}:34] 
map[{1 2}:12 {3 4}:34] 
+0

會建議檢查您是否使用指針作爲icza在這裏描述 - 其他非常好的建議。 – TehSphinX

相關問題