Heim >Backend-Entwicklung >Golang >Wie kann ich in Go effizient Schlüssel aus Karten abrufen?
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:
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 }
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 }
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!