Golang 迭代嵌套映射并将键更改为标题大小写

我有一个带有lower大小写字符的嵌套地图。我想做的是迭代地图并将所有键转换为Title大小写。我尝试了下面的代码,但它给了我奇怪的结果。有人可以指导我哪里出错了吗?


package main


import (

    "fmt"

    "strings"

)


func main() {

    a := make(map[string]interface{})


    a["start"] = map[string]interface{}{

        "hello": 2,

        "world": 3,

        "here": map[string]interface{}{

            "baam": 123,

            "boom": "dsd",

        },

    }


    printMap(a)


    fmt.Println(a)

}


func printMap(a map[string]interface{}) {


    for k, v := range a {


        switch v.(type) {

        case map[string]interface{}:

            printMap(v.(map[string]interface{}))

        default:

            title := strings.Title(k)

            a[title] = a[k]

            delete(a, k)

        }

    }

}


森栏
浏览 111回答 1
1回答

牛魔王的故事

问题是您正在迭代地图并同时更改它,但期望迭代不会看到您所做的事情。代码的相关部分是:for k, v := range a {    title := strings.Title(k)    a[title] = a[k]    delete(a, k)}因此,如果映射有{"hello":2, "world":3},并假设键按该顺序迭代。第一次迭代后,您现在拥有:{"world":3, "Hello":2}下一次迭代:{"World":3, "Hello":2}下一次迭代查看“Hello”,它已经大写,因此您再次将其大写,然后删除它,最终得到:{"World":3}您可能想要生成一个新的映射,而不是覆盖现有的映射,然后返回该映射,以便调用者可以使用它。func main() {    a := make(map[string]interface{})    a["start"] = map[string]interface{}{        "hello": 2,        "world": 3,        "here": map[string]interface{}{            "baam": 123,            "boom": "dsd",        },    }    a=printMap(a)    fmt.Println(a)}func printMap(a map[string]interface{}) map[string]interface{} {    newMap:=map[string]interface{}{}    for k, v := range a {        switch v.(type) {        case map[string]interface{}:            newMap[k]=printMap(v.(map[string]interface{}))        default:            title := strings.Title(k)            newMap[title] = a[k]        }    }    return newMap}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go