Go でデータ構造のサイズを決定するための汎用関数
Go には、C の 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) // Incorrectly produces 12 }
を使用してこれを達成しようとします。ただし、このアプローチでは、サイズを計算するため、誤った結果が得られます。インターフェイス T に格納されているオブジェクトではなく、reflect.Value 構造体を使用します。
解決策は、 reflect.Type:
size := reflect.TypeOf(T).Size() // Corrects the size calculation
この変更により、関数はパディングを考慮して入力データ構造のサイズを正確に決定できるようになります。この例では、サイズが 40 として正しく報告されています。
以上がGo でデータ構造のサイズを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。