Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menentukan Secara Umum Saiz Mana-mana Struktur Go?
Cara Mencipta Fungsi Generik untuk Menentukan Saiz Sebarang Struktur dalam Go
Salah satu tugas yang biasa dilakukan dalam pengaturcaraan ialah menentukan saiz struktur. Dalam Go, ini boleh dicapai menggunakan fungsi tidak selamat.Sizeof. Walau bagaimanapun, mencipta fungsi generik yang boleh mengendalikan sebarang jenis struktur adalah sedikit lebih mencabar.
Isu
Pendekatan biasa untuk mencipta fungsi generik ialah menggunakan antara muka dan refleksi. Walau bagaimanapun, menggunakan pendekatan ini seperti yang ditunjukkan di bawah menghasilkan hasil yang salah:
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) }
Kod ini mengembalikan hasil 12 yang salah, kerana ia menentukan saiz pantulan. Nilai struct dan bukannya struktur sebenar yang disimpan dalam antara muka .
Penyelesaian
Untuk menyelesaikan isu ini, gunakan reflect.Type instead of reflect.Nilai untuk mendapatkan maklumat saiz. Jenis reflect.Type mempunyai kaedah Saiz() yang mengembalikan saiz jenis yang sepadan:
size := reflect.TypeOf(T).Size()
Menggunakan pendekatan ini, kod memberikan hasil 40 yang betul, mengambil kira padding dalam struktur.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Secara Umum Saiz Mana-mana Struktur Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!