2012-09-17 7 views
6

Fondamentalmente se ho una sezione o una matrice di funzioni arbitrarie, come posso selezionare solo quelle che restituiscono int o selezionare solo quelle che contengono?Selezione di una funzione da un elenco di funzioni in Golang

Ho pensato che avrei bisogno di utilizzare il pacchetto reflect, ma la semplice lettura dei documenti non mi ha aiutato a capire esattamente come farlo.

+0

Vedere se [questa discussione su golang-dadi] (https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs) aiuta –

+1

puoi spiegare il problema che stai cercando di risolvere al posto della soluzione che stai cercando di implementare? C'è probabilmente un modo più semplice per farlo in Go. Il tipo di approccio che stai tentando è molto imbarazzante in Go. A seconda di ciò che stai cercando di fare, il suggerimento di dystroy potrebbe essere la tua unica opzione, ma ci sono buone possibilità che tu possa fare qualcosa di molto meno confuso. – jorelli

+0

No, quello che sto cercando di fare è in realtà confuso. Prendi in considerazione la creazione di un grafico in cui ogni nodo è una funzione. Voglio cercare nello spazio dei grafici dato un elenco arbitrario di funzioni. L'idea sarebbe che possa essere usato come approssimatore di funzioni per Machine Learning. Credo che la soluzione di distosteria sia ciò che voglio. Se vuoi suggerire un linguaggio in cui sarebbe più bello, sono aperto alle idee. Ho sentito che C# potrebbe farlo. – placeybordeaux

risposta

11

Questo programma stampa le funzioni prendere un int come parametro o la restituzione di un 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) 
     } 
    } 
} 

Credo che il codice si spiega da sé

Problemi correlati