Go y Golang

Go: error con JSON y arreglo vacío

En este artículo expongo un pequeño error que sucede con Go (supongo que no es un bug sino que simplemente así se comporta el lenguaje) al declarar un arreglo vacío.

Lo que sucede es que cuando se declara un arreglo de structs y el mismo está vacío, al ser codificado como JSON el arreglo es null en lugar de [].

En otras palabras: go codifica (con JSON)  un arreglo vacío como null en lugar de como un arreglo vacío [].

Explicación del problema

Como lo dije, el problema es que al declarar el arreglo vacío, es nil, en lugar de que sea un arreglo vacío.

Por ejemplo, en el siguiente código, si codificamos el arreglo vacío como JSON será null:

package main

import "fmt"
import "encoding/json"

type Usuario struct {
 Nombre string
}

func main() {
 var usuarios []Usuario
 usuariosCodificados, _ := json.Marshal(usuarios)
 fmt.Printf("El arreglo es: %s", string(usuariosCodificados))
}

La salida es “El arreglo es: null” cuando en realidad debería ser [] indicando un arreglo vacío. Pero esto solo pasa cuando lo declaro de esa forma.

Puedes probarlo en este enlace.

Solución del problema

Para arreglarlo lo único que hice fue declarar la variable con duck typing, así:

usuarios := []Usuario{}

El código se ve así:

package main

import "fmt"
import "encoding/json"

type Usuario struct {
 Nombre string
}

func main() {
 usuarios := []Usuario{}
 usuariosCodificados, _ := json.Marshal(usuarios)
 fmt.Printf("El arreglo es: %s", string(usuariosCodificados))
}

No sé qué cambia además de las llaves al final (un experto en Go sabrá) pero al codificarlo como json la salida es correcta. Puedes probar el programa en este enlace.

Conclusión

Este es un problema que me afectaba pues al crear una API con Go e iterar el arreglo se generaba un error, pues no se puede recorrer null.

En cambio, cuando es un arreglo vacío, el error no sucede, pues sí se puede recorrer aunque esté vacío.

Como lo dije, yo no sé si este error sea un error, tal vez es el comportamiento esperado y simplemente no leí bien o no entendí esa parte.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Cancelar trabajo de impresión con C++

En este post te quiero compartir un código de C++ para listar y cancelar trabajos…

4 semanas hace

Copiar bytes de Golang a JavaScript con WebAssembly

Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…

2 meses hace

Imprimir PDF con Ghostscript en Windows de manera programada

Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…

2 meses hace

Hacer pruebas en impresora térmica Bluetooth Android

Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a…

2 meses hace

Limpiar clave PEM

Hoy te enseñaré a extraer la cadena base64 de una clave PEM usando una función…

2 meses hace

Foco con Telegram, apagador de 3 vías, relevador y ESP8266

Encender un foco con un Bot de Telegram es posible usando una tarjeta como la…

2 meses hace