Sobes.tech
Middle+

¿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.