Parámetros de Tipo y Interfaces de Restricción
Los parámetros de tipo se declaran en listas de corchetes, y las interfaces de restricción definen qué tipos pueden reemplazarlos usando métodos, tipos subyacentes (~T) y uniones (|).
Busca en todas las páginas de la documentación
Los parámetros de tipo se declaran en listas de corchetes, y las interfaces de restricción definen qué tipos pueden reemplazarlos usando métodos, tipos subyacentes (~T) y uniones (|).
Los parámetros de tipo convierten tipos concretos en variables de tiempo de compilación para funciones y tipos nombrados.
Las interfaces de restricción son las barreras de seguridad: enumeran las operaciones y conjuntos de tipos permitidos.
El operador ~ coincide con tipos nombrados por su tipo subyacente; | une múltiples tipos o tipos subyacentes en una restricción.
Los tipos de restricción nombrados mantienen las API legibles cuando el mismo límite aparece en muchas firmas.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
// Restricción nombrada - reutilizable en APIs
type Ordered interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
~float32 | ~float64 |
~string
}
func Clamp[T Ordered](v, lo, hi T) T {
if v < lo {
return lo
}
if v > hi {
return hi
}
return v
}Cuándo usar esto:
~byte).int | string es inválido para operaciones compartidas - diseña con cuidado).package main
import (
"fmt"
"strconv"
)
// Restricción de método
type Stringable interface {
String() string
}
// Tipo subyacente + unión
type Digit interface {
~int | ~int8 | ~int16 | ~int32 | ~int64
}
type UserID int
func (id UserID) String() string {
return strconv.Itoa(int(id))
}
func FormatAll[T Stringable](items []T) string {
out := ""
for i, v := range items {
if i > 0 {
out += ", "
}
out += v.String()
}
return out
}
func Twice[T Digit](v T) T {
return v * 2
}
func main() {
ids := []UserID{1, 2, 3}
fmt.Println(FormatAll(ids))
fmt.Println(Twice(UserID(5)))
}Lo que esto demuestra:
v.String() dentro del cuerpo genérico.~int permite que UserID satisfaga Digit sin listar cada tipo int nombrado.Stringable vs Digit).func F[T any]()) o tipos (type Stack[T any] struct{}).any.| Forma | Ejemplo | Coincide con |
|---|---|---|
| Lista de métodos | interface { Read([]byte) (int, error) } | Tipos con método Read |
| Tipo subyacente | ~int | int, MyInt, cualquier tipo nombrado con int subyacente |
| Literal de tipo | int | Solo el tipo literal int, no el nombrado MyInt |
| Unión | ~int | ~float64 | Enteros y flotantes nombrados o literales según las reglas de cada miembro |
| Mixto | interface { ~int; String() string } | int subyacente y método String() |
| Sintaxis | Significado |
|---|---|
[T any] | Parámetro único, sin restricciones |
[T, U comparable] | Dos parámetros, restricciones independientes |
[T Ordered, U any] | Mezcla de restricciones personalizadas y predefinidas |
func (s *Set[T]) Add(v T) | El método usa la T de la struct, sin nueva lista de parámetros |
// Extrae restricciones a nombres a nivel de paquete para APIs públicas
type JSONMarshaler interface {
MarshalJSON() ([]byte, error)
}
func Encode[T JSONMarshaler](v T) ([]byte, error) {
return v.MarshalJSON()
}
// Incrustando restricciones predefinidas
type Key interface {
comparable
fmt.Stringer
}<, el cuerpo no puede usar < en T.cmp.Ordered y cmp.Or de la biblioteca estándar en lugar de copiar listas de unión grandes.int en lugar de ~int: Los tipos nombrados como type Celsius float64 no coincidirán solo con float64. Solución: usa ~float64 cuando los tipos nombrados deban calificar.int | string no puede usar + o comparaciones compartidas más allá de == si no son comparables juntas. Solución: reduce la unión o divide las funciones.comparable incorrectamente: interface { comparable; []byte } es inválido porque los slices no son comparables. Solución: lista solo términos de tipo comparables.[T any, T comparable] es inválido. Solución: un nombre por parámetro en la lista.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
cmp.Ordered / restricciones de la biblioteca estándar | Ayudas de ordenación e igualdad | Tipos de dominio específicos no ordenados |
Generación de código (go generate) | Muchos tipos, sin sintaxis genérica en la API | Pequeño número de ayudantes, el equipo conoce los genéricos |
interface{} / any + switch de tipo | Formas verdaderamente dinámicas (JSON, plugins) | Rutas críticas que necesitan tipado estático |
| Funciones separadas no genéricas | Solo dos tipos concretos | Muchos tipos con lógica idéntica |
~T significa "cualquier tipo cuyo tipo subyacente sea T."
Incluye tipos nombrados definidos como type MyInt int.
Sí, con |, pero cada operación en el cuerpo genérico debe ser válida para todos los miembros de la unión.
Las uniones amplias a menudo fallan las comprobaciones de compilación.
Exporta cuando los llamadores deban nombrarlas para sus propios genéricos.
Mantén las restricciones internas sin exportar y estables.
Es una interfaz de restricción de la biblioteca estándar que enumera tipos incorporados y subyacentes ordenados.
Prefiere importar cmp en lugar de copiar la unión.
Sí - el incrustado de interfaces funciona como las interfaces ordinarias.
Los conjuntos de métodos se combinan según las reglas de interfaz de Go.
any permite todos los tipos pero no == a menos que se reduzca.
comparable permite operaciones de igualdad en tipos permitidos.
Los tipos de interfaz no pueden declarar parámetros de tipo en Go.
Usa funciones genéricas o structs genéricas en su lugar.
Lee el mensaje del compilador sobre qué operación falló en qué argumento de tipo.
Reduce la unión o añade los métodos requeridos a la restricción.
No - las instanciaciones son en tiempo de compilación.
La reflexión ve tipos instanciados concretos, no nombres de parámetros.
Cuando el mismo límite aparece en tres o más firmas o documenta un concepto de dominio (por ejemplo, NodeID).
No - las reglas de satisfacción implícita no han cambiado.
Las restricciones son interfaces utilizadas en tiempo de compilación.
No - solo los tipos genéricos llevan parámetros a los métodos.
Las funciones libres y los tipos genéricos declaran parámetros.
comparablecmp.OrderedVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea,
go fix modernizers- verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica objetivos de placa en la compilación), wazero (última - verifica en la compilación) y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026