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

tab*_*iul 3 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()
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dan*_*zer 5

TLDR

身体一个Reader.它不包含一个.只需Reader直接调用方法即可Body.

血腥细节

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

接下来是嵌入你的东西.如果我们有一个界面Foo

type Foo interface {
    FooIt() error
}
Run Code Online (Sandbox Code Playgroud)

我们想要另外一个接口也使用方法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)
}
Run Code Online (Sandbox Code Playgroud)

嵌入提供了一种编写相关接口的好方法,比如ReaderCloser.您可以还挺想它像Java中的土地继承.您没有明确要求嵌入式接口,而不是要求Java中具有子类的父类.

现在实施 FooPlusPlus

 type Demo int
 func (_ *Demo) FooIt() error {return nil}
 func (_ *Demo) FooItAll() (bool, error) {return false, nil}
Run Code Online (Sandbox Code Playgroud)

而中提琴,现在演示是一个FooPlusPlus.