Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Semak kunci pendua dalam jenis Go Map yang berbeza

Semak kunci pendua dalam jenis Go Map yang berbeza

WBOY
WBOYke hadapan
2024-02-06 10:21:091019semak imbas

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

Kandungan soalan

Saya mahukan fungsi untuk menyemak kunci pendua dalam peta yang berbeza.

Ini yang saya ada

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

Saya mahu memfaktorkannya semula dan menulis fungsi

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
}

Tetapi ia hanya boleh menerima pemetaan jenis yang sama, bukan typea, typeb dan typec.


Jawapan betul


Anda boleh cuba menggunakan any jenis dan refleksi

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
}

Kelemahan pendekatan ini ialah fungsi ini juga akan menerima parameter yang tidak dipetakan dan pengkompil tidak akan memberi amaran tentang perkara ini.

Atas ialah kandungan terperinci Semak kunci pendua dalam jenis Go Map yang berbeza. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam