Go中的模糊转换语法

时间:2014-04-15 21:09:57

标签: go type-conversion

我有以下类型定义:

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编译器如何解决这些问题感到好奇。我在语言规范中找不到相关信息。

2 个答案:

答案 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在你的核心中没有这个主题。