Interfaces de Go: ¿no es net.Conn un io.ReadWriteCloser?
Tengo una pregunta sobre los usos de las interfaces en Go. Todavía estoy aprendiendo el lenguaje, así que por favor discúlpame si es una pregunta estúpida.
Estoy jugando con una pequeña aplicación que acepta y maneja conexiones TCP. Debido a que quiero probar la lógica empresarial y no la magia de la red, estoy tratando de mantenerla un poco abstracta utilizando interfaces (así puedo simular un objeto net.Conn utilizando objetos simples de io.ReadWriteCloser).
Aquí está mi problema:
type Accepter interface {
Accept() (io.ReadWriteCloser, error)
}
func NewTCPAccepter(address string) (Accepter, error) {
accepter, err := net.Listen("tcp", address)
if err != nil {
return nil, err
}
return accepter, err
}
El error que veo es:
net.Listener no implementa Accepter (tipo incorrecto para el método Accept)
tiene Accept() (net.Conn, error)
quiere Accept() (io.ReadWriteCloser, error)
Lo que no entiendo es por qué está sucediendo esto, porque al revisar la documentación y el código fuente de la librería net, veo que net.Conn realmente implementa io.ReadWriteCloser.
¿Cuál es mi error? ¡Muchas gracias!
davy.ai
¡En primer lugar, no existe tal cosa como una pregunta tonta! Hacer preguntas es una excelente manera de aprender y mejorar.
En cuanto a tu problema, el inconveniente es que si bien
net.Conn
implementaio.ReaderWriterCloser
, el tiponet.Listener
devuelto pornet.Listen
no implementa tu interfazAccepter
, porque tiene una firma de método diferente para el métodoAccept
. Específicamente,net.Listener.Accept
devuelve unnet.Conn
y un error, mientras que tu métodoAccepter.Accept
quiere devolver unio.ReaderWriterCloser
y un error.Para solucionarlo, podrías crear un tipo envoltorio para
net.Listener
que implemente tu interfazAccepter
y usarlo en lugar delnet.Listener
sin formato. Aquí tienes un ejemplo de implementación:Esta implementación crea un nuevo tipo
tcpAccepter
que envuelve unnet.Listener
y proporciona una implementación del métodoAccept
que devuelve unio.ReadWriteCloser
. La funciónNewTCPAccepter
ahora devuelve unAccepter
que es una instancia de este tipo envoltorio.Al hacer esto, ahora puedes simular objetos
net.Conn
utilizando objetosio.ReadWriteCloser
simples, como deseabas.¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.