2016-07-26 8 views
-1

Im Moment habe ich den folgenden CodeHolen Struktur von Funktionstyp

func (r *Router) Get(path string, controller interface{}) { 
    ... 
    t := reflect.TypeOf(controller) 
    ... 
} 

, dass die folgenden

Route.Get("/", controllers.Test.IsWorking) 

Das zweite Argument genannt tut, ist im Grunde diese

type Test struct { 
    *Controller 
    Name string 
} 

func (t Test) IsWorking() { 

} 

type Controller struct { 
    Method string 
    Request *http.Request 
    Response http.ResponseWriter 
    Data  map[interface{}]interface{} 
} 

ich will Holen Sie sich die Struktur, auf die sich die Funktion bezieht. eine neue Struktur dieses Typs erstellen und die Funktion aufrufen, so zum Beispiel

controllers.Test.IsWorking

eine Test-Struktur erstellen und rufen IsWorking()

Antwort

0

Um einen neuen Zeiger auf eine neu zugewiesene Struktur zu machen in der Schnittstelle des Typs, alles, was Sie brauchen, ist

newController := reflect.New(reflect.TypeOf(controller)).Interface() 

Oder Wert auf die neue Instanz setzen zuerst:

newController := reflect.New(reflect.TypeOf(controller)) 
newController.Elem().FieldbyName("Method").Set(reflect.ValueOf("GET")) 

Wenn Sie einen Zeiger auf eine Struktur erstellen möchten und rufen Sie die IsWorking Methode, es sieht aus wie

t := reflect.New(reflect.TypeOf(Test{})) 
t.MethodByName("IsWorking").Call(nil) 
+0

Ich denke nicht, das ist, was ich suche. oder vielleicht ist es aber gut. Ich möchte die Struktur erhalten, auf die sich die Funktion bezieht, die Felder dieser Struktur ausfüllen und die Funktion aufrufen, die übergeben wird. Dies ist, um einen neuen Controller zu erstellen und die Felder Nein? Ich meine, das ist auch ein Teil dessen, was ich suche. –

+0

@AlvaroCarvajalNakosmai: Sie sagten, Ihre Methode erwartet keinen Zeiger, aber Sie können den Wert einer Struktur nicht ändern, wenn Sie keinen Zeiger darauf haben. – JimB

+0

Stimmt, ich bin heute ein bisschen abseits. Ich möchte nicht den Wert einer Struktur bearbeiten, sondern erstellen Sie es auf der Laufzeit, wenn die Funktion Controller.Test.IsWorking eine Test-Struktur erstellen und rufen Sie die Test.IsWorking-Funktion mit der neu erstellten Struktur, die ich die Felder setzen kann ich denke, –