Heim >Backend-Entwicklung >Golang >Wie kann ich in Go effizient Schlüssel aus Karten abrufen?

Wie kann ich in Go effizient Schlüssel aus Karten abrufen?

Susan Sarandon
Susan SarandonOriginal
2024-12-07 04:18:12506Durchsuche

How to Efficiently Retrieve Keys from Maps in Go?

So erhalten Sie Kartenschlüssel in Go

Mit dem starken Typisierungssystem von Go kann eine Funktion, die eine Karte mit Schlüsseln vom Typ interface{} übernimmt, nicht auf eine Karte angewendet werden mit Schlüsseln vom Typ int. Während Go derzeit keine Generika unterstützt, können wir eine generische Schlüsselfunktion auf verschiedene Arten implementieren:

Option 1: Kartentyp konvertieren

Wenn wir den Typ der Karte beibehalten möchten, können wir dies tun Ändern Sie die Keys-Funktion, um ein Map[int]interface{}-Argument zu verwenden und die Schlüssel explizit in interface{} umzuwandeln:

func Keys(m map[int]interface{}) []interface{} {
    keys := make([]interface{}, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

Option 2: Verwenden Reflection

Alternativ können wir das Reflection-Paket von Go verwenden, um auf die Schlüssel der Karte zuzugreifen und sie in interface{} umzuwandeln. Dieser Ansatz kann jedoch Auswirkungen auf die Leistung haben:

func Keys(m interface{}) []interface{} {
    t := reflect.TypeOf(m)
    if t.Kind() != reflect.Map {
        panic("argument must be a map")
    }
    keys := make([]interface{}, 0)
    for _, key := range reflect.ValueOf(m).MapKeys() {
        keys = append(keys, key.Interface())
    }
    return keys
}

Option 3: Definieren einer generischen Hilfsfunktion

Um potenzielle Leistungsprobleme zu vermeiden, können wir eine generische Hilfsfunktion definieren, die eine Karte konvertiert[ int]interface{} zu einer Map[interface{}]interface{}:

func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 {
    ret := make(map[K2]V2, len(m))
    for k, v := range m {
        ret[k.(K2)] = v.(V2)
    }
    return ret
}

// Keys returns the keys of the provided map.
func Keys[K comparable, V any](m map[K]V) []K {
    keys := make([]K, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

Mit diesen Hilfsfunktionen können wir Folgendes verwenden Code:

m2 := map[int]interface{}{
    2: "string",
    3: "int",
}
convertedMap := convertMap(m2)
result := Keys(convertedMap)
fmt.Println(result)

Das obige ist der detaillierte Inhalt vonWie kann ich in Go effizient Schlüssel aus Karten abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn