Golang

2012-09-17 42 views
6

'daki işlevlerin bir işlevinden bir işlev seçilmesi Temel olarak herhangi bir rasgele işlevi olan bir dilim veya dizim varsa, yalnızca int döndürenleri seçebilir veya yalnızca inters yapanları seçebilir miyim?Golang

Yansıma paketini kullanmam gerekeceğini düşündüm, ancak yalnızca belgeleri okumak bana tam olarak nasıl yapılacağını anlamaya yardımcı olmadı.

+0

Bkz olduğunu düşünüyorsanız [golang-fındık üzerinde Konuyu] (https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs), uygulamaya çalıştığınız çözüm yerine çözmeye çalıştığınız sorunu –

+1

açıklamanıza yardımcı olabilir mi? Bunu Go’da yapmanın daha kolay bir yolu var. Denemekte olduğunuz yaklaşım türü Go'da çok garip. Yapmaya çalıştığınız şeye bağlı olarak, distroy'in önerisi tek seçeneğiniz olabilir, ancak çok daha az kafa karıştırıcı bir şey yapabileceğiniz çok iyi bir şans var. – jorelli

+0

Hayır, yapmaya çalıştığım şey aslında kafa karıştırıcı. Her düğümün bir işlev olduğu bir grafik oluşturmayı düşünün. Rastgele bir fonksiyon listesi verilen grafiklerin yerini araştırmak istiyorum. Buradaki fikir, bir fonksiyon kalibre edici ala Makine Öğrenmesi olarak kullanılabilir. Distroy'in çözümünün istediğim şey olduğuna inanıyorum. Daha güzel olabileceği bir dil önermek istiyorsanız, fikirlere açığım. C# 'nin bunu yapabileceğini duydum. – placeybordeaux

cevap

11

Bu program fonksiyonları parametre olarak bir int alarak veya dönen yazdıran bir 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) 
     } 
    } 
} 

ben kod açıklayıcı kendini