gopls: Navegación, Refactorización y Diagnósticos
gopls es el servidor de lenguaje oficial de Go.
Busca en todas las páginas de la documentación
gopls es el servidor de lenguaje oficial de Go.
Convierte tu editor en un cliente consciente de tipos: salta a definiciones, renombra símbolos en paquetes, muestra diagnósticos y aplica correcciones antes de ejecutar go build.
gopls carga tu módulo (o espacio de trabajo go.work), verifica tipos de paquetes incrementalmente y responde a solicitudes LSP del editor.
Los comandos de navegación se resuelven a través del verificador de tipos, por lo que respetan las importaciones, las etiquetas de compilación y los genéricos.
Las operaciones de refactorización (renombrar, agregar importación, extraer función) editan el AST con parches verificados por tipos en lugar de búsqueda y reemplazo ciegos.
Los diagnósticos combinan errores del compilador de go/types con analizadores seleccionados (variables no utilizadas, errores de printf, y más).
Tarjeta de referencia rápida - lista para copiar y pegar.
Acciones del editor (los nombres varían según el IDE):
| Acción | Atajo típico | Método gopls |
|---|---|---|
| Ir a la definición | F12 / Cmd+clic | textDocument/definition |
| Buscar referencias | Shift+F12 | textDocument/references |
| Renombrar símbolo | F2 | textDocument/rename |
| Organizar importaciones | al guardar | textDocument/codeAction |
| Mostrar diagnósticos | automático | textDocument/publishDiagnostics |
Cuándo usar esto:
go build y estilo vet de forma temprana.Considera un módulo pequeño:
// 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"))
}Con gopls ejecutándose en la raíz del módulo:
greet.Hello en main.go abre greet.go en el cuerpo de la función.Hello lista main.go y cualquier archivo de prueba que importe greet.Hello a Greet actualiza ambos archivos y ajusta el uso de importaciones si el símbolo cambia de paquete (gopls puede solicitar o rechazar si esto rompiera la visibilidad).fmt no utilizado si eliminas el println, agrega importaciones faltantes cuando referencias nuevos paquetes.Lo que esto demuestra:
go run.go.mod o go.work).| Característica | Comportamiento |
|---|---|
| Definición | Salta al sitio de declaración del identificador; para interfaces, puede ofrecer definición de tipo vs implementación |
| Implementación | Lista tipos concretos que implementan un método de interfaz |
| Referencias | Todos los usos de identificadores en el ámbito del espacio de trabajo, incluidas las pruebas |
| Símbolo del documento | Esquema de funciones, tipos y constantes en el archivo actual |
| Símbolo del espacio de trabajo | Búsqueda difusa en nombres calificados por paquete |
| Característica | Notas |
|---|---|
| Renombrar | Falla de forma segura si el sombreado o las restricciones entre módulos rompieran |
| Organizar/agregar importaciones | Agrupa la biblioteca estándar, de terceros y locales; aplica la lógica de goimports |
| Extraer función | Eleva un bloque a una nueva función con parámetros inferidos |
| Generar pruebas | Crea plantillas _test.go con esqueletos basados en tablas (dependiente del editor) |
gopls publica diagnósticos con severidad (error, advertencia, pista).
Muchos incluyen acciones de código: correcciones rápidas para importaciones faltantes, tipos sugeridos o refactorizaciones triviales.
Los diagnósticos del analizador aproximan go vet y similares; no se garantiza que coincidan con todos los linters que habilites más adelante.
// las etiquetas de compilación afectan lo que gopls verifica
//go:build integration
package myappAlinea gopls.build.buildFlags o GOFLAGS con la CI para que los archivos etiquetados no cambien de verde localmente a rojo en CI.
go.mod deja a gopls adivinando; abre el directorio del módulo o go.work. Solución: Archivo → Abrir Carpeta en la raíz del módulo.go.work o una versión publicada, el renombrado entre módulos puede estar incompleto. Solución: Agrega go.work para ediciones locales de varios módulos.//go:build se muestran como excluidos o con errores en el editor. Solución: Establece buildFlags: ["-tags=integration"] en la configuración de gopls para que coincida con la CI.protobuf o stringer contamina la navegación. Solución: Excluye *.pb.go de las funciones del editor o marca los directorios generados en los filtros de directorio de gopls.golangci-lint run localmente con la configuración confirmada.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Búsqueda de texto plano (rg) | Explorar comentarios, cadenas o archivos que no son de Go | Renombrar símbolos o encontrar referencias tipadas |
go doc / pkg.go.dev | Leer documentación de API pública sin conexión | Navegar por internal/ privado en tu módulo |
| IDE sin gopls | Editor no compatible | Necesitas refactorizaciones precisas de Go (prefiere clientes con gopls) |
guru (legado) | Mantener flujos de trabajo muy antiguos | Iniciar nuevos proyectos (gopls lo ha reemplazado) |
Ejecuta go mod download y asegúrate de que la carpeta abierta sea la raíz del módulo.
Los proxies corporativos pueden bloquear sumdb; establece GOPROXY de manera consistente con la CI.
Solo para módulos en el mismo espacio de trabajo o aquellos que tu editor resuelve como dependencias.
No renombrará a los consumidores en repositorios que no tengas abiertos.
Definición salta al sitio de declaración del identificador.
Definición de tipo salta al tipo subyacente para alias y métodos de interfaz.
Eso suele ser el editor ejecutando goimports o acciones de código de gopls.
Deshabilita el formato al guardar o organizeImports si interfiere con tu flujo.
Sí, la navegación y el renombrado entienden los parámetros de tipo y los tipos instanciados en Go 1.18+.
Usa "Ir a implementaciones" (LSP textDocument/implementation) en el método o tipo de interfaz.
La indexación inicial verifica tipos de muchos paquetes.
Usa los límites de memoria de gopls, reduce las carpetas del espacio de trabajo y excluye los árboles de vendor.
Sí, existen gopls check y gopls vulncheck para diagnósticos sin un IDE.
La edición diaria aún se beneficia de la integración LSP.
No, son sugerencias del editor.
El compilador sigue siendo la autoridad; primero corrige los subrayados rojos que reflejen errores de compilación.
Confirma la guía del equipo independiente del editor (etiquetas de compilación, formateadores).
La configuración personal de la interfaz de usuario puede permanecer local; comparte .vscode/settings.json solo cuando el equipo se estandarice en VS Code.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado de GC Green Tea, modernizadores de
go fix- verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación) y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026