Problem:
Bei der Arbeit mit Karten in Go ist es oft wünschenswert, Schlüssel von zu verwenden vom gleichen Typ, aber Werte unterschiedlichen Typs. Beim Versuch, eine Funktion zu erstellen, die einen Schlüsseltyp mit Schnittstelle{} als Werttyp verwendet, gibt es jedoch eine Einschränkung.
Fehlgeschlagener Ansatz:
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 }
Der obige Code lässt sich aufgrund einer Typinkongruenz nicht kompilieren. Karten in Go sind nicht kovariant, was bedeutet, dass sie keine unterschiedlichen Werttypen mit demselben Schlüsseltyp akzeptieren können.
Lösung:
Es gibt zwar keine elegante Lösung für dieses Problem Für die inhärenten Einschränkungen von Go gibt es eine Problemumgehung mithilfe von Reflection:
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) }
Dieser Code verwendet einen Interface{}-Wert und verwendet Reflection, um zu bestimmen, ob es sich um einen handelt Karte. Wenn dies der Fall ist, werden die Schlüssel für diese Karte extrahiert und gedruckt.
Hinweis:
Es ist wichtig, sich der Einschränkungen der Verwendung von Reflektion bewusst zu sein, soweit dies möglich ist führen zu Mehraufwand und Komplexität bei der Laufzeitleistung. Wenn möglich, bleibt die Verwendung bestimmter Kartentypen für bestimmte Werttypen der bevorzugte Ansatz für Leistung und Wartbarkeit.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go mit Karten mit unterschiedlichen Werttypen, aber demselben Schlüsseltyp umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!