我正在编写示例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方面思考太多了。如果有人能够指出我的误解,我将不胜感激。
由于
答案 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)
}
嵌入提供了一种编写相关接口的好方法,例如Reader
和Closer
。你可以有点认为它就像在Java土地上继承一样。您没有明确要求嵌入式接口,而不是要求Java中的子类具有子类。
现在实施FooPlusPlus
type Demo int
func (_ *Demo) FooIt() error {return nil}
func (_ *Demo) FooItAll() (bool, error) {return false, nil}
中提琴,现在演示是FooPlusPlus
。