DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

Simular un array asociativo(map) con tipos dinámicos en Golang

Seguramente si venís de lenguajes de programación con tipado dinámico como Javascript o Python, te preguntaste como es posible guardar en un map distintos tipos de datos incluso sin saber que tipo de dato estás guardando. La respuesta es que si nos llevamos solamente por las reglas que Golang nos impone para programar, esto no se podría ni debería hacer. Pero por obvias razones en algún momento vas a necesitar hacerlo, y para lograrlo hay que utilizar interfaces vacías.

¿Por qué utilizar interfaces vacías? Porque estas pueden almacenar cualquier tipo de dato, tan simple como eso.

Vamos a ver un ejemplo sencillo:


claveValor := make(map[string]interface{})
claveValor["uno"] = 4
claveValor["dos"] = false
claveValor["tres"] = "Esto es una cadena"
claveValor["cuatro"] = 20.54

fmt.Println(claveValor)

=> map[cuatro:20.54 dos:false tres:Esto es una cadena uno:4]
Enter fullscreen mode Exit fullscreen mode

Por lo que ya sabes, sino sabes que tipo de datos vas a almacenar en un map, o simplemente te es indiferente, cuando lo declares especificale que e tipo de valor es una interface y te olvidas del problema.

Incluso si queremos ponernos más sucios, podemos declarar que tanto clave como valor serán interfaces, entonces da igual todo:

claveValor := make(map[interface{}]interface{})

claveValor[5] = 4
claveValor[true] = false
claveValor["tres"] = "Esto es una cadena"
claveValor["cuatro"] = 20.54

fmt.Println(claveValor)
=> map[true:false 5:4 cuatro:20.54 tres:Esto es una cadena]
Enter fullscreen mode Exit fullscreen mode

Porsupuesto que esto es solo para mostrar lo que se puede logar, no creo que sea muy recomendable hacer esto último.

Top comments (2)

Collapse
 
davdomin profile image
David Dominguez

Usar interfaces vacías puede ser una herramienta útil, pero es importante usarlo con cuidado. Si no sabes qué tipo de datos vas a almacenar en un map, o simplemente te es indiferente, usar una interface{} puede ser una buena opción. Sin embargo, es importante tener en cuenta que usar interfaces vacías puede hacer que tu código sea menos seguro y más difícil de mantener. Por lo tanto, es importante usar interfaces vacías de manera segura y eficiente.

Collapse
 
nahuelsegovia profile image
Nahuel Segovia

Gracias por comentar, no lo había visto.
Sí, adhiero a tu comentario, no creo que sea muy seguro estar usando interfaces vacías para escaparle al tipado todo el tiempo.

Me gustaría hacer más cosas con Golang pero últimamente vengo muy metido con Typescript y Python.

Abrazo!