print nil golang from entry assignment array map go key-value func

nil - map string interface golang



Ir mapa de funciones (4)

¿Estás tratando de hacer algo como esto? He revisado el ejemplo para usar diferentes tipos y números de parámetros de funciones.

package main import "fmt" func f(p string) { fmt.Println("function f parameter:", p) } func g(p string, q int) { fmt.Println("function g parameters:", p, q) } func main() { m := map[string]interface{}{ "f": f, "g": g, } for k, v := range m { switch k { case "f": v.(func(string))("astring") case "g": v.(func(string, int))("astring", 42) } } }

Tengo un programa Go que tiene una función definida. También tengo un mapa que debe tener una clave para cada función. ¿Cómo puedo hacer eso?

Lo he intentado, pero esto no funciona.

func a(param string) { } m := map[string] func { ''a_func'': a, } for key, value := range m { if key == ''a_func'' { value(param) } }


La respuesta de @Seth Hoenig me ayudó mucho, pero solo quería agregar que Go también acepta funciones con un valor de retorno definido:

package main func main() { m := map[string]func(string) string{ "foo": func(s string) string { return s + "nurf" }, } m["foo"]("baz") // "baznurf" }

Si crees que es feo, siempre puedes usar un tipo (mira la respuesta de @smagch ).


Puede definir un tipo si las funciones son la misma interfaz.

package main import "log" type fn func (string) func foo(msg string) { log.Printf("foo! Message is %s", msg) } func bar(msg string) { log.Printf("bar! Message is %s", msg) } func main() { m := map[string] fn { "f": foo, "b": bar, } log.Printf("map is %v", m) m["f"]("Hello") m["b"]("World") }


m := map[string]func(string, string)

Funciona si conoces la firma (y todos los funcs tienen la misma firma). Creo que es más limpio / seguro que usar la interfaz {}