Genericos En Go

Entradas Archivos Wallpaper ASCCI Problemas

Los genericos se pueden declarar y usar funciones y tipos para que trabajen con cualquier set de tipos.

Ejemplo

Un ejemplo del uso de valores no genericos es el siguiente:

// SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {
    var s int64
    for _, v := range m {
        s += v
    }
    return s
}

// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {
    var s float64
    for _, v := range m {
        s += v
    }
    return s
}
func main() {
    // Initialize a map for the integer values
    ints := map[string]int64{
        "first":  34,
        "second": 12,
    }

    // Initialize a map for the float values
    floats := map[string]float64{
        "first":  35.98,
        "second": 26.99,
    }

    fmt.Printf("Non-Generic Sums: %v and %v\n",
        SumInts(ints),
        SumFloats(floats))
}

En donde para cada tipo de dato hay una funcion diferente

Sintaxis

Para crear genericos se tiene que especificar que tipos de datos son soportados, para esto se crearon las funciones con parametros de tipos para que funcionen con parametros de diferentes tipos, y finalmente la funcion se llama con argumentos de tipo y argumentos normales.

Cuando se define un tipo, cada parametro debe tener un type constraint (restricciones de tipo) cada type constraint limita que tipos pueden usar dicha funcion, al momento de la compilacion se verifica que el tipo que pasa coincida con los limites que le fueron puestos

func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

En este caso se define que K debe tener la interfaz comparable y que V sea o int o float, Y en los argumentos de la funcion se define de que tipo debe ser cada parametro

Al final el codigo quedaria asi:

    SumIntsOrFloats[string, int64](ints),
    SumIntsOrFloats[string, float64](floats))