"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > **¿Cómo preservar las relaciones entre la interfaz y el implementador cuando se utilizan genéricos en Go for Slice Inicialization?**

**¿Cómo preservar las relaciones entre la interfaz y el implementador cuando se utilizan genéricos en Go for Slice Inicialization?**

Publicado el 2024-11-05
Navegar:521

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Simultaneidad de interfaz/implementación en Golang Generics

Considere la tarea de crear una función genérica para llenar un segmento con valores inicializados. Si bien esto puede parecer sencillo, surgen desafíos al intentar utilizar porciones de interfaces y especificar tipos concretos dentro de la función.

En Go 1.18, restringir tanto X como Y como cualquier tipo dentro de la función genérica Fill conduce a una pérdida de cualquier relación entre la interfaz y sus implementadores. Esto evita la asignación de instancias de Y al segmento[i] dentro de la función.

Para superar esto, se puede usar una aserción explícita:

func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}

Sin embargo, este enfoque entra en pánico cuando Y no implementa X. Además, el uso de un tipo de puntero para Y resulta en la pérdida de información sobre el tipo base y un valor de línea base nulo.

Para Para abordar estos problemas, se recomienda utilizar una función constructora en lugar de un segundo parámetro de tipo:

func main() {
    xs := make([]sync.Locker, 10)
    Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}

func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}

Este enfoque llena efectivamente el segmento con valores inicializados creados por la función constructora, proporcionando una solución más sólida y flexible al problema.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3