Golang перебирает вложенную карту и меняет ключи на Case title - PullRequest
0 голосов
/ 17 октября 2019

У меня есть вложенная карта с 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)
        }
    }
}

1 Ответ

2 голосов
/ 17 октября 2019

Проблема в том, что вы итерируете карту и одновременно меняете ее, но ожидаете, что итерация не увидит, что вы сделали. Соответствующая часть кода:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...