2017-06-14 1 views
1

GAE/Goで構造体のサイズを取得したいとします。GAE/Goで構造体のサイズを取得する

私はthisの投稿を読んで、以下のコードを書きました。

import (
    "reflect" 
    "unsafe" 
) 

func GetSize(T interface{}) { 
    size := reflect.TypeOf(T).Size() 
    return int((*int)(unsafe.Pointer(size))) 
} 

GAEではunsafeをインポートできないため、このコードは機能しません。

GAE/Goでこれを行うにはどうすればよいですか?

答えて

2

提案された解決策は有効なコードではありません。複数のエラーがあります。

たとえば、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?

関連する問題