Go で任意の構造体のサイズを決定するジェネリック関数を作成する方法
プログラミングで一般的に実行されるタスクの 1 つは、構造物のサイズ。 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) }
このコードは、インターフェイスに格納されている実際の構造体ではなく、reflect.Value 構造体のサイズを決定するため、誤った結果 12 を返します。 .
解決策
この問題を解決するには、reflect.Value の代わりにreflect.Type を使用します。サイズ情報を取得します。 reflect.Type 型には、対応する型のサイズを返す Size() メソッドがあります。
size := reflect.TypeOf(T).Size()
このアプローチを使用すると、コードは構造内のパディングを考慮して、正しい結果 40 を提供します。
以上がGo 構造のサイズを一般的に決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。