Semak kunci pendua dalam jenis Go Map yang berbeza

WBOY
Lepaskan: 2024-02-06 10:21:09
ke hadapan
1043 orang telah melayarinya

检查不同 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
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!