首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何美观地打印同步地图的内容

如何美观地打印同步地图的内容
EN

Stack Overflow用户
提问于 2019-11-22 21:36:12
回答 1查看 4.6K关注 0票数 0

我想在Go中漂亮地打印同步地图的内容。我有一个sync.Map data,我想打印它的内容。

要查看特定密钥SiteData的值,我可以运行以下代码。

代码语言:javascript
复制
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))

但我希望一次打印出整张地图。这是因为data可以有多个密钥,而我想一次打印它们。

运行以下代码不起作用,并打印{}

代码语言:javascript
复制
var data sync.Map
siteData := map[string]string{"Name": "StackOverflow"}
data.Store("SiteData", siteData)
b, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(b))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-22 21:51:07

sync.Map的字段(内部)不会导出,因此它们不能被访问,更重要的是,如果没有同步,就不能访问它们。因此,您不能只打印sync.Map的内容。

您可以做的是迭代sync.Map的所有条目,从它构建一个“普通”映射,并显示该映射。请注意,“普通”映射必须具有string键类型( encoding/json包不支持具有interface{}键类型的映射)。我们可以简单地使用fmt.Sprint()interface{}密钥转换为string。要获取所有条目,您可以使用Map.Range()

例如:

代码语言:javascript
复制
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))

这将输出(在Go Playground上试用):

代码语言:javascript
复制
{
 "Else": "something else",
 "SiteData": {
  "Name": "StackOverflow",
  "Url": "https://so.com"
 }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58995416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档