Go接口:不是网络.连接io.ReadWriteCloser



我有一个关于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)

您的返回时间与接口定义的返回时间不同。再次查看错误消息havewant语句。

最新更新