2012-09-17 4 views
6

기본적으로 임의의 함수 또는 슬라이스가있는 경우 int를 반환하는 것들만 선택하거나 int를 취하는 것들만 선택할 수 있습니까?Golang의 함수 목록에서 함수 선택

나는 반사 패키지를 사용해야한다고 생각했지만, 문서를 읽는 것만으로 정확히 어떻게해야하는지 정확하게 알 수 없었습니다.

+0

참조이라고 생각하면 [golang 너트에이 스레드 (은 https ://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs) 도움을 받으십시오. –

+1

구현하려는 솔루션 대신 해결하려는 문제를 설명 할 수 있습니까? Go에서이 작업을 수행하는 더 쉬운 방법이 있습니다. 시도중인 접근 유형은 Go에서 매우 어색합니다. 당신이하려는 일에 따라, 디스트로이의 제안이 유일한 선택 일 수도 있지만, 혼란스럽지 않은 일을 할 수있는 아주 좋은 기회가 있습니다. – 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) 
     } 
    } 
} 

나는 코드가 설명 자기