"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 > ¿Pueden las restricciones de unión de Go Generics llamar a métodos compartidos sin una declaración de interfaz explícita?

¿Pueden las restricciones de unión de Go Generics llamar a métodos compartidos sin una declaración de interfaz explícita?

Publicado el 2024-12-23
Navegar:130

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

Métodos de llamada en restricciones de unión en Go Generics

En Go generics (v1.18), puede encontrar una restricción de unión de tipo que limita el tipo de parámetro a tipos que implementan una interfaz unificada. Sin embargo, la imposibilidad de llamar a métodos compartidos entre los tipos restringidos genera preocupaciones sobre la utilidad de dichas restricciones.

Considere el siguiente código:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

El error del compilador "x.some undefinido" se debe a que la restricción de unión de tipo *A | *B no garantiza la existencia de algún método tanto en *A como en *B.

Para resolver este problema, puede agregar el método a la restricción de interfaz:

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

Esto restringe T a tipos que implementan *A o *B y declaran el método some.

Sin embargo, esta solución se considera una solución alternativa a lo que idealmente debería funcionar solo con uniones de tipos. Actualmente, Go 1.18 tiene limitaciones en las que el compilador admite llamar a un método en un valor del parámetro de tipo P solo si el método m está declarado explícitamente mediante la interfaz de restricción de P. A pesar de que las especificaciones del lenguaje indican que el conjunto de métodos de una interfaz es la intersección de los conjuntos de métodos de cada tipo en el conjunto de tipos de la interfaz. Se espera que este problema se solucione en Go 1.19.

Ú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