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