string - sufijos - Funciones de llamada con prefijo/sufijo especial
prefijos y sufijos griegos (2)
Tengo un paquete llamado "sembradora":
package seeder
import "fmt"
func MyFunc1() {
fmt.Println("I am Masood")
}
func MyFunc2() {
fmt.Println("I am a programmer")
}
func MyFunc3() {
fmt.Println("I want to buy a car")
}
Ahora quiero llamar a todas las funciones con el prefijo MyFunc
package main
import "./seeder"
func main() {
for k := 1; k <= 3; k++ {
seeder.MyFunc1() // This calls MyFunc1 three times
}
}
Quiero algo como esto:
for k := 1; k <= 3; k++ {
seeder.MyFunc + k ()
}
y esta salida:
I am Masood I am a programmer I want to buy a car
EDITAR1 : en este ejemplo, parentKey es una variable de cadena que cambió en un bucle
for parentKey, _ := range uRLSjson{
pppp := seeder + "." + strings.ToUpper(parentKey)
gorilla.HandleFunc("/", pppp).Name(parentKey)
}
Pero GC dijo:
uso de sembradora de paquetes sin selector
No puede obtener una función por su nombre, y eso es lo que está tratando de hacer. La razón es que si la herramienta Go puede detectar que una función no se menciona explícitamente (y, por lo tanto, es inalcanzable), es posible que ni siquiera se compile en el binario ejecutable. Para más detalles, consulte División de código de cliente / servidor .
Con un registro de funciones
Una forma de hacer lo que quiere es crear un "registro de funciones" antes de llamarlos:
registry := map[string]func(){
"MyFunc1": MyFunc1,
"MyFunc2": MyFunc2,
"MyFunc3": MyFunc3,
}
for k := 1; k <= 3; k++ {
registry[fmt.Sprintf("MyFunc%d", k)]()
}
Salida (pruébalo en Go Playground ):
Hello MyFunc1
Hello MyFunc2
Hello MyFunc3
Enrutamiento manual
Similar al registro es inspeccionar el nombre y enrutar manualmente a la función, por ejemplo:
func callByName(name string) {
switch name {
case "MyFunc1":
MyFunc1()
case "MyFunc2":
MyFunc2()
case "MyFunc3":
MyFunc3()
default:
panic("Unknown function name")
}
}
Utilizándolo:
for k := 1; k <= 3; k++ {
callByName(fmt.Sprintf("MyFunc%d", k))
}
Prueba esto en Go Playground .
Nota:
callByName()
usted si desea llamar a la función identificada por su nombre en la función auxiliar
callByName()
, o puede elegir devolver un valor de función (de tipo
func()
) y hacer que se llame en lugar de la persona que llama.
Transformando funciones a métodos
También tenga en cuenta que si sus funciones realmente fueran
métodos
de algún tipo, podría hacerlo sin un registro.
Mediante la reflexión, puede obtener un método por su nombre:
Value.MethodByName()
.
También puede obtener / enumerar todos los métodos sin conocer sus nombres usando
Value.NumMethod()
y
Value.Method()
(también vea
Type.NumMethod()
y
Type.Method()
si necesita el nombre del método o sus tipos de parámetros )
Así es como se podría hacer:
type MyType int
func (m MyType) MyFunc1() {
fmt.Println("Hello MyFunc1")
}
func (m MyType) MyFunc2() {
fmt.Println("Hello MyFunc2")
}
func (m MyType) MyFunc3() {
fmt.Println("Hello MyFunc3")
}
func main() {
v := reflect.ValueOf(MyType(0))
for k := 1; k <= 3; k++ {
v.MethodByName(fmt.Sprintf("MyFunc%d", k)).Call(nil)
}
}
La salida es la misma. Pruébalo en Go Playground .
Otra alternativa sería abarcar una variedad de funciones.
package main
import (
"fmt"
)
func MyFunc1() {
fmt.Println("I am Masood")
}
func MyFunc2() {
fmt.Println("I am a programmer")
}
func MyFunc3() {
fmt.Println("I want to buy a car")
}
func main() {
for _, fn := range []func(){MyFunc1, MyFunc2, MyFunc3} {
fn()
}
}