Conceptos básicos de patrones de Go
10 ejemplos para empezar con patrones y modismos de Go - 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con patrones y modismos de Go - 7 básicos y 3 intermedios.
go version reporta go1.26 o posterior)go versionCompón comportamiento incrustando un tipo con los métodos que necesitas.
type LoggingHandler struct {
http.Handler
log *slog.Logger
}
func (h LoggingHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.log.Info("request", "path", r.URL.Path)
h.Handler.ServeHTTP(w, r)
}ServeHTTP del manejador internoRelacionado: Modismos de Go: Composición sobre Herencia - por qué Go evita la herencia
Declara la interfaz donde llamas al comportamiento, no donde lo implementas.
// paquete consumidor
type Clock interface {
Now() time.Time
}
func TTL(c Clock, issued time.Time, ttl time.Duration) bool {
return c.Now().After(issued.Add(ttl))
}Clock, Store) no en implementaciones (PostgresClock)Relacionado: Funciones Constructoras y APIs de Paquetes - conectando dependencias a través de constructores
Devuelve valores inicializados desde funciones New en lugar de exportar structs mutables.
type Counter struct {
n atomic.Int64
}
func NewCounter() *Counter { return &Counter{} }
func (c *Counter) Inc() { c.n.Add(1) }
func (c *Counter) Value() int64 { return c.n.Load() }New documenta la construcción válida; el valor cero puede ser inválido para algunos tiposRelacionado: Funciones Constructoras y APIs de Paquetes - convenciones New/Open
Modela configuraciones opcionales como funciones que mutan el objetivo durante la construcción.
type Option func(*Server)
func WithPort(p int) Option {
return func(s *Server) { s.port = p }
}
func NewServer(opts ...Option) *Server {
s := &Server{port: 8080}
for _, opt := range opts {
opt(s)
}
return s
}New; los llamadores anulan solo lo que necesitanNewServer(WithPort(3000), WithTLS(cert))Relacionado: Patrón de Opciones Funcionales - recorrido completo del patrón
Envuelve manejadores con funciones que se ejecutan antes y después de la lógica interna.
func withRequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := uuid.NewString()
ctx := context.WithValue(r.Context(), requestIDKey, id)
w.Header().Set("X-Request-Id", id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}func(http.Handler) http.Handler es nativa de la biblioteca estándarRelacionado: Patrones de Middleware y Decorador - encadenamiento y ordenación
Aísla el almacenamiento detrás de una interfaz de la que depende el servicio.
type User struct { ID string; Email string }
type UserRepo interface {
Get(ctx context.Context, id string) (User, error)
}
type Service struct { repo UserRepo }
func (s *Service) Email(ctx context.Context, id string) (string, error) {
u, err := s.repo.Get(ctx, id)
if err != nil { return "", err }
return u.Email, nil
}UserRepo en memoria falso sin una base de datosRelacionado: Patrones de Capa de Repositorio y Servicio - guía de capas
Inicializa recursos costosos exactamente una vez, de forma segura bajo concurrencia.
var (
client *http.Client
once sync.Once
)
func HTTPClient() *http.Client {
once.Do(func() {
client = &http.Client{Timeout: 10 * time.Second}
})
return client
}once.Do ejecuta la función exactamente una vez entre goroutinesinit() - la inicialización perezosa o la conexión de constructores es más seguraRelacionado: Patrones sync.Once y Singleton - cuándo son aceptables las globales
Valida las opciones compuestas antes de devolver el valor construido.
func NewPool(size int, opts ...PoolOption) (*Pool, error) {
if size <= 0 {
return nil, errors.New("pool: size must be positive")
}
p := &Pool{size: size, idle: 30 * time.Second}
for _, opt := range opts {
if err := opt(p); err != nil {
return nil, err
}
}
return p, nil
}error desde New señala combinaciones inválidas tempranamenteerror cuando la validación es por opciónRelacionado: Patrón de Opciones Funcionales - estrategias de validación
Conecta un servicio a partir de interfaces definidas en el paquete consumidor.
type Notifier interface {
Send(ctx context.Context, to, body string) error
}
type OrderService struct {
repo OrderRepo
notify Notifier
}
func NewOrderService(repo OrderRepo, notify Notifier) *OrderService {
return &OrderService{repo: repo, notify: notify}
}fakeNotifier y fakeRepo*OrderService concreto; acepta interfaces en los parámetrosRelacionado: Patrones de Capa de Repositorio y Servicio - pruebas con fakes
Compón middleware compatibles con la biblioteca estándar en un enrutador chi.
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Recoverer)
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
})r.Use registra el middleware externo para todas las rutas en el ámbitonet/http - los manejadores son http.HandlerFunc simplesRelacionado: Patrones de Middleware y Decorador - encadenamiento independiente del framework
Versiones de la pila: Esta página fue escrita para Go 1.26.x (GC predeterminado Green Tea, go fix modernizers - 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 los objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026