Buenas Prácticas para Funciones, Métodos e Interfaces
Reglas idiomáticas para diseñar funciones, métodos e interfaces que se mantengan legibles bajo concurrencia, pruebas y años de actualizaciones de módulos.
Busca en todas las páginas de la documentación
Reglas idiomáticas para diseñar funciones, métodos e interfaces que se mantengan legibles bajo concurrencia, pruebas y años de actualizaciones de módulos.
/v2.golangci-lint (ireturn, revive, govet) para que las convenciones se conviertan en señal de CI.go fix en 1.26 pueden cambiar los modismos.(T, error) con error al final. Coincide con las expectativas del lector y las convenciones de staticcheck.%w y prefijos de dominio. fmt.Errorf("checkout: charge: %w", err) preserva las cadenas de errors.Is.defer/errores. Los return explícitos escanean más rápido en la revisión.New(WithPort(8080)) escala sin romper a los llamadores.context.Context primero en los límites de I/O. Nunca almacenes el contexto en structs; pásalo a través de los parámetros.*T cuando existen métodos de puntero. Asegura la satisfacción de la interfaz sin sorpresas de dirección.sync.Mutex, sync.WaitGroup y campos similares solo requieren receptores de puntero.New o New<Type>. Documenta las dependencias requeridas; valida las entradas antes de devolver.io superan a las interfaces Repository de toda la empresa.New devuelve *Service, no ServiceInterface.nil para los retornos de interfaz. Prefiere (*T, error) o interfaces nil sin tipo - nunca punteros nil tipados en interfaces.func(http.Handler) http.Handler se mantiene más simple que las interfaces de un solo método cuando no se necesita un mock.id := id o pasa parámetros a go func(id int){...}(id).nil antes de llamar. Las callbacks opcionales no hacen nada cuando no están configuradas.len==0, no como identidad de slice nil. Las llamadas de cero argumentos pasan slices vacíos no nil.go test -race en paquetes que usan goroutines con estado capturado. La filosofía sin detección falla en producción.nil tipado devuelto como interfaz, estilos de receptor mixtos que rompen interfaces, contexto faltante en I/O de RPC/HTTP, errores de captura de bucle de goroutine.Comienza con A y C para APIs públicas, luego B para tipos de dominio, y D al añadir concurrencia.
La mayoría de los errores de producción se rastrean en interfaces y errores, no en la sintaxis variádica.
En servicios con pruebas, sí - define la interfaz junto al consumidor.
Las herramientas de un solo binario pueden posponerlo hasta que aparezca una segunda implementación o un mock.
Mantén los tipos del framework en los bordes.
Llama a funciones de dominio que devuelvan (T, error) y mapea los errores a estados HTTP dentro de los manejadores.
Raramente - cuando el tipo concreto debe permanecer sellado y la interfaz es el producto (plugins, fábricas de drivers).
Documenta la política de evolución.
Sombrear err con := de modo que defer ya no actualice el resultado nombrado.
Usa asignación en el err externo o evita los resultados nombrados por completo.
Envuelve los clientes generados detrás de interfaces de uno o dos métodos por caso de uso.
No reflejes interfaces de servicio gRPC completas en el código de dominio.
ireturn puede marcar retornos de interfaces desde funciones - ajusta la severidad para que coincida con la política de "devolver structs".
La consistencia importa más que habilitar cada analizador.
Usa genéricos para algoritmos compartidos; mantén interfaces para sustitución en tiempo de ejecución y I/O.
No recrees jerarquías de repositorios genéricos al estilo Java.
Las opciones sobresalen para el ajuste opcional.
La configuración requerida y validada con muchos campos interdependientes encaja en un struct verificado una vez en New.
Los reconciliadores generados ya usan receptores de puntero y clientes inyectados.
Aplica la sección C al abstraer SDKs de la nube detrás de interfaces de dominio.
Las clausuras e interfaces todavía se aplican; evita capturar mucho estado cuando la memoria es escasa.
Verifica las llamadas a interfaces en objetivos de hardware en tiempo de compilación.
Durante las actualizaciones importantes de Go y las revisiones trimestrales de API.
Añade una prueba de regresión fallida cuando se publique un error de nil tipado - enlaza en el wiki del equipo.
nil tipadosVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, modernizadores
go fix- verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026