Aqui está o programa inteiro. Clique em Run.
Nenhuma dessas linhas é opcional. O resto da página explica o que cada uma faz.
Linha por linha
package main
Todo arquivo Go começa com uma cláusula package que diz a qual pacote ele pertence. O nome main é especial: marca o pacote como um programa executável. Qualquer outro nome (package utils, package hello) cria uma biblioteca, que outro código importa mas que não roda sozinha.
import "fmt"
import traz outro pacote para você usar. fmt é o pacote de formatação e impressão da biblioteca padrão. Depois do import, os nomes exportados dele são acessados pelo nome do pacote: fmt.Println, fmt.Printf, fmt.Sprintf.
Para importar vários pacotes, use um bloco entre parênteses com um caminho por linha:
import (
"fmt"
"strings"
)
Go se recusa a compilar um arquivo que importa um pacote sem usá-lo. Isso mantém a lista de dependências honesta, e é o primeiro erro que a maioria das pessoas encontra.
func main()
func declara uma função. main no pacote main é o ponto de entrada: o programa começa quando main começa e termina quando main retorna. Ela não recebe argumentos e não retorna nada. Os argumentos de linha de comando vêm de os.Args, e os códigos de saída, de os.Exit.
fmt.Println("Hello, World!")
Println imprime os argumentos, coloca um espaço entre eles e acrescenta uma quebra de linha. O nome começa com letra maiúscula porque só nomes com inicial maiúscula são exportados por um pacote. fmt.println com p minúsculo é erro de compilação.
Imprimindo mais do que uma string
Println aceita qualquer quantidade de valores de qualquer tipo. Printf dá controle sobre o formato:
%s é substituído por uma string e %d por um inteiro. Printf e Print não acrescentam quebra de linha, então você escreve o \n por conta própria. A tabela completa de verbos está na página de fmt.Printf.
Rode na sua máquina
Com o Go instalado, salve o programa como main.go em uma pasta vazia e execute:
go run main.go
Hello, World!
go run compila o arquivo para um binário temporário e o executa. Para gerar um binário que você guarda e copia para outro lugar, use go build:
go mod init example.com/hello
go build
./hello
Hello, World!
go build precisa de um módulo (um arquivo go.mod), que o go mod init cria. O binário recebe o nome da última parte do caminho do módulo, hello neste caso (hello.exe no Windows). A diferença entre run, build e install está explicada em go run e go build.
Para onde foram os ponto e vírgula
A gramática do Go usa ponto e vírgula, mas você quase nunca os digita. O compilador insere um no fim de toda linha cujo último token poderia encerrar uma instrução: um identificador, um literal, ), } e algumas palavras-chave como return. É por causa dessa regra que este estilo comum em outras linguagens falha:
func main()
{
fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {
Um ponto e vírgula foi inserido depois de func main(), então a { na linha seguinte vira erro. A chave de abertura sempre fica na mesma linha. A mesma regra vale para if, for, switch e qualquer outro bloco.
Os primeiros erros, explicados
Estas são as mensagens que iniciantes veem na primeira hora, exatamente como o Go 1.24 as imprime.
Um import ou uma variável sem uso.
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
Os dois são erros de compilação, não avisos. Apague o import ou a variável. Se precisar manter uma variável durante a depuração, atribua-a ao identificador em branco: _ = x.
Nome de função em minúsculas.
./main.go:6:6: undefined: fmt.println
Nomes não exportados são invisíveis fora do próprio pacote. Use fmt.Println.
O nome de pacote errado.
package example.com/hello is not a main package
O arquivo diz package hello (ou qualquer coisa diferente de main) e você tentou executá-lo. Troque para package main.
Módulo ausente.
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go build e go run . trabalham com módulos. Execute go mod init example.com/hello uma vez na pasta. go run main.go, que aponta para um arquivo, funciona sem módulo.
Formatação
Go tem um estilo de código oficial, e o gofmt o aplica. Rode-o em todo arquivo que escrever:
go fmt ./...
Ele usa tabs para indentação, alinha comentários e campos de structs e normaliza os espaços. Editores com suporte a Go o executam ao salvar. Código Go tem a mesma cara em qualquer lugar, então não há nada para configurar nem para discutir em code review.
Perguntas frequentes
Como escrever hello world em Go?
Salve isto como main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Depois execute go run main.go. Ele imprime Hello, World!.
Por que um programa Go precisa de package main?
package main diz ao compilador que o pacote é um programa executável, não uma biblioteca. O programa começa na função main do pacote main. Qualquer outro nome de pacote gera uma biblioteca, e o go run a recusa com "is not a main package".
Por que a chave de abertura fica na mesma linha em Go?
Go insere ponto e vírgula automaticamente no fim das linhas que poderiam encerrar uma instrução, inclusive depois de func main(). Uma { na linha seguinte passaria a abrir um bloco separado, e o compilador reporta syntax error: unexpected semicolon or newline before {. A chave precisa ficar na mesma linha.
O que significa fmt em Go?
fmt é o pacote da biblioteca padrão para entrada e saída formatadas (o nome abrevia "format"). fmt.Println imprime os argumentos separados por espaço e com uma quebra de linha no final; fmt.Printf imprime usando uma string de formato.