Go で任意の構造体のサイズを取得する汎用関数
問題:
目標は、 Go の汎用関数で、任意の構造体のサイズを決定できます。 C.
コードとエラー:
提供されたコードは、リフレクションを使用して構造体のサイズを取得します。ただし、オブジェクトに反映するのではなく、reflect.Value 構造体に反映すると、誤った結果が得られます。問題のコードは次のとおりです:
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 }
解決策:
この問題を解決するには、オブジェクトの値ではなく型を考慮する必要があります。 Reflect.Type には、正しいサイズを提供する Size() メソッドがあります。更新されたコードは次のとおりです:
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 }
説明:
修正されたコードは、reflect.Type の Size() メソッドを使用しており、リフレクションによるオーバーヘッドなしで構造体のサイズを返します。 .
以上がリフレクションを使用して Go で構造体のサイズを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。