"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > As restrições de união dos genéricos podem chamar métodos compartilhados sem declaração de interface explícita?

As restrições de união dos genéricos podem chamar métodos compartilhados sem declaração de interface explícita?

Publicado em 23/12/2024
Navegar:417

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

Chamando métodos em restrições de união em genéricos Go

Em genéricos Go (v1.18), você pode encontrar uma restrição de união de tipo que limita o tipo de parâmetro para tipos que implementam uma interface unificada. No entanto, a incapacidade de chamar métodos compartilhados entre os tipos restritos levanta preocupações sobre a utilidade de tais restrições.

Considere o seguinte 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

O erro do compilador "x.some indefinido" é devido ao fato de que a restrição de união de tipo *A | *B não garante a existência de algum método em *A e *B.

Para resolver esse problema, você pode adicionar o método à restrição de interface:

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

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

Isso restringe T a tipos que implementam *A ou *B e declaram o método some.

No entanto, esta solução é vista como uma solução alternativa para o que idealmente deveria funcionar apenas com uniões de tipo. Go 1.18 atualmente tem limitações onde o compilador suporta chamar um método em um valor do parâmetro de tipo P somente se o método m for declarado explicitamente pela interface de restrição de P. Apesar das especificações da linguagem afirmarem que o conjunto de métodos de uma interface é a interseção dos conjuntos de métodos de cada tipo no conjunto de tipos da interface. Espera-se que esse problema seja resolvido no Go 1.19.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3