Primeros pasos con Go

Lección 1 de 8. En veinte minutos vas a tener Go instalado, un programa funcionando y una idea clara de por qué el compilador te va a regañar más de lo que esperas. Esto último no es un defecto: es el rasgo que más define al lenguaje.

El programa más pequeño que existe

Crea una carpeta vacía y dentro un archivo main.go:

package main

import "fmt"

func main() {
	fmt.Println("Hola, Go")
}

Tres piezas, y las tres son obligatorias:

Pieza Qué significa
package main Este archivo pertenece al paquete main, que es el único que produce un ejecutable. Cualquier otro nombre produce una biblioteca
import "fmt" Trae el paquete de formato e impresión de la biblioteca estándar. fmt se pronuncia «fumt» y viene de format
func main() Por donde empieza el programa. Sin parámetros y sin devolver nada

Antes de ejecutar: el módulo

Go necesita saber cómo se llama lo que estás construyendo. Eso se declara una sola vez, al principio:

go mod init ejemplo/saludo
salidago: creating new go.mod: module ejemplo/saludo

Aparece un archivo go.mod de dos líneas con ese nombre y la versión de Go. Un módulo es simplemente una carpeta con un go.mod dentro: a partir de ahí, todo lo que cuelgue es tu proyecto, y ahí se irán anotando las dependencias si algún día usas alguna.

El nombre puede ser cualquiera mientras el proyecto sea tuyo y local. Si algún día lo publicas, se usa la ruta del repositorio, como github.com/usuario/saludo, porque es así como lo encontrarán los demás.

Ejecutarlo

Hay dos maneras y conviene saber cuándo usar cada una.

go run .
salidaHola, Go

go run compila y ejecuta en un paso, dejando el binario en una carpeta temporal. Es lo que vas a usar mientras aprendes y mientras pruebas cosas.

go build -o hola .
./hola
salidaHola, Go

go build deja el ejecutable en el disco. Ese archivo pesa un par de megas y no depende de nada: puedes copiarlo a otra máquina con el mismo sistema y funciona, sin instalar Go allí.

El punto no es un adorno. go run . significa «compila el paquete de este directorio». También funciona go run main.go, pero solo mientras tu programa quepa en un archivo; en cuanto haya dos, el punto es lo correcto y lo que conviene acostumbrarse a escribir.

Lo que más sorprende al principio: el compilador no perdona

Go considera errores de compilación dos cosas que en otros lenguajes son, como mucho, un aviso. La primera, importar algo y no usarlo:

import (
	"fmt"
	"os"      // importado y nunca usado
)
no compila./main.go:5:2: "os" imported and not used

La segunda, declarar una variable local y no leerla nunca:

func main() {
	total := 10      // declarada y nunca usada
	fmt.Println("hola")
}
no compila./main.go:6:2: declared and not used: total

La primera vez irrita. Después se agradece: esos dos avisos son la firma del código a medio terminar, y al convertirlos en errores el lenguaje garantiza que lo que compila está, al menos, completo. Si de verdad necesitas una variable que no usas, el guion bajo le dice al compilador «ya lo sé, déjalo pasar»: _ = total.

Ojo, solo las locales. La regla de la variable sin usar se aplica a las variables dentro de una función. Las de paquete, declaradas fuera, pueden quedarse sin usar sin que el compilador diga nada.

El formato no se discute

Go trae un formateador, gofmt, y define un único estilo correcto. No es configurable, y esa es justamente la idea: nadie discute dónde van las llaves porque no hay nada que discutir. Escribe esto, con el formato que quieras:

package main

import "fmt"
func main(){
x:=3
fmt.Println( x )
}

Y pásale el formateador:

gofmt feo.go
salidapackage main

import "fmt"

func main() {
	x := 3
	fmt.Println(x)
}

Tabuladores para indentar, espacio tras las comas, línea en blanco entre bloques. Casi todos los editores lo ejecutan al guardar; si usas Visual Studio Code con la extensión oficial de Go, ya viene activado. Déjalo así y no vuelvas a pensar en el formato.

La caja de herramientas, de un vistazo

Orden Para qué
go mod init nombre Empieza un proyecto. Una vez y ya
go run . Compila y ejecuta. El del día a día
go build -o nombre . Deja el ejecutable en el disco
gofmt -w . Formatea todo el proyecto. La -w escribe los cambios
go vet ./... Busca errores que compilan pero están mal
go test ./... Ejecuta las pruebas. Lo vemos en la lección 8

Lo que hay que llevarse

Un archivo con package main y una func main(), un go.mod al lado y go run . para probar. Con eso ya puedes escribir cualquier cosa de la lección siguiente. Y una idea de fondo que va a repetirse en todo el curso: cuando Go te parezca estricto o escaso, casi siempre es a propósito.

Todo el código de esta lección se compiló y ejecutó con Go 1.25 antes de publicarla, incluidos los dos errores: están provocados a propósito y los mensajes son los que devuelve el compilador, copiados literalmente.