gpt4 book ai didi

file - 无法使用 gob 将数据正确存储在文件中

转载 作者:IT王子 更新时间:2023-10-29 01:02:04 26 4
gpt4 key购买 nike

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

这里的mapKey是struct,map value是长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)
}

使用内存缓冲区 ( 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字段 将被返回)。
  • 另外你应该调用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]

关于file - 无法使用 gob 将数据正确存储在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com