Masalah:
Apabila bekerja dengan peta dalam Go, selalunya diingini untuk menggunakan kekunci jenis yang sama tetapi nilai yang berbeza jenis. Walau bagaimanapun, terdapat kekangan apabila cuba mencipta fungsi yang mengambil jenis kunci dengan antara muka{} sebagai jenis nilai.
Pendekatan Gagal:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { //something with keys here }
Kod di atas tidak akan disusun kerana jenis tidak sepadan. Peta dalam Go bukan kovarian, bermakna mereka tidak boleh menerima jenis nilai yang berbeza dengan jenis kunci yang sama.
Penyelesaian:
Walaupun tiada penyelesaian yang elegan untuk isu ini dalam Had yang wujud Go, terdapat penyelesaian menggunakan pantulan:
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
Kod ini mengambil nilai antara muka{} dan menggunakan pantulan untuk tentukan sama ada ia adalah peta. Jika ya, ia mengekstrak dan mencetak kekunci untuk peta itu.
Nota:
Adalah penting untuk mengambil kira had penggunaan refleksi, kerana ia boleh memperkenalkan overhed dan kerumitan prestasi masa jalan. Jika boleh, menggunakan jenis peta khusus untuk jenis nilai tertentu kekal sebagai pendekatan pilihan untuk prestasi dan kebolehselenggaraan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Peta dengan Jenis Nilai Berbeza Tetapi Jenis Kekunci Yang Sama dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!