2012-09-17 10 views
6

Básicamente, si tengo un sector o una matriz de funciones arbitrarias, ¿cómo puedo seleccionar solo las que devuelven int, o seleccionar solo las que toman ints?Seleccionar una función de una lista de funciones en Golang

Pensé que necesitaría usar el paquete de reflejo, pero solo leer los documentos realmente no me ayudó a encontrar exactamente cómo hacerlo.

+0

A ver si [este hilo en golang-tuercas] (https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs) ayuda –

+1

¿Puedes explicar el problema que estás tratando de resolver en lugar de la solución que intentas implementar? Es probable que haya una forma más fácil de hacerlo en Go. El tipo de enfoque que estás intentando es muy incómodo en Go. Dependiendo de lo que trates de hacer, la sugerencia de dystroy puede ser tu única opción, pero hay muchas posibilidades de que puedas hacer algo mucho menos confuso. – jorelli

+0

No, lo que estoy tratando de hacer es, de hecho, confuso. Considere crear un gráfico donde cada nodo sea una función. Quiero buscar en el espacio de gráficos dada una lista arbitraria de funciones. La idea sería que se pueda usar como un aproximador de funciones a nivel de Machine Learning. Creo que la solución de dystroy es lo que quiero. Si desea sugerir un idioma en el que sería más agradable, estoy abierto a las ideas. He oído que C# podría hacerlo. – placeybordeaux

Respuesta

11

Este programa imprime las funciones teniendo un int como parámetro o devolver 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) 
     } 
    } 
} 

Creo que el código se explica por sí

Cuestiones relacionadas