2017-09-20 8 views
0

例として、インターフェイスの仕事から基になる型の値をゼロにすることはできますか?golangの特定のインターフェイスの基になる型を取得する

func MakeSomething(w Worker){ 
    w.Work() 

    //can I get a zeor value type of The type underlying w? 
    //I tried as followed, but failed 

    copy :=w 
    v := reflect.ValueOf(&copy) 
    fm :=v.Elem() 
    modified :=reflect.Zero(fm.Type())//fm.type is Worker, and modified comes to be nil 
    fm.Set(modified) 
    fmt.Println(copy) 
} 

type Worker interface { 
    Work() 
} 

the playground

答えて

1

wWorkerへのポインタが含まれているので、あなたはのゼロ値にそれがを指している要素を取得したい場合があります。あなたは要素を取得したら、その型のゼロ値を作成することができます:あなたはMakeSomethingに非ポインタを渡す場合

v := reflect.ValueOf(w).Elem() // Get the element pointed to 
zero := reflect.Zero(v.Type()) // Create the zero value 

上記のコードスニペットはパニックになります。これを防ぐには、代わりに次の操作を行う場合があります:あなたが実際に新しいWorkerへのポインタを持っているしたい場合は、あなただけのreflect.New(v.Type())reflect.Zero(v.Type())を置き換える

v := reflect.ValueOf(w) 
if reflect.TypeOf(w).Kind() == reflect.Ptr { 
    v = v.Elem() 
} 
zero := reflect.Zero(v.Type()) 

+0

私の最初の質問、〜心からありがとう、私は違い、 'fmt.Println(reflect.ValueOf(ワット).TYPE())//プリント* main.Testg' ' fmt.Println(reflect.ValueOfを見つけました(&w).Type())// print * main.Worker' 2番目の方法を使用している場合(値wの値を変更できると思います) –

+0

@linvanよろしくお願いします!はい、「&w」は本当に無駄です。それは、値へのポインタを含むインタフェースへのポインタを与えます。そして、Goのインターフェイスへのポインタを扱うことはめったにありません。 – ANisus

関連する問題