Índice do curso
Lição 1 — Instalar Go no seu Linux Mint e seu primeiro programa
Por Dorian Chávez · fundador da Hábil e arquiteto de integração ·
Duração: 45 a 60 minutos (ou 2 sessões de 30). É a única lição que não ensina Go como linguagem: ensina a ferramenta e o terreno onde você vai trabalhar — e esse terreno tem mais armadilhas do que parece à primeira vista.
Ao terminar, você vai conseguir:
- Instalar a versão oficial e vigente de Go no Linux Mint, sem depender do pacote do sistema, e explicar por que esse pacote está obsoleto por projeto, não por descuido.
- Explicar o que são
GOROOT,GOPATHe oPATH, e por que Go não funciona até você mexer no segundo. - Reconhecer a diferença entre um terminal que lê a sua configuração e um que não lê —a causa real de «eu adicionei e mesmo assim não funciona»— e saber qual é o seu.
- Criar um projeto com
go mod init, escrever um programa e executá-lo comgo run. - Produzir um binário com
go builde explicar, com uma prova real, por que ele roda em outra máquina sem ter Go instalado. - Usar
go fmtpara nunca mais discutir estilo de código. - Reconhecer, palavra por palavra, as mensagens de erro mais comuns desta etapa —de compilador, de permissões e de caminho— e saber o que fazer com cada uma.
Por que isso importa
A primeira coisa que um tutorial antigo vai te sugerir é apt install golang, e isso é um erro. Não é um
erro pequeno de "versão um pouco velha": é o tipo de erro que te faz perder uma tarde inteira sem
entender por quê, semanas depois de instalar, porque o sintoma não aparece ao instalar — aparece quando
você já está programando e algo que "deveria funcionar" não funciona.
Isto não é opinião, é medição. Em 30-set-2026 medi, em um contêiner com a mesma base do Linux Mint 22.3 (Ubuntu 24.04 "Noble Numbat", de onde o Mint tira seus pacotes):
$ cat /etc/os-release | grep VERSION
VERSION="24.04.5 LTS (Noble Numbat)"
$ apt-cache policy golang-go
golang-go:
Installed: (none)
Candidate: 2:1.22~2build1
Version table:
2:1.22~2build1 500
500 http://ports.ubuntu.com/ubuntu-ports noble/main arm64 Packages
$ curl -s 'https://go.dev/VERSION?m=text'
go1.27.1
O pacote do sistema oferece a 1.22. A versão oficial vigente, medida no mesmo instante, é a 1.27.1. E isso não é um descuido que alguém vá corrigir: é a política do Ubuntu e do Mint.
Por que se congela assim, de propósito? O Ubuntu 24.04 é uma versão LTS (Long Term Support): no dia em que sai, seus pacotes principais são congelados e só recebem correções de segurança, nunca versões novas do programa. É uma decisão correta para um servidor que não deve mudar de comportamento só por instalar atualizações — mas significa que o compilador de uma linguagem que libera versões novas duas vezes por ano fica fixo na que existia quando o Ubuntu 24.04 foi publicado (abril de 2024), para sempre, enquanto essa versão do Ubuntu existir. O Linux Mint não tem pacotes próprios de Go: herda literalmente os do Ubuntu, então herda também o congelamento.
Por que isso importa para você, concretamente? Porque você vai pesquisar coisas na internet, os exemplos vão usar funções ou comportamentos que o seu Go 1.22 não tem, e os erros não vão dizer «falta a versão»: vão dizer coisas que não fazem sentido para o que você está vendo na tela. É o tipo de problema que parece erro seu e na verdade é uma defasagem de ferramenta — e acontece com você antes de escrever a primeira linha de código, por isso esta lição existe antes de qualquer outra.
🔑 A forma correta, e a que o próprio projeto Go recomenda: baixar o pacote oficial diretamente de
go.dev, não do gerenciador de pacotes da sua distribuição. É isso que esta lição instala, passo a
passo, e o que vamos conferir em cada passo com a saída real dos comandos.
Os conceitos
1.1 O que são GOROOT, GOPATH e por que antes importavam mais do que agora
Antes de instalar, vale a pena saber o que você vai ter depois, porque os nomes GOROOT e GOPATH
aparecem em quase qualquer erro de instalação que você procure na internet, e muitas respostas foram
escritas para uma versão de Go de dez anos atrás.
GOROOTé a pasta onde vive o próprio Go: o compilador, ogofmt, a biblioteca padrão. É a pasta que você vai criar no passo 1.4 (/usr/local/go). Você nunca mexe nela à mão.GOPATHé a pasta onde Go guarda coisas suas: pacotes baixados da internet, e —em versões antigas de Go, antes de 2019— também onde você tinha de colocar todo o seu código, sem exceção, dentro de uma estrutura fixa ($GOPATH/src/github.com/seu-usuario/seu-projeto). Se alguma vez você vir um tutorial que pede para criar essa estrutura de pastas, ele é dessa época.
Hoje você quase não mexe nela porque, desde o Go 1.11 (2018), existem os módulos (go.mod, que você
vai criar no passo 1.6): seu projeto pode viver em qualquer pasta, com o nome que você quiser, e Go já
não precisa que você siga uma estrutura de pastas imposta. O GOPATH continua existindo, mas agora só
como cache de pacotes baixados, não como o único lugar onde o seu código pode viver.
Confira com go env, que mostra a configuração vigente da sua instalação (você pode rodar isso
depois de instalar, no passo 1.5):
go env GOROOT GOPATH GOBIN
Em uma instalação limpa, recém-feita, você vai ver algo como:
/usr/local/go
/home/tu-usuario/go
/home/tu-usuario/go/bin
Nenhuma dessas três pastas foi criada por você à mão: a primeira é criada pelo passo de instalação (1.4), as outras duas o próprio Go decide, com valores padrão razoáveis.
1.2 O PATH: o que é, e por que "já está instalado" não significa "já funciona"
Quando você digita um comando no terminal, por exemplo go, o terminal não sabe magicamente onde está
esse programa: ele examina, uma por uma, uma lista de pastas guardada em uma variável chamada PATH, e
usa o primeiro programa que encontrar com esse nome. Se nenhuma pasta da lista tiver um programa chamado
go, responde com um erro — e esse erro é literal, não aproximado:
$ go version
bash: go: command not found
Verifiquei isso em um contêiner com Go já extraído em /usr/local/go, antes de mexer no PATH: o
programa existe no disco, mas o terminal não o encontra porque não sabe onde procurar. "Instalado" e
"no PATH" são duas coisas diferentes, e a confusão entre elas é a fonte de quase todos os tropeços
desta lição.
Isso também explica por que a mensagem muda um pouco conforme o terminal (zsh em vez de bash, que
você verá se usar macOS para acompanhar o curso enquanto pratica, ou se trocou o terminal padrão do seu
Mint):
$ go version
zsh: command not found: go
Mesmo problema, mesmo mecanismo, ordem das palavras diferente: identifique qual é o seu caso com
echo $SHELL antes de procurar o erro na internet, porque procurar a mensagem errada vai te levar a
respostas para o shell errado.
1.3 Descubra qual é a última versão
Não a copie daqui: este documento envelhece como os repositórios do Mint, e você já viu na seção anterior o quanto pode pesar uma ferramenta ficar fixa no tempo.
curl -s 'https://go.dev/VERSION?m=text' | head -1
Ele vai responder algo como go1.27.1. Essa é a que você vai instalar, seja qual for quando você
fizer isso.
1.4 Baixe-a e instale-a
Substitua go1.27.1 pelo que o comando anterior disse. linux-amd64 é o correto para um PC ou notebook
normal (se a sua máquina fosse ARM, seria linux-arm64; para saber: dpkg --print-architecture).
cd /tmp
wget https://go.dev/dl/go1.27.1.linux-amd64.tar.gz
E agora a instalação:
sudo rm -rf /usr/local/go # borra una instalación anterior, si había
sudo tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
O que você acabou de fazer, porque convém entender e não apenas copiar:
tardescompacta o arquivo.-C /usr/localdiz a ele «faça isso dentro desta pasta».-xzfé «extrair» (x), «está comprimido com gzip» (z), «deste arquivo» (f).- O resultado é uma pasta
/usr/local/gocom todo o Go dentro — oGOROOTda seção 1.1.
Por que sudo, se você nunca precisou dele para instalar algo com um gerenciador de pacotes? Porque
/usr/local é uma pasta do sistema, não do seu usuário, e no Linux escrever ali exige permissões de
administrador. Sem sudo, é exatamente isto que você vai ver —provoquei de propósito, sem sudo, para
que você veja a mensagem real e não uma inventada—:
$ tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
tar: go: Cannot mkdir: Permission denied
tar: go/VERSION: Cannot open: No such file or directory
tar: go/api: Cannot mkdir: No such file or directory
tar: go/api/README: Cannot open: No such file or directory
... (se repite, una vez por cada archivo del paquete)
Não é um erro, são centenas. O tar tenta escrever cada arquivo do pacote, um por um, e cada um
falha do mesmo jeito porque nenhum tem permissão para escrever em /usr/local. Se você vir essa parede
de linhas repetidas, a causa é sempre a mesma e sempre se resolve do mesmo jeito: coloque sudo antes.
1.5 Diga ao seu sistema onde ele está — e a armadilha dos terminais modernos
Agora o Go existe em /usr/local/go/bin/go, mas, como você viu na seção 1.2, se digitar go ele vai
dizer command not found: essa pasta ainda não está no PATH.
A instrução que você vai ver em quase qualquer tutorial, inclusive na documentação oficial de Go, é esta:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
~/.profileé um arquivo que, em teoria, o seu sistema lê toda vez que você inicia sessão.source ~/.profileaplica a mudança neste terminal, agora mesmo, sem esperar a próxima sessão.
E aqui vem o que a maioria dos tutoriais não conta, e que conferi com um teste real: um terminal novo nem sempre é uma "sessão nova".
O ~/.profile só é lido pelo que o Linux chama de shell de login — a que inicia quando você começa
uma sessão no sistema (por exemplo, ao ligar a máquina e entrar com seu usuário e senha). Mas a maioria
dos aplicativos de terminal (o terminal do Mint incluído, na configuração padrão) ao abrir uma janela ou
aba nova não iniciam uma shell de login: iniciam uma shell interativa normal, e essas leem outro
arquivo, ~/.bashrc, não o ~/.profile.
Conferi assim, simulando exatamente esse cenário —"já editei o arquivo, fecho o terminal, abro outro"— em um contêiner recém-instalado:
# después de agregar el export SOLO a ~/.profile, en una terminal nueva:
$ go version
bash: go: command not found ← sigue sin funcionar
# después de agregar la MISMA línea también a ~/.bashrc, en una terminal nueva:
$ go version
go version go1.27.1 linux/arm64 ← ahora sí
A instrução "feche o terminal, abra outro" nem sempre basta, e quando não basta, parece que você fez algo errado quando na verdade seguiu o tutorial à risca. Por isso a recomendação desta lição, mais robusta que a da maioria dos guias, é adicionar a linha aos dois arquivos:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
O ~/.profile cobre o caso de uma sessão de login de verdade (por exemplo, se você usa SSH ou troca de
usuário); o ~/.bashrc cobre o caso, muito mais comum no dia a dia, de abrir uma janela ou aba de
terminal nova sobre uma sessão que já estava aberta.
💡 Se você usa zsh em vez de bash (você sabe se o seu terminal parece diferente ou se trocaram
para você), o arquivo equivalente ao .bashrc é o ~/.zshrc. Para saber qual shell você usa:
echo $SHELL.
🔑 Como distinguir se o seu terminal abre uma shell de login, sem adivinhar: rode echo $0 logo
depois de abri-lo. Se a resposta começar com um hífen (-bash, -zsh), é uma shell de login e sim lê o
~/.profile. Se não tiver o hífen (bash, zsh), não é, e você precisa da mudança no ~/.bashrc (ou
~/.zshrc) para que persista.
1.6 Confira que funcionou
go version
Deve responder algo como go version go1.27.1 linux/amd64 (ou linux/arm64 se a sua máquina for ARM).
Se continuar dizendo command not found, verifique com echo $0 de que tipo de shell se trata e em
qual arquivo você colocou a mudança, seguindo a seção 1.5.
1.7 Seu primeiro programa
mkdir -p ~/w/curso-go/hola && cd ~/w/curso-go/hola
go mod init hola
go mod init cria um arquivo go.mod. É a ficha de identidade do projeto: diz como ele se chama e qual
versão de Go usa. É o mecanismo de módulos que já mencionamos na seção 1.1, e é o mesmo com o qual você
vai iniciar o projeto revisor na lição 5.
Crie o main.go com isto:
package main
import "fmt"
func main() {
fmt.Println("hola, ya tengo Go")
}
Linha por linha, porque cada uma tem sua razão:
package main |
«este arquivo pertence ao pacote main». O pacote main é especial: é o único que produz um programa executável. Sem esta linha você teria uma biblioteca, não um programa |
import "fmt" |
«vou usar coisas do pacote fmt» (de format), que traz o necessário para imprimir. Go não traz nada carregado por padrão: o que você usar, você pede |
func main() |
a função onde o seu programa começa. Quando você o executa, Go procura exatamente esta função. Se tiver outro nome, ele não inicia |
fmt.Println(...) |
imprime e pula de linha. O ponto significa «a função Println que está dentro de fmt» |
Rode:
$ go run main.go
hola, ya tengo Go
Essa saída é real: rodei antes de escrever esta linha.
1.8 Os comandos que você vai usar sempre — e a sutileza do go.mod
go run main.go # compila y ejecuta de una vez, sin dejar archivo. Para probar mientras trabajas
go build # crea el programa ejecutable y lo deja ahí
go fmt ./... # ordena tu código
go test ./... # corre las pruebas (lección 5)
Uma sutileza real que vale a pena testar você mesmo, porque mudou entre versões de Go: com um
programa de um único arquivo como o de cima, go run main.go funciona mesmo sem go.mod. Conferi
em uma pasta nova, sem go mod init:
$ go run main.go
hola, ya tengo Go
Mas o go build, nessa mesma pasta sem go.mod, sim exige o módulo:
$ go build
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
Por que a diferença? O go run sobre um único arquivo consegue resolver tudo sem precisar saber o
nome do módulo, porque não há nada que outro arquivo possa importar dele. Assim que o seu programa
precisa de mais de um arquivo — por exemplo, se você tentar importar um pacote próprio, como vai fazer
na lição 5 com o revisor — Go precisa do go.mod para saber como o seu módulo se chama e assim
resolver esses imports. Também conferi:
$ go run main.go # main.go importa "hola/utilidades", sin go.mod
main.go:4:5: package hola/utilidades is not in std (/usr/local/go/src/hola/utilidades)
A lição prática: rode go mod init sempre, desde o primeiro arquivo, mesmo que o go run às vezes
funcione sem ele — você evita este erro exato assim que o seu programa precisar importar um pacote
próprio, o que vai acontecer já na lição 5.
Teste a diferença entre run e build:
$ go build
$ ls -la
-rwxr-xr-x 1 tu-usuario tu-usuario 2341973 ... hola
$ ./hola
hola, ya tengo Go
1.9 Por que o binário é portátil: linkagem estática
🔑 O arquivo hola que o go build produziu é um programa completo e autossuficiente. E isso não
precisa ser acreditado por fé: conferi copiando exatamente esse binário, compilado em uma máquina com Go
instalado, para um contêiner limpo, sem Go:
$ which go
go no esta instalado
$ ./hola
hola, ya tengo Go
Funcionou. Não precisa de interpretador, nem de máquina virtual, nem de bibliotecas externas instaladas
à parte, porque Go faz linkagem estática: em vez de dizer «quando rodar, procure a biblioteca fmt
em algum lugar do sistema» (que é como funcionam muitos programas em C ou em Python), Go copia para
dentro do próprio binário tudo o que o seu programa precisa para rodar. O arquivo fica maior por isso
—pouco mais de 2 MB para um programa de uma linha— mas em troca você pode copiá-lo para qualquer máquina
Linux compatível e ele vai funcionar do jeito que está, sem instalar mais nada.
Essa é a característica mais prática de Go, e por isso tantas ferramentas de servidores são escritas
nele — inclusive o revisor que você vai compilar e publicar na lição 7.
1.10 Um editor que te ajude
Não é obrigatório, mas vai te poupar muito tempo. Se você usa o VS Code, instale a extensão oficial
Go (de golang.go). Medido em 30-set-2026 no Marketplace do Visual Studio: a versão publicada é a
0.57.2. Esse número também vai envelhecer — o relevante é que você instale a que o Marketplace
oferecer no dia em que fizer isso, não que anote este número.
A extensão vai sublinhar os erros enquanto você escreve, em vez de você descobri-los ao compilar, e deixa
você pular para a definição de qualquer coisa com F12. Na primeira vez ela vai pedir para instalar
algumas ferramentas extras (gopls, o servidor de linguagem de Go, entre outras): diga que sim a todas.
O erro que você vai ver
Todas estas são mensagens reais, provocadas de propósito para esta lição — não descrições aproximadas do que "provavelmente" diriam:
| O sintoma | Mensagem literal | O que acontece e o que fazer |
|---|---|---|
Terminal bash sem Go no PATH |
bash: go: command not found |
O programa não está em nenhuma pasta do PATH. Veja a seção 1.5 |
Terminal zsh sem Go no PATH |
zsh: command not found: go |
Mesmo problema, ordem das palavras diferente porque é outro shell |
tar sem sudo contra /usr/local |
tar: go: Cannot mkdir: Permission denied (repetido por arquivo) |
Faltou sudo antes do comando de extração (seção 1.4) |
Você adicionou o PATH só ao ~/.profile e abriu um terminal novo |
bash: go: command not found (persiste) |
Seu terminal não abre uma shell de login; adicione a linha também ao ~/.bashrc (seção 1.5) |
go build em uma pasta sem go.mod |
go: go.mod file not found in current directory or any parent directory; see 'go help modules' |
Rode go mod init <nome> nessa pasta |
Import de um pacote próprio sem go.mod |
main.go:4:5: package hola/utilidades is not in std (...) |
Igual ao anterior: sem módulo, Go não sabe resolver seus próprios pacotes |
Você esqueceu import "fmt" e usou fmt.Println |
# command-line-arguments<br>./main.go:4:2: undefined: fmt |
Go conhece todos os símbolos disponíveis; se você não importou o pacote, ele não existe para ele |
go version responde 1.22 em vez da vigente |
(sem erro, mas versão errada) | Está sendo usado o do apt. Remova-o com sudo apt remove golang-go e confirme que /usr/local/go/bin está no seu PATH |
E a regra geral, que vale para os oito: copie a mensagem de erro completa e pesquise-a tal qual, sem resumi-la com suas palavras primeiro. Quase sempre alguém já passou por isso, e a mensagem quase sempre diz exatamente o que falta — adivinhar sem lê-la por inteiro é a forma mais lenta de resolver.
O que se faz errado
Instalar Go com o gerenciador de pacotes do sistema (
apt install golang). É a sugestão mais comum em tutoriais antigos, e é exatamente o problema da seção "Por que isso importa": uma versão LTS congelada te deixa anos atrasado sem avisar com nenhum erro, só com comportamentos estranhos mais adiante.Dar por certo que "fechar e abrir o terminal" sempre recarrega a configuração. É a armadilha medida na seção 1.5: se o seu terminal não abre uma shell de login, fechá-lo e abri-lo de novo não volta a ler o
~/.profile. O sintoma —"fiz certo e não funciona"— não significa que você fez algo errado, significa que esse arquivo não era o que o seu terminal lê.Extrair a versão nova por cima de uma instalação antiga, sem apagar antes. O
sudo rm -rf /usr/local/godo passo 1.4 não é decorativo: se você extrair por cima de uma instalação antiga, ficam arquivos das duas misturados e o resultado é um Go que falha de formas incompreensíveis. Apague primeiro, sempre.Confiar que o
go runfunciona semgo.mode por isso pular ogo mod init. É verdade para um arquivo solto (seção 1.8), mas deixa de ser assim assim que o seu programa tem mais de um arquivo — e para então você já escreveu código que vai ter de reorganizar. Rodego mod initdesde o começo, sempre.Discutir o estilo do código à mão. Em Go o estilo não se discute: quem decide é a ferramenta. Experimente escrever isto de propósito, todo torto:
package main import "fmt" func main(){ fmt.Println( "hola" ) }Rode
go fmt ./...e reabra o arquivo: ficou organizado sozinho. Não existem brigas sobre onde vai a chave ou quantos espaços leva a indentação, porque ogofmttem uma única resposta e todo mundo a usa. Acostume-se a rodá-lo antes de salvar, em vez de formatar à mão.
Exercícios
- Instale Go seguindo as seções 1.3 a 1.6 e confirme a versão com
go version. - Rode
echo $0no seu terminal antes de mexer no PATH. Conforme a resposta, decida se você precisa mexer no~/.profile, no~/.bashrc, ou nos dois (seção 1.5) — e explique por quê, com suas palavras, antes de continuar. - Crie o projeto
holada seção 1.7, rodego run main.goe depoisgo build+./hola. - (Como na seção 1.9) Copie o seu binário
holapara outra máquina Linux, ou para uma máquina virtual / contêiner sem Go instalado, e confirme que roda igual. - Troque a mensagem do
fmt.Printlnpor algo seu, bagunce o recuo de propósito, e rodego fmt ./.... Verifique que o arquivo ficou bem formatado. - (Um pouco mais difícil) Crie uma pasta nova, sem
go mod init, com ummain.gode um único arquivo. Confirme quego run main.gofunciona mesmo assim. Depois rodego buildnessa mesma pasta e compare o erro com o da seção 1.8. Explique, com suas palavras, por que um funciona e o outro não. - (Um pouco mais difícil) Apague de propósito a linha
import "fmt"e rodego run main.go. Leia o erro completo, sem pesquisá-lo ainda, e tente explicar com suas palavras o que ele está te dizendo antes de continuar.
Soluções
go versiondeve imprimir a mesma versão que você viu emcurl -s 'https://go.dev/VERSION?m=text', nuncago1.22.x(essa é a doaptdo Mint).Se
echo $0responder com hífen no início (-bash), seu terminal abre shells de login e o~/.profilebasta. Se responder sem hífen (bash), não é uma shell de login, e só o~/.bashrc(ou~/.zshrcno zsh) vai persistir entre janelas novas — adicione a mudança ali também, como na seção 1.5.go run main.goimprimehola, ya tengo Go. Depois dogo build, aparece um arquivoholana pasta;./holao executa direto, sem compilar de novo.O binário roda igual na máquina sem Go, porque Go faz linkagem estática (seção 1.9): tudo o que o programa precisa já está copiado dentro do próprio arquivo.
Antes do
go fmt, o arquivo fica exatamente como foi escrito (torto). Depois, ogofmto reorganiza com a indentação e os espaços padrão de Go — sem que você decida nada disso.go run main.gofunciona porque, com um único arquivo, Go não precisa resolver nenhum import próprio para compilá-lo e executá-lo de uma vez. Ogo build, por outro lado, exige saber o nome do módulo desde o primeiro momento e respondego: go.mod file not found.... A diferença é que obuilddeixa o binário pronto para ser usado fora dessa invocação pontual, e para isso precisa de uma identidade de projeto — orunnão.O compilador responde:
# command-line-arguments ./main.go:4:5: undefined: fmtDiz que você usou
fmt.Printlnsem ter importado o pacotefmt: o compilador conhece todos os símbolos que você pode usar, e se você não o importou, ele não existe para ele. Resolve-se devolvendo a linhaimport "fmt".
Como sei que consegui
-
go versionresponde com a versão que vi emgo.dev/VERSION, não com 1.22. - Sei se o meu terminal abre shells de login ou não (
echo $0), e em qual(is) arquivo(s) coloquei a mudança de PATH em consequência. -
go run main.goimprime a minha mensagem. -
go buildproduziu um arquivo e./holafunciona. - Copiei o meu binário para outra máquina (ou contêiner) sem Go e rodou igual.
- Testei o
go fmtsobre código mal escrito e ele o organizou. - Provoquei o erro do
go buildsemgo.mode consigo explicar por que ogo runnão o teve. - Provoquei o erro de
importfaltando e entendi a mensagem sem precisar da solução. - Consigo explicar, sem ver o texto, que diferença há entre
GOROOT,GOPATHe oPATH.
Resumo
- Nunca instale Go com o gerenciador de pacotes do sistema (
apt install golang): as versões LTS do Linux são congeladas, e o pacote fica anos atrás sem avisar com nenhum erro. GOROOTé onde Go vive;GOPATHé onde Go guarda pacotes baixados; nenhum dos dois você mexe à mão em um projeto moderno com módulos (go.mod).- O
PATHé a lista de pastas onde o terminal procura programas. Ter Go instalado e ter Go noPATHsão duas coisas diferentes. - Um terminal novo nem sempre é uma sessão de login: a maioria só lê o
~/.bashrc(ou o~/.zshrc), não o~/.profile. Adicione a mudança doPATHaos dois arquivos. go mod initcria a identidade do projeto (go.mod); todo projeto Go precisa dela, mesmo que ogo runàs vezes funcione sem ela com um único arquivo.go runcompila e executa sem deixar arquivo;go builddeixa o binário;go fmtdá formatação automática, sem discussão possível sobre estilo.- O binário que o
go buildproduz é autossuficiente por linkagem estática: roda em outra máquina Linux compatível sem ter Go instalado. - Cada mensagem de erro desta lição é literal, provocada de propósito:
command not found,Permission denied,go.mod file not found,undefined: fmt— copie-as tal qual quando for pesquisá-las.
Para ler mais
- Download and install — o guia oficial de instalação, a fonte da
verdade se algo nesta lição envelhecer. Inclui a mesma recomendação do
~/.profileque usamos aqui, com o mesmo aviso de que a mudança "pode não ser aplicada até o próximo início de sessão" — que é justamente o que foi medido e explicado a fundo na seção 1.5. - A Tour of Go — o passeio interativo oficial; começa exatamente onde esta lição termina.
- Effective Go — inclui a seção sobre o
gofmte por que a formatação não se discute em Go. - GNU Bash — Manual: Bash Startup Files —
a referência oficial de quando se lê o
~/.profilee quando o~/.bashrc; vale a pena lê-la inteira uma única vez na vida, porque a confusão entre os dois não é exclusiva de Go.
Termos desta lição
| Termo | O que significa |
|---|---|
GOROOT |
a pasta onde vive a instalação de Go: o compilador, o gofmt, a biblioteca padrão |
GOPATH |
a pasta onde Go guarda pacotes baixados; antes dos módulos, todo o seu código também tinha de viver ali |
PATH |
a lista de pastas onde o terminal procura programas executáveis |
| shell de login | a sessão de terminal que inicia ao começar uma sessão no sistema; é a única que lê o ~/.profile |
go.mod |
o arquivo que identifica um projeto Go: seu nome e a versão de Go que ele usa |
| binário | o arquivo executável que o go build produz, autossuficiente, sem depender de ter Go instalado |
| linkagem estática | a técnica pela qual Go copia para dentro do binário tudo o que o programa precisa, em vez de procurá-lo no sistema ao rodar |
gofmt |
a ferramenta que dá formatação automática ao código Go, sem opções para discutir |
Prefere e-mail? Escreva para hola@habil.mx