File 无法使用gob在文件中正确存储数据

File 无法使用gob在文件中正确存储数据,file,dictionary,go,gob,File,Dictionary,Go,Gob,当我尝试使用gobencoder将类型为map[mapKey]string的映射保存到文件中时,它没有将字符串保存到文件中 这里的mapKey是struct,map值是长json字符串 type mapKey struct{ Id1 string Id2 string } 每当我使用嵌套映射而不是结构时,如: var m = make(map[string]map[string]string) 它工作正常,并正确保存字符串。我不确定我在这里错过了什么 编码、解码并保存在文件中

当我尝试使用
gob
encoder将类型为
map[mapKey]string
的映射保存到文件中时,它没有将字符串保存到文件中

这里的
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)
    }
}

编码类型为
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)
}
使用内存缓冲区()测试它:

按预期输出(在上尝试):

您有一个工作代码,但知道必须使用指针值调用
Load()
(否则将无法修改其值)

还有一些改进措施:

  • 在您的示例中,您正在接受由返回的
    错误
    (检查它,您将看到问题所在;常见的问题是使用没有导出字段的struct
    mapKey
    ,在这种情况下,将返回
    gob:type main.mapKey没有导出字段的错误
  • 您还应该作为延迟函数调用
  • 此外,如果打开文件失败,则应提前返回,而不应关闭文件
这是您的代码的更正版本:

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]

以及为什么不将其用作嵌套贴图。输入可能需要作为嵌套映射。@SimoEndre:根据博客,如果您有用于映射的嵌套映射类型结构,他们建议使用Struct。然而,我是新手,我不确定是否可以使用struct。它没有给出任何编译错误,但它没有保存长字符串。我们将建议检查您是否正在使用icza所描述的指针,以及其他非常好的建议。
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]