我想在 Go 中漂亮地打印同步地图的内容。我有一个 sync.Mapdata我想打印它的内容。
要查看特定键的值,SiteData我可以运行以下代码。
var data sync.Map
siteData := map[string]string{"Name": "StackOverflow"}
data.Store("SiteData", siteData)
temp, _ := data.Load("SiteData")
b, _ := json.MarshalIndent(temp, "", " ")
fmt.Println(string(b))
Run Code Online (Sandbox Code Playgroud)
但我希望一次打印整个地图。这是因为data可以有很多键,我想一次打印它们。
运行以下代码不起作用并打印 {}
var data sync.Map
siteData := map[string]string{"Name": "StackOverflow"}
data.Store("SiteData", siteData)
b, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(b))
Run Code Online (Sandbox Code Playgroud)
的字段(内部)sync.Map没有导出,因此无法访问,更重要的是,没有同步就无法访问它们。所以你不能只打印sync.Map.
您可以做的是遍历您的所有条目,sync.Map从中构建一个“普通”地图,并显示它。请注意,“普通”映射必须具有string键类型(包interface{}不支持具有键类型的映射encoding/json)。我们可以简单地将interface{}键转换为stringusing fmt.Sprint()。要获取所有条目,您可以使用Map.Range().
例如:
var data sync.Map
data.Store("SiteData", map[string]string{
"Name": "StackOverflow",
"Url": "https://so.com",
})
data.Store("Else", "something else")
m := map[string]interface{}{}
data.Range(func(key, value interface{}) bool {
m[fmt.Sprint(key)] = value
return true
})
b, err := json.MarshalIndent(m, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(b))
Run Code Online (Sandbox Code Playgroud)
这将输出(在Go Playground上尝试):
{
"Else": "something else",
"SiteData": {
"Name": "StackOverflow",
"Url": "https://so.com"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |