Heim > Artikel > Backend-Entwicklung > Suchen Sie nach doppelten Schlüsseln in verschiedenen Go Map-Typen
Ich möchte eine Funktion, um in verschiedenen Karten nach doppelten Schlüsseln zu suchen.
Das ist es, was ich habe
ma := map[string]typea mb := map[string]typeb mc := map[string]typec dup := map[string]bool{} for k := range ma{ if !dup[k] { dup[k] = true } else { return fmt.errorf("duplicate key[%v]", k) } } for k := range mb{ if !dup[k] { dup[k] = true } else { return fmt.errorf("duplicate key[%v]", k) } } for k := range mc { if !dup[k] { dup[k] = true } else { return fmt.errorf("duplicate key[%v]", k) } } return nil
Ich möchte es umgestalten und eine Funktion schreiben
func checkDupKeys[M ~map[K]V, K comparable, V any](maps ...M) error { dup := map[K]bool{} for _, m := range maps { for k := range m { if !dup[k] { dup[k] = true } else { return fmt.Errorf("duplicate key[%v]", k) } } } return nil }
Aber es können nur Zuordnungen desselben Typs akzeptiert werden, nicht typea, typeb und typec.
Sie können versuchen, any
Typen und Reflexion zu verwenden
func checkDupKeys(maps ...any) error { dup := map[any]bool{} for i, m := range maps { t := reflect.TypeOf(m) if t.Kind() != reflect.Map { return fmt.Errorf("not a map at index: %d", i) } keys := reflect.ValueOf(m).MapKeys() for _, k := range keys { v := k.Interface() if !dup[v] { dup[v] = true } else { return fmt.Errorf("duplicate key[%v]", v) } } } return nil }
Der Nachteil dieses Ansatzes besteht darin, dass die Funktion auch nicht zugeordnete Parameter akzeptiert und der Compiler keine Warnung darüber ausgibt.
Das obige ist der detaillierte Inhalt vonSuchen Sie nach doppelten Schlüsseln in verschiedenen Go Map-Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!