"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 > **Como preservar relacionamentos entre interface e implementador ao usar genéricos no Go for Slice Initialization?**

**Como preservar relacionamentos entre interface e implementador ao usar genéricos no Go for Slice Initialization?**

Publicado em 2024-11-05
Navegar:775

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

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.

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