提案された解決策は有効なコードではありません。複数のエラーがあります。
たとえば、GetSize()
には結果の型がないため、何も返されませんでした。
次に、返す式も構文エラーです。*int
ポインタをint
に変換しようとしましたが無効です。
あなたは最初のポインタデリファレンスに必要なので、正しい構文は次のようになります。
func GetSize(T interface{}) int {
size := reflect.TypeOf(T).Size()
return int(*(*int)(unsafe.Pointer(size)))
}
しかし。それは意味をなさない。 reflect.Type.Size()
は既にサイズ(指定された型の値を格納するために必要なバイト数)を返します。したがって、そのunsafe
マジックは必要ありません。混乱を招く可能性があるのは、戻り値の型がuintptr
ですが、たとえば、値をint
に変換して使用するだけです。
は単純に使用します。
func GetSize(v interface{}) int {
return int(reflect.TypeOf(v).Size())
}
テストそれ:
fmt.Println("Size of int:", GetSize(int(0)))
fmt.Println("Size of int64:", GetSize(int64(0)))
fmt.Println("Size of [100]byte:", GetSize([100]byte{}))
出力(Go Playground上でそれを試してみてください):あなたが忘れてはならない
Size of int: 4
Size of int64: 8
Size of [100]byte: 100
一つのこと:このGetSize()
意志を反復的に渡された値のサイズを調べることはありません。たとえば、ポインタフィールドを持つ構造体の場合、ポインタフィールドのサイズだけを指し示す値のサイズを「カウント」しません。
複雑なデータ構造の合計サイズを再帰的にカウントするGetSize()
を構築することは、map
のようなタイプのために自明ではありません。詳細はHow to get variable memory size of variable in golang?