Fungsi Generik untuk Mendapatkan Saiz Sebarang Struktur dalam Go
Masalah:
Matlamatnya adalah untuk mencipta fungsi generik dalam Go yang boleh menentukan saiz mana-mana struktur sewenang-wenangnya, sama dengan saiz fungsi dalam C.
Kod dan Ralat:
Kod yang disediakan menggunakan pantulan untuk mendapatkan semula saiz struktur. Walau bagaimanapun, refleksi pada reflect.Value struct, bukannya mencerminkan pada objek, menghasilkan keputusan yang salah. Berikut ialah kod yang dipersoalkan:
package main import ( "fmt" "reflect" "unsafe" ) func main() { type myType struct { a int b int64 c float32 d float64 e float64 } info := myType{1, 2, 3.0, 4.0, 5.0} getSize(info) } func getSize(T interface{}) { v := reflect.ValueOf(T) const size = unsafe.Sizeof(v) fmt.Println(size) // Prints 12, which is incorrect }
Penyelesaian:
Untuk menyelesaikan isu ini, seseorang perlu memikirkan jenis dan bukannya nilai objek. Reflection.Type mempunyai kaedah Size() yang menyediakan saiz yang betul. Berikut ialah kod yang dikemas kini:
package main import ( "fmt" "reflect" ) func main() { type myType struct { a int b int64 c float32 d float64 e float64 } info := myType{1, 2, 3.0, 4.0, 5.0} getSize(info) } func getSize(T interface{}) { v := reflect.ValueOf(T) size := v.Type().Size() fmt.Println(size) // Prints 40, which is correct }
Penjelasan:
Kod yang diperbetulkan menggunakan kaedah Saiz() bagi pantulan.Jenis, yang mengembalikan saiz struktur tanpa overhed daripada pantulan .
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Saiz Mana-mana Struktur dalam Go Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!