En Go, no se pierde tiempo discutiendo si una llave debe ir en la misma línea o en la siguiente, o si es mejor usar espacios o tabuladores. Esto se debe a la existencia de gofmt, una herramienta que impone un formato único y determinista para todo el código escrito en este lenguaje. En lugar de que cada programador tenga su propio estilo, gofmt actúa como un estándar universal que organiza la indentación (usando tabuladores), el espaciado alrededor de operadores y la alineación de las importaciones (imports).
Esta decisión de diseño responde a una filosofía de productividad: eliminar el “bikeshedding” o debates triviales sobre estética en las revisiones de código. Cuando ejecutas gofmt, la herramienta transforma tu código desordenado en una versión limpia y estandarizada. Si quieres ver qué cambios haría sin aplicarlos realmente, puedes usar el comando gofmt -d para ver el diff (la diferencia entre el original y el formateado). Si deseas que los cambios se guarden directamente en el archivo sin tener que copiar y pegar, utilizas gofmt -w (el flag write).
Para un flujo de trabajo profesional, no basta con ejecutarlo manualmente; lo ideal es configurar tu editor de código para que ejecute gofmt automáticamente cada vez que guardes un archivo. Además, existe goimports, una herramienta que hace lo mismo que gofmt pero con un valor añadido: detecta si te falta alguna librería o si te sobra una, añadiendo o eliminando las líneas de import automáticamente.
Aunque no usarlo no impedirá que tu programa compile y funcione, romperás la fluidez del equipo. Si envías código mal formateado, los archivos de cambios (diffs) en sistemas como Git estarán llenos de “ruido” visual (cambios de espacios que no afectan la lógica), lo que dificulta que tus compañeros encuentren los cambios reales en la funcionalidad.
package main
import (
"fmt"
"math"
)
// main es el punto de entrada del programa.
func main() {
// gofmt asegura que haya un tabulador de sangría aquí.
// También asegura el espaciado correcto después de la coma.
valor := calcularPotencia(2.0, 10.0)
fmt.Printf("El resultado de 2 elevado a la 10 es: %v\n", valor)
}
// calcularPotencia demuestra la alineación y el espaciado consistente.
func calcularPotencia(base, exponente float64) float64 {
// El operador matemático tiene un espacio limpio a cada lado.
return math.Pow(base, exponente)
}
En el ejemplo anterior, podemos observar la mano de gofmt en varios puntos clave. Primero, en el bloque de import, las librerías fmt y math están agrupadas y alineadas correctamente. Si hubieras escrito las importaciones de forma desordenada, gofmt las habría organizado.
Dentro de la función main, la línea de fmt.Printf no utiliza espacios para la sangría, sino un tabulador real; esto es fundamental para mantener la consistencia en todo el ecosistema Go. Además, fíjate en la firma de la función calcularPotencia(base, exponente float64). gofmt optimiza el espaciado en los parámetros cuando comparten el mismo tipo, evitando redundancias visuales. Finalmente, la expresión math.Pow(base, exponente) mantiene un espaciado quirúrgico alrededor de los argumentos, facilitando la lectura rápida del flujo de datos.
El error frecuente
Un error común para quienes vienen de otros lenguajes es intentar “pelear” con el formateador o intentar configurar gofmt para que use espacios en lugar de tabuladores. Puedes hacerlo, pero estarás yendo en contra de la cultura de Go.
Si un desarrollador en un equipo usa espacios y otro usa gofmt (que usa tabs), el historial de Git se llenará de cambios de formato en cada Pull Request. Esto hace que sea imposible rastrear si una línea de código cambió su lógica o si simplemente se le cambió el espacio por un tabulador.
Configura tu editor para que ejecute gofmt al guardar y olvídate para siempre de discutir sobre estilos en las reuniones de equipo.
N° 17