Golang中如何将二维map写入文件?
Golang中如何将二维map写入文件? 我有一个二维映射,尝试使用编码/Gob库将其写入输出文件,但遇到了以下错误:“gob: type not registered for interface: map[string]map[int]example1Obj”
代码如下:
gob.Register(map[string]interface{}{})
fileName := os.Args[1]
File, err := os.Create(fileName)
if err != nil {
log.Fatal(err)
}
defer File.Close()
enc:= gob.NewEncoder(File)
err = enc.Encode(Map.Map_1)
if err != nil {
fmt.Print(err)
} else {
File.Sync()
}
更多关于Golang中如何将二维map写入文件?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
obj1 := struct {
Name string
Place string
}{
Name: "obj1",
Place: "first"}
data := map[string]interface{}{
"x_one": map[int]interface{}{
1: obj1}}
gob.Register(data["x_one"])
gob.Register(data["x_one"].(map[int]interface{})[1])
f, err := os.Create("2dimmap.gob")
if err != nil {
fmt.Println("os.Create err:", err)
return
}
defer f.Close()
e := gob.NewEncoder(f)
if err = e.Encode(data); err != nil {
fmt.Println("e.Encode err:", err)
return
}
}
这是一个典型的Gob类型注册问题。二维map中的内层map类型map[int]example1Obj没有正确注册。需要为每个嵌套类型单独注册。
package main
import (
"encoding/gob"
"fmt"
"log"
"os"
)
type example1Obj struct {
Name string
Value float64
}
func main() {
// 注册所有需要的类型
gob.Register(map[string]interface{}{})
gob.Register(map[int]example1Obj{})
gob.Register(example1Obj{})
// 示例二维map
Map_1 := map[string]map[int]example1Obj{
"group1": {
1: {"item1", 10.5},
2: {"item2", 20.3},
},
"group2": {
3: {"item3", 30.7},
4: {"item4", 40.1},
},
}
fileName := "output.gob"
file, err := os.Create(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
enc := gob.NewEncoder(file)
if err := enc.Encode(Map_1); err != nil {
fmt.Println("编码错误:", err)
} else {
fmt.Println("写入成功")
file.Sync()
}
}
如果需要读取这个文件:
func readFromFile(filename string) (map[string]map[int]example1Obj, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
// 同样需要注册类型
gob.Register(map[string]interface{}{})
gob.Register(map[int]example1Obj{})
gob.Register(example1Obj{})
dec := gob.NewDecoder(file)
var data map[string]map[int]example1Obj
if err := dec.Decode(&data); err != nil {
return nil, err
}
return data, nil
}
关键点:Gob需要知道所有嵌套类型的定义,包括example1Obj结构体和内层的map[int]example1Obj。每个在编码/解码过程中出现的具体类型都需要提前注册。


