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 时间与界面定义的时间不同。再看一下错误信息 have
和 want
语句。
我不相信存在愚蠢的问题。有诚恳的提问就有求知欲,不能定义傻:)
Go 依靠方法签名来决定两个接口是否相同。如果两个方法签名 return 本质上是不同的类型,则不能说它们相等。
P.S。
如果我表达我的意见,我认为您的 Accepter
抽象是不合理的。我正在努力解释它的作用。想出一个好的抽象很难,我很确定现有的抽象已经足以做你想做的事——测试你的业务逻辑。
假设您的业务逻辑解析 JSON 文档并将其转换为人类可读的文本。您可以将其打包为具有以下签名的函数:
func DescribeDocument(src io.Reader, dst io.Writer) error {
...
}
您可以将实现 net.Conn
接口的对象传递给生产代码中的此函数或测试代码中的 bytes.Buffer
对象。无需发明不必要的抽象 :)
我对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 时间与界面定义的时间不同。再看一下错误信息 have
和 want
语句。
我不相信存在愚蠢的问题。有诚恳的提问就有求知欲,不能定义傻:)
Go 依靠方法签名来决定两个接口是否相同。如果两个方法签名 return 本质上是不同的类型,则不能说它们相等。
P.S。
如果我表达我的意见,我认为您的 Accepter
抽象是不合理的。我正在努力解释它的作用。想出一个好的抽象很难,我很确定现有的抽象已经足以做你想做的事——测试你的业务逻辑。
假设您的业务逻辑解析 JSON 文档并将其转换为人类可读的文本。您可以将其打包为具有以下签名的函数:
func DescribeDocument(src io.Reader, dst io.Writer) error {
...
}
您可以将实现 net.Conn
接口的对象传递给生产代码中的此函数或测试代码中的 bytes.Buffer
对象。无需发明不必要的抽象 :)