我有一个关于go中接口使用的问题。我还在学习这门语言,所以如果这是一个愚蠢的问题,请原谅我。
我正在玩一个接受并处理TCP连接的小应用程序。因为我想测试业务逻辑,而不是网络魔法,所以我试图使用接口使其保持一点抽象(这样我就可以使用简单的io.ReadWriteCloser
对象模拟net.Conne对象(。
这是我的问题:
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
}
我看到的错误是:
net.Listener does not implement Accepter (wrong type for Accept method)
have Accept() (net.Conn, error)
want Accept() (io.ReadWriteCloser, error)
我不明白为什么会发生这种情况,因为查看文档和netlib源代码,我发现net.Conn
实际上是在实现io.ReadWriteCloser
。
我犯了什么错?非常感谢!
我不相信存在愚蠢的问题。如果有一个诚实的问题,那就是对知识的渴望,从定义上讲,这不可能是愚蠢的:(
Go依赖于方法签名来决定两个接口是否相同。如果两个方法签名返回的类型本质上不同,就不能说它们是相等的。
p.S。如果我表达我的观点,我认为你的Accepter
抽象是不合理的。我很难解释它的作用。提出一个好的抽象是很困难的,我非常确信现有的抽象已经足够做你想要做的事情了——测试你的业务逻辑。
假设您的业务逻辑解析JSON文档并将其转换为可读文本。您可以将其打包为具有以下签名的函数:
func DescribeDocument(src io.Reader, dst io.Writer) error {
...
}
您可以在生产代码中将实现net.Conn
接口的对象传递给此函数,也可以在测试代码中将bytes.Buffer
对象传递给它。无需发明不必要的抽象:(
错误准确地告诉您问题是什么:
net.Listener does not implement Accepter (wrong type for Accept method)
have Accept() (net.Conn, error)
want Accept() (io.ReadWriteCloser, error)
您的返回时间与接口定义的返回时间不同。再次查看错误消息have
和want
语句。