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

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

WBOY
WBOYnach vorne
2024-02-06 10:21:091061Durchsuche

检查不同 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

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.


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
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen