"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 lidar com assinaturas de métodos idênticos em diferentes pacotes no Go?

Como lidar com assinaturas de métodos idênticos em diferentes pacotes no Go?

Publicado em 2024-11-06
Navegar:793

How to Handle Identical Method Signatures Across Different Packages in Go?

Tratamento de interfaces com assinaturas de métodos idênticos em pacotes diferentes

No Go, ao lidar com múltiplas interfaces com a mesma assinatura de método, mas definidas em pacotes separados, podem surgir situações em que um tipo que implementa ambas as interfaces leva a um comportamento inesperado.

Considere essas duas interfaces (Doer) e funções (FuncA e FuncB) definidas em diferentes pacotes:

// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)

// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)

Se um tipo C implementa Doer de ambos os pacotes e a implementação é diferente:

// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }

func main() {
    cA := C(0); A.FuncA(cA)
    cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}

Para resolver esse problema, o sistema de tipos do Go enfatiza a correspondência por nome e consistência nos tipos. Embora permita que um objeto satisfaça múltiplas interfaces, a implementação do método compartilhado deve aderir a todos os contratos de interface aplicáveis.

No cenário acima, uma solução alternativa envolve a implementação de tipos de wrapper:

// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }

func main() {
    cA := DoerA{C(0)}; A.FuncA(cA)
    cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}

Ao criar esses wrappers, você pode controlar a implementação de Do() com base no uso pretendido da interface, garantindo consistência dentro dos respectivos contextos de pacote.

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