GO: Llamar una función a partir de un valor string con reflect
Tratando de realizar un pequeño programita en go me topé con este desafío: ¿Cómo llamo una función u otra dependiendo de un valor obtenido?
Bueno, por suerte Go posee el package reflect y es este el que nos permitirá realizar dicha acción
llamando una funcion segun un valor stringpackage main import ( "fmt" "reflect" ) func greet(name string) string { return "Welcome to " + name } func main() { functions := make(map[string]interface{}) functions["greet"] = greet function := reflect.ValueOf(functions["greet"]) arguments := []reflect.Value{reflect.ValueOf("Blastcoding.com")} result := function.Call(arguments) fmt.Println(result[0].String()) }
En el ejemplo anterior puede ver que utilizamos interface{} este tipo de valor nos permitirá almacenar cualquier tipo de valor en el map.
Tenga en cuenta que cuando llamamos a reflect.ValueOf estamos creando un reflect.Value
type Value struct { // contains filtered or unexported fields }
Value
es la interfaz de reflexión a un valor de Go, es una representación de un valor de cualquier tipo en Go en tiempo de ejecución. De esta manera estamos reflejando nuestra función haciendo una función dinámica.
Call
llama la función function
con el input arguments
como parámetro.
function.Call(arguments)
Por otro lado, podríamos separar las funciones de la función main() para poder usarlas como si de rutas se trataran, esto podría ser bueno si estamos utilizando astielectron por ejemplo, ya que no es tan fácil de comunicarse entre Go y JavaScript y viceversa.
package main import ( "fmt" "reflect" ) var functions = map[string]interface{}{ "greet": greet, } func greet(name string) string { return "Welcome to " + name } func main() { function := reflect.ValueOf(functions["greet"]) arguments := []reflect.Value{reflect.ValueOf("Blastcoding.com")} result := function.Call(arguments) fmt.Println(result[0].String()) }
Si este post no es lo que buscas, chequea la publicación de Vicky K talvez si sea lo que buscas.
Referencias
- https://pkg.go.dev/reflect
- https://medium.com/@vicky.kurniawan/go-call-a-function-from-string-name-30b41dcb9e12