2012-09-17 20 views
6

基本的に、任意の関数のスライスまたは配列がある場合、intを返すものだけを選択するか、intを取るものだけを選択するにはどうしたらいいですか?Golangの関数リストから関数を選択する

私はリフレクションパッケージを使う必要があると思ったが、ドキュメントを読むだけでは、どうやってそれを行うのかが分かりませんでした。

+0

[golang-ナットでこのスレッド]かどうかを確認し(HTTPSであると思います:/ /groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs)助けて –

+1

あなたが実装しようとしているソリューションの代わりに解決しようとしている問題について説明できますか? Goでこれを行う簡単な方法があります。試行しているアプローチのタイプは、Goでは非常に面倒です。あなたがしようとしていることに応じて、dystroyの提案はあなたの唯一の選択肢かもしれませんが、はるかに紛らわしいことをすることができる非常に良い機会があります。 – jorelli

+0

いいえ、私がやっていることは、実際には混乱しています。各ノードが関数であるグラフを作成することを検討してください。任意の関数リストを与えられたグラフの空間を検索したい。その考え方は、機械学習の関数近似器として使用できるということです。私はディストロイの解決策が私が望むものだと信じています。あなたがより良い言語を提案したいのであれば、私はアイデアを公開しています。私はC#がそれを行うことができると聞いた。 – placeybordeaux

答えて

11

このプログラムは、関数は、パラメータとしてintを取るか、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) 
     } 
    } 
} 

Iコードが自己説明

関連する問題