Genéricos en la práctica: dificultades
Cuándo usar genéricos y errores habituales
Genéricos en la práctica: dificultades es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
Uso excesivo de genéricos
No todas las funciones necesitan ser genéricas. Si solo se utiliza un tipo concreto, un genérico añade complejidad sin aportar beneficios. Prefiera tipos concretos y refactorice para usar genéricos cuando aparezca duplicación.
Aserción de tipo dentro de genéricos
No puede hacer una aserción de tipo ni utilizar un type switch dentro de una función genérica sobre el propio parámetro de tipo; los genéricos no son plantillas. Utilice interfaces o el paquete reflect en su lugar.
// WRONG:
func Foo[T any](v T) {
if x, ok := v.(int); ok { // compile error
}
}Comparable no significa Ordered
comparable solo admite ==. Para utilizar <, >, necesita cmp.Ordered o una restricción personalizada. Un error frecuente es suponer que comparable también permite ordenar.
Un método no puede introducir parámetros de tipo
Los métodos de tipos genéricos reutilizan los parámetros del tipo, pero no pueden añadir otros nuevos. Si un método necesita un parámetro de tipo adicional, utilice una función de nivel superior.
// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile errorValores nil y cero
Para los parámetros de tipo puntero, el valor cero es nil. Para los tipos de valor, es el cero del tipo. Gestione siempre el caso cero en lugar de suponer que el valor no es nil.
Conjuntos de métodos de interfaces y genéricos
Una función genérica restringida a una interfaz solo puede llamar a los métodos declarados en esa interfaz. Añadir métodos a un tipo concreto no hace que estén disponibles a través de la restricción.
Expansión de instanciaciones (GC shapes)
Go comparte las implementaciones de los tipos con la misma forma de GC (por ejemplo, todos los tipos puntero comparten una implementación). Los tipos primitivos obtienen cada uno su propia implementación, pero el enfoque de Go mantiene los tamaños de los binarios en límites razonables.
Any no es interface{}
any es un alias de interface{}, pero una función genérica F[T any] no es lo mismo que F(v interface{}): en la función genérica, T es el tipo concreto en el punto de llamada, por lo que se conserva la información de tipos.
Tipos genéricos recursivos
Go no admite definiciones recursivas de parámetros de tipo como type Tree[T Tree[T]]. Utilice composición en su lugar:
type TreeNode[T any] struct {
Val T
Left *TreeNode[T]
Right *TreeNode[T]
}Helpers preinstanciados
Para código sensible al rendimiento, preinstancie las funciones genéricas utilizadas con frecuencia como funciones de nivel superior para evitar la sobrecarga repetida de la inferencia de tipos (aunque el compilador de Go gestiona esto correctamente).
Pruebas de código genérico
Pruebe las funciones genéricas con varias instanciaciones: una por cada restricción distinta (int, string y un tipo personalizado). Así detectará casos límite específicos de cada restricción.
func TestMap(t *testing.T) {
got := Map([]int{1,2}, double)
// test with strings too
gotS := Map([]string{"a","b"}, strings.ToUpper)
}Comprobación rápida
¿Por qué NO puede utilizar un type switch sobre un parámetro de tipo genérico T dentro de una función genérica?
Resumen: dificultades de los genéricos
Puntos clave:
- No abuse de los genéricos; los tipos concretos son más sencillos cuando solo se utilizan una vez
- No se puede utilizar un type switch ni una aserción de tipo sobre T dentro de funciones genéricas
- comparable ≠ ordenado; utilice cmp.Ordered para admitir <
- Los métodos no pueden introducir nuevos parámetros de tipo
Preguntas frecuentes
¿La lección «Genéricos en la práctica: dificultades» es gratis?
Sí — el texto completo de «Genéricos en la práctica: dificultades» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Genéricos en la práctica: dificultades»?
Cuándo usar genéricos y errores habituales Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Genéricos en la práctica: dificultades»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Sintaxis de los parámetros de tipo
- Restricciones: comparable e interfaces
- Estructuras de datos genéricas
- Genéricos en la práctica: dificultades