423 Stimmen

Erhalten eines Schlüsselausschnitts aus einer Karte

Gibt es einen einfacheren/schöneren Weg, um in Go einen Ausschnitt von Schlüsseln aus einer Map zu bekommen?

Derzeit iteriere ich über die Map und kopiere die Schlüssel in einen Slice:

i := 0
keys := make([]int, len(mymap))
for k := range mymap {
    keys[i] = k
    i++
}

17voto

Ein besserer Weg, um dies zu tun, wäre die Verwendung von append:

keys = []int{}
for k := range mymap {
    keys = append(keys, k)
}

Ansonsten hast du Pech gehabt - Go ist keine sehr ausdrucksstarke Sprache.

6voto

Saurabh Punkte 2056

Angenommen map ist vom Typ map[int]string, können Sie Schlüssel und Werte mit dem experimentellen maps-Paket aus der Standardbibliothek erhalten:

package main

import (
    "fmt"
    "golang.org/x/exp/maps"
)

func main() {
    mymap := map[int]string{1: "foo", 2: "bar", 3: "biz"}

    fmt.Println(maps.Keys(mymap))
    fmt.Println(maps.Values(mymap))
}

Ausgabe:

[2 3 1]
[bar biz foo]

3voto

Eric Punkte 18690

Eine generische Version (go 1.18+) von Vinay Pai's Antwort.

// MapKeysToSlice extrahiert Schlüssel der Map als Slice,
func MapKeysToSlice[K vergleichbar, V beliebig](m map[K]V) []K {
    keys := make([]K, len(m))

    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

2voto

Lalit Sharma Punkte 82

Besuchen Sie https://play.golang.org/p/dx6PTtuBXQW

package main

import (
    "fmt"
    "sort"
)

func main() {
    mapEg := map[string]string{"c":"a","a":"c","b":"b"}
    keys := make([]string, 0, len(mapEg))
    for k := range mapEg {
        keys = append(keys, k)
    }
    sort.Strings(keys)
    fmt.Println(keys)
}

1voto

Alex Kosh Punkte 1516

Es gibt eine coole Bibliothek namens lo

Ein Lodash-ähnliche Go-Bibliothek basierend auf Go 1.18+ Generics (map, filter, contains, find...)

Mit dieser Bibliothek können Sie viele bequeme Operationen wie map, filter, reduce und mehr durchführen. Es gibt auch einige Helfer für den Typ map

Schlüssel

Erstellt ein Array der Kartenkeys.

keys := lo.Keys[string, int](map[string]int{"foo": 1, "bar": 2})
// []string{"bar", "foo"}

Werte

Erstellt ein Array der Kartenwerte.

values := lo.Values[string, int](map[string]int{"foo": 1, "bar": 2})
// []int{1, 2}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X