2012-09-17 15 views
6

Zasadniczo, jeśli mam plaster lub tablicę dowolnych dowolnych funkcji, jak mogę wybrać tylko te, które zwracają int, lub wybierz tylko te, które biorą int?Wybieranie funkcji z listy funkcji w Golang

Doszedłem do wniosku, że będę musiał użyć pakietu reflect, ale samo przeczytanie dokumentów naprawdę nie pomogło mi dokładnie określić, jak to zrobić.

+0

Sprawdź, czy [ten wątek na golang-nakrętkami] (https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs) pomaga –

+1

wyjaśnić problem, który próbujesz rozwiązać zamiast rozwiązania, które próbujesz wdrożyć? Najprawdopodobniej jest to łatwiejszy sposób w Go. Typ podejścia, który próbujesz, jest bardzo niezręczny w programie Go. W zależności od tego, co próbujesz zrobić, sugestia Dystroya może być Twoją jedyną opcją, ale istnieje bardzo duża szansa, że ​​możesz zrobić coś mniej mylącego. – jorelli

+0

Nie, to, co próbuję zrobić, jest w rzeczywistości mylące. Rozważ utworzenie wykresu, w którym każdy węzeł jest funkcją. Chcę przeszukiwać przestrzeń wykresów, biorąc pod uwagę dowolną listę funkcji. Pomysł polegałby na tym, że może on służyć jako przybliżenie funkcji ala uczenie maszynowe. Uważam, że rozwiązaniem jest dystroza. Jeśli chcesz zaproponować język, w którym byłoby ładniej, jestem otwarty na pomysły. Słyszałem, że C# może to zrobić. – placeybordeaux

Odpowiedz

11

Ten program wypisuje funkcje robienia int jako parametr lub zwrócenie 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) 
     } 
    } 
} 

myślę, że kod jest wymowne