tercero sufijos significado prefijos para niƱos lista griegos ejercicios ejemplos basico string function go

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() } }