2013-03-12 6 views
5

Der folgende Code erhält einen Zeiger auf die Funktion hello und druckt es:Wie erhalten Sie einen Funktionszeiger auf eine typisierte Funktion in go?

package main 

import "fmt" 

type x struct {} 
func (self *x) hello2(a int) {} 

func hello(a int) {} 

func main() { 
    f1 := hello 
    fmt.Printf("%+v\n", f1) 

    // f2 := hello2 
    // fmt.Printf("%+v\n", f2) 
} 

Wenn ich jedoch den Abschnitt am unteren Rand un-Kommentar, die Fehler kompilieren, zu sagen: So

> ./junk.go:14: undefined: hello2 

ich habe versucht:

i := &x{} 
    f2 := &i.hello2 
    fmt.Printf("%+v\n", f2) 

... aber, dass Fehler mit:

Ok, vielleicht habe ich direkt zu den ursprünglichen Typ verweisen:

f2 := x.hello2 
    fmt.Printf("%+v\n", f2) 

Nope:

> ./junk.go:14: invalid method expression x.hello2 (needs pointer receiver: (*x).hello2) 
> ./junk.go:14: x.hello2 undefined (type x has no method hello2) 

Diese Art der Arbeiten:

i := &x{} 
    f2 := reflect.TypeOf(i).Method(0) 
    fmt.Printf("%+v\n", f2) 

jedoch die resultierende f2 ist ein reflect.Method, kein Funktionszeiger. :(

Was ist die angemessene Syntax hier?

Antwort

7

Sie Methode Ausdrücke verwenden können, die eine Funktion zurück, die den Empfänger als erstes Argument nimmt.

f2 := (*x).hello2 
fmt.Printf("%+v\n", f2) 

f2(&x{}, 123) 

Ansonsten können Sie nur die wickeln Funktionsaufruf in einer Funktion, die die x als Argument akzeptiert.

f2 := func(val *x) { 
    val.hello2(123) 
} 

Oder das schließt über eine bestehende x val Ue.

val := &x{} 

f2 := func() { 
    val.hello2(123) 
} 
+0

Dies ist eine ausgezeichnete Antwort! –