roh*_*han 3 dictionary file go gob
当我尝试map[mapKey]string使用gob编码器将类型映射保存到文件中时,它不会将字符串保存在文件中。
这mapKey是结构体,映射值是长 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)
    }
}
对 type 值进行编码没有什么特别之处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()将无法修改其值)。
还有一些事情可以改进它:
error返回的 by Encoder.Encode()(检查它,您会看到问题是什么;一个常见的问题是使用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]
| 归档时间: | 
 | 
| 查看次数: | 664 次 | 
| 最近记录: |