2016-05-16 4 views
1

Dies ist eine sehr direkte Frage.So initialisieren Sie einen leeren Zeiger durch reflect

Wie implementieren Sie Initialize() unten mit reflect? Oder ist das möglich?

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: ""} 

    // ... 
} 

`` `

Antwort

3

Hier ist, wie es zu tun:

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

Diese Funktion muss mit einem Zeiger auf den Wert aufgerufen werden einzustellen:

Initialize(&val) 

playground example

Der Code in dieser Antwort reagiert in Panik, wenn der Argumenttyp kein Zeiger auf einen Zeiger ist. Abhängig von Ihrer Verwendung sollten Sie das Reflect valuekind überprüfen, bevor Sie Elem() aufrufen.

+0

Es gibt also keine Möglichkeit, 'Initialize' zu ​​implementieren, also' Initialize (val) 'funktioniert, richtig? –

+1

Korrigieren. Das liegt daran, dass Argumente in Go als Wert übergeben werden. –