2016-05-16 34 views
1

これは非常に単純な質問です。空ポインタを初期化する方法

どのようにInitialize()reflectで実装しますか? これは可能ですか?

func Initialize(v interface{}) { 
    // ... some reflection code 
} 

type MyType struct { 
    Name string 
} 

func main() { 
    var val *MyType 

    // val is nil before initialize 
    Initialize(val) 
    // val is now &MyType{Name: ""} 

    // ... 
} 

`` `

答えて

3

は、ここでそれを行う方法は次のとおりです。

func Initialize(v interface{}) { 
    rv := reflect.ValueOf(v).Elem() 
    rv.Set(reflect.New(rv.Type().Elem())) 
} 

この機能は、設定する値へのポインタで呼び出されている必要があります

Initialize(&val) 

playground example

引数の型がポインタへのポインタでない場合、この回答のコードはパニックになります。あなたの用途に応じて、Elem()を呼び出す前に反映valuekindをチェックしたいかもしれません。

+0

'Initialize'を実装する方法がないので、' Initialize(val) 'はうまく動作しますか? –

+1

正しい。引数はGoで値渡しされるからです。 –

関連する問題