2014-01-28 9 views
15

Golang "fmt" Paket hat Dump-Methode Printf("%+v", anyStruct).Wie Methoden von Strukturen in Golang dump?

Ich bin auf der Suche nach einer Methode zum Dump-Struktur auch dumping Methoden. wie

type Foo struct { 
    Prop string 
} 
func (f Foo)Bar() string { 
    return f.Prop 
} 

möchte ich (nicht nur Objekte) Existenz von „Bar“ -Methode in initialisierte Instanz vom Typ „Foo“ überprüfen.

Gibt es einen guten Weg, dies zu tun?

Antwort

23

Sie können die Methoden eines Typs mit dem reflect-Paket auflisten. Zum Beispiel:

fooType := reflect.TypeOf(Foo{}) 
for i := 0; i < fooType.NumMethod(); i++ { 
    method := fooType.Method(i) 
    fmt.Println(method.Name) 
} 

Mit diesem hier rumspielen können: http://play.golang.org/p/wNuwVJM6vr

Mit dem im Verstand, wenn Sie, ob ein Typ eine bestimmte Methode Satz überprüfen möchten implementiert, könnten Sie finden es einfacher, Schnittstellen zu verwenden, und eine Typassertion. Zum Beispiel:

func implementsBar(v interface{}) bool { 
    type Barer interface { 
     Bar() string 
    } 
    _, ok := v.(Barer) 
    return ok 
} 

... 
fmt.Println("Foo implements the Bar method:", implementsBar(Foo{})) 

Oder wenn Sie nur wollen, was zu einer Kompilierung Behauptung beträgt, dass eine bestimmte Art die Methoden hat, können Sie einfach schließen die folgenden irgendwo:

var _ Barer = Foo{} 
+0

Vielen Dank !! Ich wollte das Paket "reflect" nicht verwenden, daher sieht dein Vorschlag mit der Benutzeroberfläche so cool für mich aus! – otiai10