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 {}