Taip Penegasan Menggunakan Refleksi dalam Go
Dalam Go, penegasan taip menyediakan mekanisme untuk mengesahkan jenis nilai antara muka{} dan menukar ia kepada jenis tertentu jika ia sepadan. Walau bagaimanapun, kadangkala anda mungkin menghadapi situasi di mana anda perlu menegaskan Jenis yang dikembalikan oleh reflect.TypeOf() ke dalam jenis tertentu.
Masalah: Penegasan Memerlukan Jenis, Bukan Jenis
Dalam contoh anda, anda cuba untuk menegaskan Jenis kepada jenis dengan menggunakan yang berikut baris:
item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type
Di sini, item2 tidak akan sah kerana reflect.TypeOf(i) mengembalikan *reflect.Type, yang bukan jenis itu sendiri. Penegasan jenis mengharapkan jenis, bukan deskriptor jenis.
Penyelesaian: Menggunakan Type Switch
Satu pendekatan untuk menangani perkara ini ialah menggunakan suis jenis pada antara muka{ } nilai:
switch i.(type) { case *reflect.Type: // Code to handle reflect.Type here }
Ini membolehkan anda melakukan tindakan khusus berdasarkan jenis sebenar antara muka{} nilai.
Pendekatan Alternatif: Pengimbasan Refleksi
Jika anda perlu menegaskan jenis tertentu dari dalam antara muka{}, anda boleh menggunakan refleksi untuk mengimbas medan nilai:
s := reflect.ValueOf(i) for i := 0; i < s.NumField(); i++ { switch s.Field(i).Interface().(type) { case int: // Code to handle integer field here } }
Pendekatan ini membolehkan anda melakukan semakan jenis pada medan individu dalam antara muka{} nilai.
Kesimpulan:
Jenis penegasan menggunakan reflect.TypeOf() dalam Go memerlukan jenis tertentu, bukan deskriptor jenis. Untuk mengendalikan senario sedemikian, anda boleh menggunakan suis jenis atau imbasan pantulan untuk menentukan jenis nilai sebenar antara muka{}.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Penegasan Jenis pada Nilai Pulangan `reflect.TypeOf()` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!