¿Cuáles son las formas de escribir código genérico en Go?
sobes.tech AI
Respuesta de la IA
En Go, se presentan las siguientes formas principales de escribir código genérico:
-
Interfaces: Permiten escribir funciones que trabajan con cualquier tipo que satisfaga un conjunto determinado de métodos.
// Definición de la interfaz Reader type Reader interface { Read(p []byte) (n int, err error) } // Función que trabaja con cualquier tipo que implemente Reader func ProcessData(r Reader) error { // lectura de datos desde Reader return nil } -
Interfaz vacía (
interface{}): Tipo universal que puede representar cualquier valor. Requiere conversión de tipos antes de usar.func PrintAnything(v interface{}) { // Conversión de tipo con comprobación if s, ok := v.(string); ok { fmt.Println("Esto es una cadena:", s) } else if i, ok := v.(int); ok { fmt.Println("Esto es un número entero:", i) } } -
Genéricos (Generics) / Tipos parametrizados (parámetros de tipo): Permiten escribir funciones y tipos que trabajan con conjuntos arbitrarios de tipos especificados en la declaración. Añadidos en Go 1.18.
// Función que trabaja con slices de cualquier tipo T func PrintSlice[T any](s []T) { for _, v := range s { fmt.Println(v) } } // Tipo genérico Pair con parámetros T1 y T2 type Pair[T1, T2 any] struct { First T1 Second T2 } -
Reflexión (
reflect): Permite explorar e interactuar con tipos y valores en tiempo de ejecución. Se usa a menudo para escenarios complejos, pero puede ser menos eficiente y seguro que otros enfoques.import "reflect" func GetTypeName(v interface{}) string { return reflect.TypeOf(v).Name() }
La elección del método depende de la tarea específica y del nivel de flexibilidad y rendimiento requerido. Los genéricos son la forma preferida para crear algoritmos y estructuras de datos genéricos en el Go moderno. Las interfaces siguen siendo un mecanismo clave para el polimorfismo y la definición de comportamiento. La interfaz vacía y la reflexión se usan con menos frecuencia, en casos más específicos.