无法使用 gob 将数据正确存储在文件中
Not able to store data in file properly using gob
当我尝试使用 gob
编码器将 map[mapKey]string
类型的地图保存到文件中时,它没有在文件中保存字符串。
这里mapKey
是struct,map值是long 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
.
类型的值进行编码没有什么特别之处
查看这个使用指定 reader/writer:
的非常简单的工作示例
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
return(检查它,您会发现问题所在;一个常见的问题是使用结构 mapKey
没有导出的字段,在这种情况下 gob: type main.mapKey has no exported fields
的错误将被 returned).
- 你还应该调用
File.Close()
作为延迟函数。
- 此外,如果打开文件失败,您应该 return 尽早而不是关闭文件。
这是您的代码的更正版本:
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]
当我尝试使用 gob
编码器将 map[mapKey]string
类型的地图保存到文件中时,它没有在文件中保存字符串。
这里mapKey
是struct,map值是long 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
.
查看这个使用指定 reader/writer:
的非常简单的工作示例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
return(检查它,您会发现问题所在;一个常见的问题是使用结构mapKey
没有导出的字段,在这种情况下gob: type main.mapKey has no exported fields
的错误将被 returned). - 你还应该调用
File.Close()
作为延迟函数。 - 此外,如果打开文件失败,您应该 return 尽早而不是关闭文件。
这是您的代码的更正版本:
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]