2017-03-28 8 views
1

ビルドしているライブラリにリフレクションを使用していますが、理解できない部分がありますreflect.Newです。reflect.Newは、初期化された構造体の代わりに<nil>を返します。

type A struct { 
    A int 
    B string 
} 

func main() { 

    real := new(A) 
    reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface() 
    fmt.Println(real) 
    fmt.Println(reflected) 
} 

は与える:

$ go run *go 
&{0 } 
<nil> 

reflect.New&{0 }を返すことになっていませんか? (Runnable Version

は、最終的に、私は、反射構造体のフィールドを反復することができるように希望(reflected.NumField()reflected.NumField undefined (type interface {} is interface with no methods)を与える)などSetIntSetStringとを使用します。あなたはポインタを返すあなたのreal変数を作成したとき

おかげで、

答えて

5

あなたは組み込みnew()機能を使用! realのタイプは、Aではなく、*Aです!これが混乱の原因です。

reflect.New()は、指定された型の(ゼロ)値へのポインタを返します(reflect.Valueにラップされます)。タイプAを渡すと、ラップされた,Aが初期化/ゼロ化された状態に戻ります。 *A型を渡すと、ラップされた,*Aが初期化(ゼロ)され、ポインタ型のゼロ値はnilに戻ります。

基本的にreflect.New()にポインタタイプ(*A)の新しい値を作成するように依頼してください。ゼロの値はnilです。

タイプA(タイプは*Aではありません)を渡す必要があります。

real := new(A) 
reflected := reflect.New(reflect.TypeOf(real).Elem()).Elem().Interface() 
fmt.Println(real) 
fmt.Println(reflected) 

またはこの(Go Playground)のように:それは、この(Go Playground上でそれを試してみてください)のように動作します

real := A{} 
reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface() 
fmt.Println(real) 
fmt.Println(reflected) 
関連する問題