为了账号安全,请及时绑定邮箱和手机立即绑定

如何漂亮地打印同步地图的内容

如何漂亮地打印同步地图的内容

Go
千万里不及你 2023-08-07 14:35:36
我想在 Go 中漂亮地打印同步映射的内容。我有一个sync.Mapdata我想打印它的内容。要查看特定键的值,SiteData我可以运行以下代码。var data sync.MapsiteData := map[string]string{"Name": "StackOverflow"}data.Store("SiteData", siteData)temp, _ := data.Load("SiteData") b, _ := json.MarshalIndent(temp, "", " ")fmt.Println(string(b))但我希望立即打印整个地图。这是因为data可以有很多钥匙,我想一次打印它们。运行以下代码不起作用并打印{}var data sync.MapsiteData := map[string]string{"Name": "StackOverflow"}data.Store("SiteData", siteData)b, _ := json.MarshalIndent(data, "", " ")fmt.Println(string(b))
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

的字段(内部)sync.Map不会导出,因此无法访问,更重要的是,如果不同步则无法访问。所以你不能只打印sync.Map.

您可以做的是迭代 的所有条目sync.Map,从中构建一个“普通”地图,然后显示它。请注意,“普通”映射必须具有string键类型(interface{}该包不支持具有键类型的映射encoding/json)。我们可以简单地将interface{}密钥转换为string使用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))

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


{

 "Else": "something else",

 "SiteData": {

  "Name": "StackOverflow",

  "Url": "https://so.com"

 }

}


查看完整回答
反对 回复 2023-08-07
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这是一个简单的 util 函数(您可以根据需要对其进行修改):


// print map's key/value, with index (not stable),

func PrintSyncMap(m sync.Map) {

    // print map,

    fmt.Println("map content:")

    i := 0

    m.Range(func(key, value interface{}) bool {

        fmt.Printf("\t[%d] key: %v, value: %v\n", i, key, value)

        i++

        return true

    })

}

输出示例:


map content:

        [0] key: Qian, value: class 2

        [1] key: Zhao, value: class 1

        [2] key: Li, value: class 4

尖端:


指数不稳定。(又名。打印项目的顺序可能会在多次调用中发生变化。)


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信