Guía de inicio rápida de Go Rules
10 ejemplos para empezar con las reglas de Go: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con las reglas de Go: 7 básicos y 3 intermedios.
mkdir rulesdemo && cd rulesdemo && go mod init example.com/rulesdemo.El formato canónico es la primera regla que comparte cada repositorio de Go.
gofmt -w .
test -z "$(gofmt -l .)" || echo "los archivos necesitan formato"package main
import "fmt"
func main() {fmt.Println("antes de gofmt")}gofmt elimina por completo el debate sobre el formato de las revisiones de código.gofmt -l imprima cualquier ruta.Relacionado: Effective Go como estándar vivo - cómo la guía oficial se superpone con las reglas del equipo
Go trata los errores como valores; ignorarlos viola los modismos centrales.
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("config.yaml")
if err != nil {
fmt.Fprintf(os.Stderr, "abrir config: %v\n", err)
os.Exit(1)
}
defer f.Close()
}err de una llamada a función necesita una rama explícita.main decide si registrar, envolver o salir._ descarta solo cuando aceptas deliberadamente la pérdida de señal.Relacionado: Errores como valores: la filosofía de errores de Go - por qué los errores no son excepciones
Añade %w cuando los llamadores necesiten errors.Is o errors.As.
package demo
import (
"errors"
"fmt"
"io"
)
var ErrNotFound = errors.New("demo: no encontrado")
func Load(r io.Reader) error {
if r == nil {
return fmt.Errorf("carga: %w", ErrNotFound)
}
return nil
}load, fetch user).Relacionado: Envoltura de errores con %w y errors.As - profundidad de envoltura e inspección
Las funciones de IO y RPC aceptan cancelación y plazos a través de context.
package demo
import (
"context"
"time"
)
func Fetch(ctx context.Context, id string) error {
ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
// ... usa ctx en llamadas salientes
return nil
}ctx; colócalo primero en la firma.ctx por la pila; no lo almacenes en structs.context.Background() pertenece a main, pruebas y manejadores de nivel superior.Relacionado: Lista de verificación de reglas de concurrencia - reglas de cancelación y propiedad
Mantén los parámetros de función flexibles; mantén los tipos de retorno específicos.
package demo
import "io"
type Store struct{}
func (s *Store) Save(w io.Writer, data []byte) (int, error) {
return w.Write(data)
}
func NewStore() *Store { return &Store{} }io.Writer, io.Reader o interfaces de dominio pequeñas.*Store evita comportamientos sorpresa detrás de interfaces sin nombre.Relacionado: Reglas de diseño de API para bibliotecas de Go - reglas de nomenclatura y superficie
Los identificadores exportados son un contrato de compatibilidad.
// Package demo muestra godoc mínimo en exportaciones.
package demo
// Greeter formatea un saludo para name.
// Devuelve una cadena vacía cuando name está en blanco.
func Greeter(name string) string {
if name == "" {
return ""
}
return "hello, " + name
}example_test.go aparecen en pkg.go.dev.Relacionado: Lista de verificación de reglas de Effective Go - lista completa de modismos
Vet detecta errores que el compilador permite.
go vet ./...package main
import "fmt"
func main() {
fmt.Printf("%d", "text") // vet: discrepancia de verbo de formato
}Relacionado: Conceptos básicos de calidad de código - formato, vet y hooks
Codifica el comportamiento de la regla como datos para que los revisores vean los casos claramente.
package demo
import "testing"
func TestGreeter(t *testing.T) {
tests := []struct {
name string
in string
want string
}{
{"vacío", "", ""},
{"alice", "alice", "hello, alice"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Greeter(tt.in); got != tt.want {
t.Fatalf("got %q want %q", got, tt.want)
}
})
}
}t.Run que se lean como elementos de una lista de verificación.-race cuando las pruebas toquen goroutines.Relacionado: Pruebas basadas en tablas y subpruebas - reglas de estructura de pruebas
Oculta los paquetes de implementación que los consumidores no deben importar.
rulesdemo/
go.mod
demo/
public.go
internal/
storage/
storage.go// la raíz del módulo importa solo paquetes públicos; internal es forzado por el compilador.
import "example.com/rulesdemo/internal/storage" // falla fuera del módulointernal/ son rechazadas por el compilador a través de los límites del módulo.internal sobre la documentación sola para "no importar".Relacionado: Nomenclatura de paquetes y directorios internal/ - reglas de diseño
Las reglas de optimización asumen evidencia de perfilado.
go test -bench=. -benchmem ./...
go test -cpuprofile=cpu.prof -bench=. ./...
go tool pprof -top cpu.profRelacionado: Reglas de rendimiento: Cuándo optimizar - flujo de trabajo de medir primero
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, modernizadores 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: 18 jul 2026