Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

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 string
package 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.

Este post, tomo como referencia la publicación de Vicky Kurniawan https://medium.com/@vicky.kurniawan/go-call-a-function-from-string-name-30b41dcb9e12 el cual presenta un punto de vista un poco más compleja

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
Category: go
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category