2012-09-17 14 views
6

Grundsätzlich, wenn ich eine Scheibe oder ein Array von beliebigen Funktionen habe, wie kann ich nur diejenigen auswählen, die int zurückgeben, oder nur diejenigen auswählen, die int sind?Eine Funktion aus einer Liste von Funktionen in Golang auswählen

Ich dachte mir, dass ich das Reflect-Paket verwenden müsste, aber das Lesen der Dokumente hat mir nicht wirklich geholfen, genau herauszufinden, wie es geht.

+0

Sehen Sie, wenn [dieses Thema auf golang Muttern] (https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs) hilft –

+1

Können Sie das Problem erklären, das Sie lösen möchten, anstatt die Lösung, die Sie implementieren möchten? Es gibt wahrscheinlich einen einfacheren Weg, dies in Go zu tun. Die Art der Vorgehensweise, die Sie versuchen, ist in Go sehr umständlich. Je nachdem, was Sie versuchen, ist der Vorschlag von dystroy möglicherweise Ihre einzige Option, aber es besteht eine sehr gute Chance, dass Sie etwas viel weniger Verwirrendes tun können. – jorelli

+0

Nein, was ich versuche zu tun ist in der Tat verwirrend. Erwägen Sie, ein Diagramm zu erstellen, in dem jeder Knoten eine Funktion ist. Ich möchte den Raum von Graphen mit einer beliebigen Liste von Funktionen durchsuchen. Die Idee wäre, dass es als Funktion approximator ala Machine Learning verwendet werden kann. Ich glaube, dass die Lösung von Dystroy ist, was ich will. Wenn Sie eine Sprache vorschlagen möchten, in der es schöner wäre, bin ich offen für Ideen. Ich habe gehört, dass C# es könnte. – placeybordeaux

Antwort

11

Dieses Programm druckt die Funktionen ein int als Parameter genommen wird oder die Rückkehr eines int:

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    funcs := make([]interface{}, 3, 3) // I use interface{} to allow any kind of func 
    funcs[0] = func (a int) (int) { return a+1} // good 
    funcs[1] = func (a string) (int) { return len(a)} // good 
    funcs[2] = func (a string) (string) { return ":("} // bad 
    for _, fi := range funcs { 
     f := reflect.ValueOf(fi) 
     functype := f.Type() 
     good := false 
     for i:=0; i<functype.NumIn(); i++ { 
      if "int"==functype.In(i).String() { 
       good = true // yes, there is an int among inputs 
       break 
      } 
     } 
     for i:=0; i<functype.NumOut(); i++ { 
      if "int"==functype.Out(i).String() { 
       good = true // yes, there is an int among outputs 
       break 
      } 
     } 
     if good { 
      fmt.Println(f) 
     } 
    } 
} 

Ich denke, der Code ist selbsterklärend