Ітерація над усіма ключами карти


316

Чи є спосіб отримати список усіх ключів на карті мови Go? Кількість елементів задається len(), але якщо у мене є карта на зразок:

m := map[string]string{ "key1":"val1", "key2":"val2" };

Як повторити всі клавіші?

Відповіді:


546

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

або

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

Специфікація мови go для forвисловлювань вказує, що перше значення є ключовим, друге змінна - це значення, але воно не повинно бути присутнім.


22
Як можливий готч, зауважте, що порядок ітерації не визначений. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
1212

23
Sudhir: мовна мова голангу чітко визначає карти як такі, що не мають визначеного впорядкування ключів. Крім того, оскільки Go 1, ключовий порядок навмисно рандомізований між прогонами, щоб запобігти залежності від будь-якого сприйманого порядку.
Марк Ренуф

6
Зауважте, що це не мутаційна ітерація, тобто для видалення ключа знадобиться перезапустити ітерацію.
Рік Сміт

Також для невеликих наборів даних порядок карт може бути передбачуваним.
woot

14

Ось декілька простих способів отримати sliceключі карт.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

Чи можливо для Keysфункції взяти карту з ключами будь-якого типу, а не лише рядками?
Роберт Т. Макгіббон

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon вам потрібно змінити функцію "прототип"
a8m

1
@ArielM. Це працювало б лише для точного типу map[interface{}]interface{}. Go не підтримує дженерики. Ви не можете створити функцію з mapпараметром, який приймає карти з різними типами ключів.
icza

10

Чи є спосіб отримати список усіх клавіш на карті мови Go?

ks := reflect.ValueOf(m).MapKeys()

як я повторюю всі клавіші?

Використовуйте прийняту відповідь:

for k, _ := range m { ... }

1
Я думаю, ти мав на увазі for _, k := range v.MapKeys(), оскільки у твоєму прикладі kбуде інт-індекс фрагмента ключів
Брайан Лейшман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.