Aquí está el programa completo. Pulsa Run.
Ninguna de estas líneas es opcional. El resto de esta página explica qué hace cada una.
Línea por línea
package main
Todo archivo Go empieza con una cláusula package que nombra el paquete al que pertenece. El nombre main es especial: marca el paquete como un programa ejecutable. Cualquier otro nombre (package utils, package hello) crea una librería que otro código importa pero que no puede ejecutarse por sí sola.
import "fmt"
import trae otro paquete para que puedas usarlo. fmt es el paquete de formato e impresión de la librería estándar. Después del import, sus nombres exportados se alcanzan a través del nombre del paquete: fmt.Println, fmt.Printf, fmt.Sprintf.
Para importar varios paquetes, usa un bloque entre paréntesis con una ruta por línea:
import (
"fmt"
"strings"
)
Go se niega a compilar un archivo que importa un paquete que no usa. Eso mantiene honestas las listas de dependencias, y es el primer error con el que se topa casi todo el mundo.
func main()
func declara una función. main en el paquete main es el punto de entrada: el programa empieza cuando empieza main y termina cuando main retorna. No recibe argumentos ni devuelve nada. Los argumentos de línea de comandos vienen de os.Args, y los códigos de salida de os.Exit.
fmt.Println("Hello, World!")
Println imprime sus argumentos, pone un espacio entre ellos y añade un salto de línea. El nombre empieza por mayúscula porque solo los nombres con mayúscula inicial se exportan de un paquete. fmt.println con p minúscula es un error de compilación.
Imprimir algo más que un string
Println recibe cualquier número de valores de cualquier tipo. Printf te da control sobre el formato:
%s se sustituye por un string y %d por un entero. Printf y Print no añaden salto de línea, así que escribes tú el \n. La tabla completa de verbos está en la página de fmt.Printf.
Ejecútalo en tu máquina
Con Go instalado, guarda el programa como main.go en una carpeta vacía y ejecútalo:
go run main.go
Hello, World!
go run compila el archivo a un binario temporal y lo ejecuta. Para producir un binario que puedas conservar y copiar a otro sitio, usa go build:
go mod init example.com/hello
go build
./hello
Hello, World!
go build necesita un módulo (un archivo go.mod), que crea go mod init. El binario se llama como la última parte de la ruta del módulo, aquí hello (hello.exe en Windows). La diferencia entre run, build e install se explica en go run y go build.
Adónde fueron los punto y coma
La gramática de Go usa punto y coma, pero casi nunca los escribes. El compilador inserta uno al final de cualquier línea cuyo último token podría terminar una sentencia: un identificador, un literal, ), } y unas pocas palabras clave como return. Esa regla es la razón de que falle este estilo tan común en otros lenguajes:
func main()
{
fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {
Se insertó un punto y coma después de func main(), así que la { de la línea siguiente es un error. La llave de apertura va siempre en la misma línea. La misma regla se aplica a if, for, switch y a cualquier otro bloque.
Los primeros errores, explicados
Estos son los mensajes que ven los principiantes en su primera hora, tal como los imprime Go 1.24.
Un import o una variable sin usar.
package main
import (
"fmt"
"os"
)
func main() {
x := 5
fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x
Los dos son errores de compilación, no avisos. Borra el import o la variable. Si necesitas conservar una variable mientras depuras, asígnala al identificador vacío: _ = x.
Nombre de función en minúscula.
./main.go:6:6: undefined: fmt.println
Los nombres no exportados son invisibles fuera de su paquete. Usa fmt.Println.
El nombre de paquete equivocado.
package example.com/hello is not a main package
El archivo dice package hello (o cualquier cosa distinta de main) y has intentado ejecutarlo. Cámbialo a package main.
Falta el módulo.
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go build y go run . trabajan sobre módulos. Ejecuta go mod init example.com/hello una vez en la carpeta. go run main.go, que nombra un archivo, funciona sin él.
Formato
Go tiene un único estilo de código oficial, y gofmt lo aplica. Ejecútalo sobre cada archivo que escribas:
go fmt ./...
Usa tabuladores para la sangría, alinea comentarios y campos de structs y normaliza el espaciado. Los editores con soporte para Go lo ejecutan al guardar. El código Go se ve igual en todas partes, así que no hay nada que configurar ni nada que discutir en las revisiones de código.
Preguntas frecuentes
¿Cómo se escribe hola mundo en Go?
Guarda esto como main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Luego ejecuta go run main.go. Imprime Hello, World!.
¿Por qué un programa Go necesita package main?
package main le dice al compilador que este paquete es un programa ejecutable y no una librería. El programa empieza en la función main del paquete main. Cualquier otro nombre de paquete produce una librería, y go run la rechaza con "is not a main package".
¿Por qué la llave de apertura va en la misma línea en Go?
Go inserta automáticamente punto y coma al final de las líneas que podrían terminar una sentencia, incluido después de func main(). Una { en la línea siguiente empezaría entonces un bloque aparte, así que el compilador informa de syntax error: unexpected semicolon or newline before {. La llave tiene que ir en la misma línea.
¿Qué significa fmt en Go?
fmt es el paquete de la librería estándar para entrada y salida con formato (el nombre abrevia "format"). fmt.Println imprime sus argumentos con espacios entre ellos y un salto de línea al final; fmt.Printf imprime usando una cadena de formato.