Conversión de sectores de interfaces en sectores de interfaz compatibles
La implementación de diferentes interfaces que contienen métodos superpuestos puede proporcionar flexibilidad en la programación. Sin embargo, pasar una porción de una interfaz a una función que espera una interfaz diferente pero compatible puede generar errores. Exploremos cómo abordar este problema en Go.
Supongamos que tenemos las interfaces A y B, donde A incluye B. Una implementación de A, Impl, satisface tanto A como B.
type A interface {
Close() error
Read(b []byte) (int, error)
}
type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
fmt.Println("In read!")
return 10, nil
}
func (I Impl) Close() error {
fmt.Println("I am here!")
return nil
}
Los elementos individuales se pueden pasar entre funciones con facilidad. Sin embargo, intentar pasar porciones de A a funciones que esperan io.Reader puede fallar.
func single(r io.Reader) {
fmt.Println("in single")
}
func slice(r []io.Reader) {
fmt.Println("in slice")
}
im := &Impl{}
// works
single(im)
// FAILS!
list := []A{t}
slice(list)
Para resolver esto, podemos crear un nuevo segmento de tipo []io.Reader y completarlo con elementos de []A. Esta es la solución para evitar la limitación y garantizar la compatibilidad entre tipos de interfaz diferentes pero superpuestos.
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