Simultaneidade de interface/implementação em Golang Generics
Considere a tarefa de criar uma função genérica para preencher uma fatia com valores inicializados. Embora isso possa parecer simples, surgem desafios ao tentar utilizar fatias de interfaces e especificar tipos concretos dentro da função.
No Go 1.18, restringir X e Y como quaisquer tipos dentro da função genérica Fill leva a uma perda de qualquer relacionamento entre a interface e seus implementadores. Isso evita a atribuição de instâncias de Y para slice[i] dentro da função.
Para superar isso, uma afirmação explícita pode ser usada:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
No entanto, esta abordagem entra em pânico quando Y não implementa X. Além disso, usar um tipo de ponteiro para Y resulta na perda de informações sobre o tipo base e um valor de linha de base nulo.
Para Para resolver esses problemas, é recomendável usar uma função construtora em vez de um 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()
}
}
Essa abordagem preenche efetivamente a fatia com valores inicializados criados pela função construtora, fornecendo uma solução mais robusta e flexível para o problema.
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