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 回复

那么我之后该如何解码呢?

更多关于Golang中如何将二维map写入文件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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。每个在编码/解码过程中出现的具体类型都需要提前注册。

回到顶部