Heim > Backend-Entwicklung > Golang > Suchen Sie nach doppelten Schlüsseln in verschiedenen Go Map-Typen

Suchen Sie nach doppelten Schlüsseln in verschiedenen Go Map-Typen

WBOY
Freigeben: 2024-02-06 10:21:09
nach vorne
1093 Leute haben es durchsucht

检查不同 Go Map 类型中的重复键

Frageninhalt

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
Nach dem Login kopieren

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
}
Nach dem Login kopieren

Aber es können nur Zuordnungen desselben Typs akzeptiert werden, nicht typea, typeb und typec.


Richtige Antwort


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
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage