2017-09-20 1 views
0

Als Beispiel, kann ich einen Nullwert des zugrunde liegenden Typs von der Schnittstelle erhalten Arbeit?erhalten zugrunde liegenden Typ von einer bestimmten Schnittstelle in 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

Antwort

1

Da w einen Zeiger auf eine Worker enthält, können Sie es zu zeigt einen Nullwert von das Element zu erhalten. Sobald Sie das Element erhalten, können Sie einen Nullwert seiner Art erstellen:

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

Above Code-Schnipsel in Panik, wenn Sie in einem Nicht-Zeiger auf MakeSomething passieren. Um dies zu verhindern, sollten Sie die folgenden stattdessen tun:

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

Wenn Sie tatsächlich einen Zeiger auf einen neuen Worker haben wollen, müssen Sie nur reflect.Zero(v.Type()) mit reflect.New(v.Type()) ersetzen.

+0

meine erste Frage, ich danke Ihnen aufrichtig ~ fand ich den Unterschied, 'fmt.Println (reflect.ValueOf (w) .Type()) // print * main.Testg' ' fmt.Println (reflect.ValueOf (& w) .Typ()) // print * main.Worker' in dem Fall, dass ich den zweiten Weg verwende (ich denke, das kann den Wert w Punkt ändern) –

+0

@linvan Gern geschehen! Ja, '& w' ist ziemlich nutzlos, wirklich. Es gibt Ihnen einen Zeiger auf eine Schnittstelle, die einen Zeiger auf den Wert enthält. Und Sie arbeiten sehr selten (nie, wirklich) mit Zeigern auf Schnittstellen in Go. – ANisus

Verwandte Themen