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.
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!