Go 在尝试解组从文件读取的字符串时,接收到一个没有错误的空映射(回答:解组到数据结构本身)

Go 在尝试解组从文件读取的字符串时,接收到一个没有错误的空映射(回答:解组到数据结构本身),go,text-files,unmarshalling,Go,Text Files,Unmarshalling,我有一个文件“test.txt”,包含以下数据。此文件是使用封送处理从下面代码的相同结构创建的 {"VLETXGJM":{"attrib1":"test1","attrib2":"test2"}} 我试图从文件中读回它,并使用相同的结构将其解组到地图中。我可以成功地从文件中读取数据。当我试图将其解组到地图中时,没有收到任何错误。然而,我的地图是空的 互斥锁用于保护映射,因为我的实际实现(这是一个提取的测试)需要使用受保护的映射来实现并发性。我尝试过同样的代码删除同步库,但收到同样的负面结果 测

我有一个文件“test.txt”,包含以下数据。此文件是使用封送处理从下面代码的相同结构创建的

{"VLETXGJM":{"attrib1":"test1","attrib2":"test2"}}
我试图从文件中读回它,并使用相同的结构将其解组到地图中。我可以成功地从文件中读取数据。当我试图将其解组到地图中时,没有收到任何错误。然而,我的地图是空的

互斥锁用于保护映射,因为我的实际实现(这是一个提取的测试)需要使用受保护的映射来实现并发性。我尝试过同样的代码删除同步库,但收到同样的负面结果

测试代码:

package main

import (
    "encoding/json"
    "fmt"
    "sync"
    "os"
)

type TestObject struct {
    Attrib1 string `json:"attrib1"`
    Attrib2 string `json:"attrib2"`
}

type TestMap map[string]TestObject

type TestList struct {
    sync.RWMutex
    list TestMap
}

func main() {

    tl := TestList{ list: make(TestMap) }

    // Read the list back out of the file

    fi, err := os.Open("test.txt")

    if os.IsNotExist(err) {
        fmt.Println("data file does not exist")
        panic(nil)
    }

    if err != nil {
        panic(err)
    }

    defer func() {
        if err := fi.Close(); err != nil {
            panic(err)
        }
    }()

    data := make([]byte, 1024 * 1024)
    count, err := fi.Read(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("read from file: \"%s\"\n",data[:count])

    tl.Lock()
    err = json.Unmarshal(data[:count], &tl)
    if err != nil {
        panic(err)
    }
    tl.Unlock()

    // List it out
    tl.Lock()
    if len(tl.list) == 0 {
        fmt.Println("Empty list")
    } else {
        for key, _ := range tl.list {
            fmt.Printf("%s: %s\n", tl.list[key].Attrib1, tl.list[key].Attrib2)
        }
    }
    tl.Unlock()
}
运行的输出为:

read from file: "{"VLETXGJM":{"attrib1":"test1","attrib2":"test2"}}"
Empty list

谢谢你的帮助。我已经搜索了类似的问题,但还没有找到与此场景完全相同的问题。

我认为您希望将其解组到
tl.list
而不是
tl

err = json.Unmarshal(data[:count], &tl.list)

tl
没有导出字段,因此
Unmarshal
tl
中不会执行任何操作
tl.list
(即键入
TestMap
)与您的数据相匹配。

我认为您希望解组到
tl.list
,而不是
tl

err = json.Unmarshal(data[:count], &tl.list)

tl
没有导出字段,因此
Unmarshal
tl
中不会执行任何操作
tl.list
(即键入
TestMap
)与您的数据匹配。

谢谢,安迪。这正是问题所在。谢谢你的帮助和教育。谢谢你,安迪。这正是问题所在。谢谢你的帮助和教育。