我有以下类型定义:
type reader io.Reader
我希望这个reader
类型实现io.Reader
接口,所以我这样做:
func (r reader) Read(p []byte) (n int, err error) {
return io.Reader(r).Read(p)
}
问题在于:io.Reader(r)
可能意味着两件事之一:
r
转换为其基础类型(io.Reader
)r
满足io.Reader
接口(因为我们已经定义了Read([]byte) (int, error)
方法,它确实如此)。创建一个新的io.Reader
接口值并在其中存储r
。我希望前者发生。如果后者发生,当我调用io.Reader(r).Read(p)
时,它会调用r
的基础Read
方法(我们现在在里面),它将无限循环。我喜欢的目的是提取 io.Reader
中的基础r
,并使用 {{1方法。
当然,我可以测试一下,在实践中看到这两种情况中的哪一种发生,但我总体上对Go编译器如何解决这些问题感到好奇。我在语言规范中找不到相关信息。
答案 0 :(得分:9)
您不能在reader
中使用定义为io.Reader
的接口类型func (r reader) {}
作为接收器类型。
您需要将阅读器类型定义为特定类型
type reader struct {
// stuff
}
要回答您的问题,io.Reader(r)
表示在编译时断言r
满足io.Reader
接口并创建新的io.Reader
接口值并存储{{1} } 在里面。 (你的第二选择)。
因此,如果您尝试以上操作,您将获得无限递归。
底层r
的概念在Go中没有任何意义,因为您无法在接口上定义方法,只能在具体类型上定义。
您当然可以将类型嵌入到彼此之内,这可能看起来像这样
io.Reader
然后你会打电话给
type reader struct {
other io.Reader
}
答案 1 :(得分:0)
我认为接收器方法仅适用于Struct,而且您正在尝试将一个接口实现到另一个接口。我不知道这是否可行。在像Java这样的其他语言中,实现是通过抽象类解决的,但GoLang在你的核心中没有这个主题。