去编程语言界面概念性理解

时间:2013-06-04 01:57:11

标签: go

我正在编写示例Http客户端/服务器代码以了解有关Go的更多信息。在写作过程中,我需要阅读响应主体。所以我查看了Go Pkg文档http://golang.org/pkg/net/http/#Response并看到了Body io.ReadCloser,即Body的类型为io.ReaderCloser。为了知道什么是io.ReaderCloser,我点击了超链接,看到http://golang.org/pkg/io/#ReadCloser是一个实现两个方法Reader和Closer的接口。看着这个我以为我能做到这一点

line, _ , err := response.Body.Reader.ReadLine()

Go编译器然后给了我错误,没有方法或者在响应中输入Reader.Body。我认为在概念上我有一个理解为什么我不能这样做的问题。也许我在java方面思考太多了。如果有人能够指出我的误解,我将不胜感激。

由于

1 个答案:

答案 0 :(得分:5)

<强> TLDR

Body 一个Reader。它不包含一个。只需直接在Reader上调用Body方法。

血腥细节

Go接口的10秒介绍:类型必须实现的一组方法,如果它具有所有方法,则它实现接口,句点。

接下来是嵌入你的东西。如果我们有一个接口Foo

type Foo interface {
    FooIt() error
}

我们想要另一个接口也使用方法FooIt +一些东西,我们可以“嵌入”这样的接口。

type FooPlusPlus interface {
    Foo // This embeds Foo in FooPlusPlus, making all of Foo's methods
        // part of FooPlusPlus's method pool.
    FooItAll() (bool, error)
}

嵌入提供了一种编写相关接口的好方法,例如ReaderCloser。你可以有点认为它就像在Java土地上继承一样。您没有明确要求嵌入式接口,而不是要求Java中的子类具有子类。

现在实施FooPlusPlus

 type Demo int
 func (_ *Demo) FooIt() error {return nil}
 func (_ *Demo) FooItAll() (bool, error) {return false, nil}

中提琴,现在演示是FooPlusPlus