如何建立通用函數來決定 Go 中任何結構的大小
程式設計中經常執行的任務之一是決定結構的大小。在 Go 中,這可以使用 unsafe.Sizeof 函數來實現。然而,創建一個可以處理任何類型結構的泛型函數有點具有挑戰性。
問題
建立泛型函數的常見方法是使用介面和反思。但是,使用如下所示的方法會產生不正確的結果:
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) }
此程式碼傳回錯誤的結果12,因為它確定Reflect.Value 結構的大小,而不是儲存在介面中的實際結構的大小.
解
要解決此問題,請使用reflect.Type而不是reflect.Value來取得尺寸資訊。 Reflect.Type 類型有一個 Size() 方法,它會傳回對應類型的大小:
size := reflect.TypeOf(T).Size()
使用這種方法,程式碼提供了正確的結果 40,考慮了結構內的填充。
以上是我如何一般性地決定任何 Go 結構的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!