gopls: Navegação, Refatoração e Diagnósticos
gopls é o servidor oficial de linguagem Go.
Busque em todas as páginas da documentação
gopls é o servidor oficial de linguagem Go.
Ele transforma seu editor em um cliente ciente de tipos: pule para definições, renomeie símbolos entre pacotes, exiba diagnósticos e aplique correções antes de executar go build.
O gopls carrega seu módulo (ou workspace go.work), verifica tipos de pacotes incrementalmente e responde a requisições LSP do editor.
Comandos de navegação resolvem através do verificador de tipos, portanto, respeitam imports, tags de build e genéricos.
Operações de refatoração (renomear, adicionar import, extrair função) editam a AST com patches verificados por tipo em vez de busca e substituição cegas.
Diagnósticos mesclam erros do compilador de go/types com analisadores selecionados (variáveis não utilizadas, erros de printf e mais).
Cartão de referência rápida - pronto para copiar e colar.
Ações do editor (nomes variam por IDE):
| Ação | Atalho Típico | Método gopls |
|---|---|---|
| Ir para definição | F12 / Cmd+clique | textDocument/definition |
| Encontrar referências | Shift+F12 | textDocument/references |
| Renomear símbolo | F2 | textDocument/rename |
| Organizar imports | ao salvar | textDocument/codeAction |
| Mostrar diagnósticos | automático | textDocument/publishDiagnostics |
Quando usar isso:
go build e estilo vet precocemente.Considere um pequeno módulo:
// example.com/demo/internal/greet/greet.go
package greet
func Hello(name string) string {
return "hello, " + name
}// example.com/demo/cmd/app/main.go
package main
import (
"fmt"
"example.com/demo/internal/greet"
)
func main() {
fmt.Println(greet.Hello("world"))
}Com o gopls em execução na raiz do módulo:
greet.Hello em main.go abre greet.go no corpo da função.Hello lista main.go e quaisquer arquivos de teste que importam greet.Hello para Greet atualiza ambos os arquivos e ajusta o uso de importações se o símbolo mudar de pacote (o gopls pode solicitar ou recusar se isso quebrar a visibilidade).fmt não utilizado se você excluir o println, adiciona imports ausentes quando você referencia novos pacotes.O que isso demonstra:
go run.go.mod ou go.work).| Recurso | Comportamento |
|---|---|
| Definição | Salta para o local de declaração do identificador; para interfaces, pode oferecer definição de tipo vs implementação |
| Implementação | Lista tipos concretos que implementam um método de interface |
| Referências | Todos os usos de identificadores no escopo do workspace, incluindo testes |
| Símbolo do documento | Estrutura de funções, tipos e constantes no arquivo atual |
| Símbolo do workspace | Busca difusa entre nomes qualificados por pacote |
| Recurso | Notas |
|---|---|
| Renomear | Falha com segurança se sombreamento ou restrições entre módulos quebrarem |
| Adicionar/organizar import | Agrupa biblioteca padrão, terceiros, locais; aplica lógica goimports |
| Extrair função | Levanta um bloco para uma nova função com parâmetros inferidos |
| Gerar testes | Cria stubs em formato de tabela em _test.go (dependente do editor) |
O gopls publica diagnósticos com severidade (erro, aviso, dica).
Muitos incluem ações de código: correções rápidas para imports ausentes, tipos sugeridos ou refatorações triviais.
Diagnósticos de analisadores aproximam go vet e similares; eles não são garantidos para corresponder a todos os linters que você habilitar posteriormente.
// tags de build afetam o que o gopls verifica
//go:build integration
package myappAlinhe gopls.build.buildFlags ou GOFLAGS com a CI para que arquivos marcados não alternem entre verde localmente e vermelho na CI.
go.mod deixa o gopls adivinhando; abra o diretório do módulo ou go.work. Correção: Arquivo → Abrir Pasta na raiz do módulo.go.work ou uma versão publicada, a renomeação entre módulos pode ser incompleta. Correção: Adicione go.work para edições locais de múltiplos módulos.//go:build aparecem como excluídos ou com erro no editor. Correção: Defina buildFlags: ["-tags=integration"] nas configurações do gopls para corresponder à CI.stringer poluem a navegação. Correção: Exclua *.pb.go dos recursos do editor ou marque diretórios gerados nos filtros de diretório do gopls.golangci-lint run localmente com a configuração commitada.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Busca de texto puro (rg) | Explorando comentários, strings ou arquivos não Go | Renomeando símbolos ou encontrando referências tipadas |
go doc / pkg.go.dev | Lendo documentação de API pública offline | Navegando em internal/ privado em seu módulo |
| IDE sem gopls | Editor não suportado | Você precisa de refatorações Go precisas (prefira clientes com suporte a gopls) |
guru (legado) | Mantendo fluxos de trabalho muito antigos | Iniciando novos projetos (gopls o suplantou) |
Execute go mod download e certifique-se de que a pasta aberta seja a raiz do módulo.
Proxies corporativos podem bloquear sumdb; defina GOPROXY consistentemente com a CI.
Apenas para módulos no mesmo workspace ou aqueles que seu editor resolve como dependências.
Ele não renomeará consumidores em repositórios que você não tem abertos.
Definição salta para o local de declaração do identificador.
Definição de tipo salta para o tipo subjacente para aliases e métodos de interface.
Isso geralmente é o editor executando goimports ou ações de código do gopls.
Desative formatar ao salvar ou organizeImports se isso atrapalhar seu fluxo.
Sim - navegação e renomeação entendem parâmetros de tipo e tipos instanciados em Go 1.18+.
Use "Ir para implementações" (LSP textDocument/implementation) no método ou tipo da interface.
A indexação inicial verifica muitos pacotes.
Use limites de memória do gopls, restrinja pastas do workspace e exclua árvores de vendor.
Sim - gopls check e gopls vulncheck existem para diagnósticos sem um IDE.
A edição diária ainda se beneficia da integração LSP.
Não - são dicas do editor.
O compilador continua sendo a autoridade; corrija primeiro os "rabiscos" vermelhos que espelham erros de build.
Commite orientações de equipe independentes do editor (tags de build, formatadores).
Configurações de UI pessoais podem permanecer locais; compartilhe .vscode/settings.json apenas quando a equipe padronizar o VS Code.
Versões da Pilha: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação), e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026