Go接口:是不是net.Conn一个io.ReadWriteCloser?

Go interfaces: is not net.Conn a io.ReadWriteCloser?

我对go接口的使用有疑问。我还在学习语言,所以如果这是一个愚蠢的问题,请原谅我。

我正在玩一个接受和处理 TCP 连接的小应用程序。因为我想测试业务逻辑而不是网络魔术,所以我试图使用接口使其保持一点抽象(因此我可以使用简单的 io.ReadWriteCloser 对象模拟 net.Conn 对象)。

这是我的问题:

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)

我不明白为什么会这样,因为检查文档和 net lib 源代码,我看到 net.Conn 实际上是在实现 io.ReadWriteCloser

我的错误是什么?非常感谢!

该错误告诉您确切的问题所在:

net.Listener does not implement Accepter (wrong type for Accept method)
                have Accept() (net.Conn, error)
                want Accept() (io.ReadWriteCloser, error)

您的 return 时间与界面定义的时间不同。再看一下错误信息 havewant 语句。

我不相信存在愚蠢的问题。有诚恳的提问就有求知欲,不能定义傻:)

Go 依靠方法签名来决定两个接口是否相同。如果两个方法签名 return 本质上是不同的类型,则不能说它们相等。

P.S。 如果我表达我的意见,我认为您的 Accepter 抽象是不合理的。我正在努力解释它的作用。想出一个好的抽象很难,我很确定现有的抽象已经足以做你想做的事——测试你的业务逻辑。

假设您的业务逻辑解析 JSON 文档并将其转换为人类可读的文本。您可以将其打包为具有以下签名的函数:

func DescribeDocument(src io.Reader, dst io.Writer) error {
    ...
}

您可以将实现 net.Conn 接口的对象传递给生产代码中的此函数或测试代码中的 bytes.Buffer 对象。无需发明不必要的抽象 :)