Dengan sistem menaip kuat Go, fungsi yang mengambil peta dengan kekunci antara muka jenis{} tidak boleh digunakan pada peta dengan kunci jenis int. Walaupun Go tidak menyokong generik pada masa ini, kami boleh melaksanakan fungsi Kekunci generik dalam beberapa cara:
Jika kami ingin mengekalkan jenis peta, kami boleh ubah suai fungsi Keys untuk mengambil argumen map[int]antara muka{} dan secara eksplisit menukar kunci kepada antara muka{}:
func Keys(m map[int]interface{}) []interface{} { keys := make([]interface{}, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
Sebagai alternatif, kita boleh menggunakan pakej refleksi Go untuk mengakses kekunci peta dan menukarkannya kepada antara muka{}. Walau bagaimanapun, pendekatan ini mungkin mempunyai implikasi prestasi:
func Keys(m interface{}) []interface{} { t := reflect.TypeOf(m) if t.Kind() != reflect.Map { panic("argument must be a map") } keys := make([]interface{}, 0) for _, key := range reflect.ValueOf(m).MapKeys() { keys = append(keys, key.Interface()) } return keys }
Untuk mengelakkan potensi masalah prestasi, kami boleh mentakrifkan fungsi pembantu generik yang menukar peta[ int]antara muka{} ke peta[antara muka{}]antara muka{}:
func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 { ret := make(map[K2]V2, len(m)) for k, v := range m { ret[k.(K2)] = v.(V2) } return ret } // Keys returns the keys of the provided map. func Keys[K comparable, V any](m map[K]V) []K { keys := make([]K, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
Dengan pembantu ini fungsi, kita boleh menggunakan kod berikut:
m2 := map[int]interface{}{ 2: "string", 3: "int", } convertedMap := convertMap(m2) result := Keys(convertedMap) fmt.Println(result)
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Kekunci dengan Cekap daripada Peta dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!