Bem-vindo à sua primeira aula prática de Go! Vamos escrever o clássico programa "Olá, mundo" e, ao fazê-lo, explorar os elementos fundamentais que compõem um programa em Go. Esta aula vai estabelecer a base para todo o seu aprendizado futuro, então preste atenção aos detalhes.

Go é uma linguagem compilada e estaticamente tipada, projetada para ser simples, eficiente e produtiva. Antes de mergulharmos no código, é importante entender como um programa Go é organizado e quais ferramentas estão disponíveis para nos ajudar no desenvolvimento.

Estrutura de um programa

Um programa Go é composto por pacotes (packages). Cada arquivo Go começa com uma declaração de pacote, que define a qual pacote aquele arquivo pertence. O pacote é a unidade básica de organização e reutilização de código em Go. Além disso, um programa Go precisa de uma função de entrada, que é a função main no pacote main.

Vamos ver um exemplo mínimo:

package main

import "fmt"

func main() {
    fmt.Println("Olá, mundo!")
}

Esse código define um pacote main, importa o pacote fmt (que fornece funções de formatação de E/S), e declara a função main, que imprime uma mensagem. Note que as chaves {} delimitam blocos de código, e a indentação é feita com tabulações (ou espaços, mas a convenção é usar tab).

package main e func main

O pacote main é especial em Go: ele define um programa executável. Todo programa Go que gera um executável deve ter um pacote chamado main e uma função main sem parâmetros e sem retorno. Essa função é o ponto de entrada do programa.

Se você criar um pacote com outro nome, como package helper, ele será um pacote de biblioteca, não um executável. A função main só pode existir no pacote main. Experimente alterar o nome do pacote no exemplo acima para package foo e tente executar com go run; você receberá um erro como "package foo is not a main package".

go run e go build

Go fornece duas ferramentas principais para executar e compilar programas: go run e go build.

go run compila e executa seu programa em um único passo. É útil durante o desenvolvimento, pois é rápido e não gera um arquivo binário permanente. Por exemplo, para executar o programa acima, salve o código em um arquivo chamado main.go e execute no terminal:

go run main.go

Isso imprimirá "Olá, mundo!" no terminal.

go build compila o programa e gera um executável binário (no diretório atual ou no diretório especificado). O binário terá o nome do diretório ou o nome do arquivo, dependendo da configuração. Para compilar:

go build main.go

Isso criará um executável chamado main (no Linux/Mac) ou main.exe (no Windows). Depois, você pode executá-lo diretamente: ./main ou main.exe.

Uma diferença importante: go run não deixa um binário, enquanto go build gera um binário que pode ser distribuído. Para projetos maiores, go build é mais adequado para produção.

gofmt

Go é uma linguagem que preza pela consistência de formatação. A ferramenta gofmt (ou go fmt) formata automaticamente o código Go de acordo com as convenções da comunidade. Isso elimina discussões sobre estilo de código e torna todo código Go legível de forma padronizada.

Para usar, execute no terminal:

gofmt -w main.go

O parâmetro -w (write) modifica o arquivo diretamente. Se você quiser apenas visualizar a formatação sem alterar, pode usar gofmt main.go que exibe o código formatado no terminal.

Muitos editores de código (VS Code, GoLand, Vim) executam gofmt automaticamente ao salvar. É uma boa prática formatar o código antes de commitar. Além disso, existe o go fmt que é um alias para gofmt -l -w (lista e formata).

Boas práticas

Sempre formate seu código com gofmt antes de compartilhar. Use nomes de arquivo com underscore (ex: hello_world.go) e siga a convenção de usar letras minúsculas para nomes de pacotes. Além disso, mantenha um único pacote main por diretório executável.

Referências

Exercícios

  1. Escreva um programa que imprima seu nome.
  2. ✓ Resposta:
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("João")
    }
  3. Modifique o programa para imprimir seu nome e sua idade em linhas separadas.
  4. ✓ Resposta:
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("João")
        fmt.Println(30)
    }
  5. Use go build para compilar o programa anterior e execute o binário gerado.
  6. ✓ Resposta:
    go build main.go
    ./main   # ou main.exe no Windows
  7. Formate o código abaixo usando gofmt (mentalmente ou executando o comando): package main; import "fmt"; func main() { fmt.Println("Oi") }
  8. ✓ Resposta:
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Oi")
    }
  9. Crie um programa que declare uma variável com seu nome e a imprima.
  10. ✓ Resposta:
    package main
    
    import "fmt"
    
    func main() {
        nome := "Maria"
        fmt.Println(nome)
    }