Heim >Backend-Entwicklung >Golang >Wie kann ich in Go unabhängig vom Werttyp auf Zuordnungsschlüssel zugreifen?
In Go sind Karten vielseitige Datenstrukturen, die Schlüssel bestimmten Werten zuordnen. Es kann jedoch vorkommen, dass wir die Schlüssel mehrerer Karten verwenden möchten, auch wenn sich ihre Werttypen unterscheiden. Betrachten Sie den folgenden Codeausschnitt:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { // something with keys here }
In diesem Beispiel haben wir drei Karten: mapOne enthält Ganzzahlen, mapTwo speichert Doppelwerte und mapThree enthält Instanzen von SomeStruct. Unser Ziel ist es, eine Funktion useKeys zu erstellen, die eine Zuordnung mit Zeichenfolgenschlüsseln und einem beliebigen Werttyp akzeptiert, der durch interface{} bezeichnet wird. Dieses Design funktioniert jedoch nicht wie erwartet.
In Go sind Karten und Slices generische Strukturen, denen es jedoch an Kovarianz mangelt. Dies bedeutet, dass Sie einer Variablen vom Typ „map[string]interface{} zwar eine Map[string]int zuweisen können, Sie die Werte der zugewiesenen Map jedoch nicht sicher ändern können, ohne Fehler zu verursachen.
Wenn wir lediglich die Schlüssel einer Karte unabhängig von ihrem Werttyp erhalten müssen, können wir auf Reflexion zurückgreifen:
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
Das ist bei dieser Lösung nicht der Fall so elegant, wie wir es gerne hätten, aber es ruft effektiv die Schlüssel jeder an ihn übergebenen Karte ab und druckt sie, unabhängig von den enthaltenen Werttypen.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go unabhängig vom Werttyp auf Zuordnungsschlüssel zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!