"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar firmas de métodos idénticos en diferentes paquetes en Go?

¿Cómo manejar firmas de métodos idénticos en diferentes paquetes en Go?

Publicado el 2024-11-06
Navegar:386

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

Manejo de interfaces con firmas de métodos idénticas en diferentes paquetes

En Go, cuando se trata de múltiples interfaces con la misma firma de método pero definidas en paquetes separados, pueden surgir situaciones en las que un tipo que implementa ambas interfaces genera un comportamiento inesperado.

Considere estas dos interfaces (Doer) y funciones (FuncA y FuncB) definidas en diferentes paquetes:

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

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

Si un tipo C implementa Doer desde ambos paquetes y la implementación difiere:

// 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 abordar este problema, el sistema de tipos de Go enfatiza la coincidencia por nombre y la coherencia en los tipos. Si bien permite que un objeto satisfaga múltiples interfaces, la implementación del método compartido debe cumplir con todos los contratos de interfaz aplicables.

En el escenario anterior, una solución alternativa implica implementar tipos de contenedor:

// 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
}

Al crear estos contenedores, puede controlar la implementación de Do() en función del uso previsto de la interfaz, lo que garantiza la coherencia dentro de los respectivos contextos del paquete.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3