我正在编写示例 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 两个方法的接口(interface)。看着这个我觉得我可以做到这一点
line, _ , err := response.Body.Reader.ReadLine()
然后 Go 编译器给了我错误,没有方法或类型 Reader in response.Body。我认为从概念上讲,我在理解为什么我不能这样做时遇到了问题。也许我在 Java 方面想得太多了。如果有人能指出我的误解,我将不胜感激。
谢谢
最佳答案
TLDR
Body 是一个Reader
。它不包含一个。只需在 Body
上直接调用 Reader
方法即可。
血淋淋的细节
Go 接口(interface)的 10 秒介绍:类型必须实现的一组方法,如果它具有所有方法,则它实现了接口(interface),句号。
接下来就是让你咬牙切齿的东西,嵌入。如果我们有一个接口(interface) Foo
type Foo interface {
FooIt() error
}
我们还需要另一个接口(interface),方法是 FooIt
+ 一些东西,我们可以像这样“嵌入”接口(interface)。
type FooPlusPlus interface {
Foo // This embeds Foo in FooPlusPlus, making all of Foo's methods
// part of FooPlusPlus's method pool.
FooItAll() (bool, error)
}
嵌入提供了一种组合相关接口(interface)的好方法,例如 Reader
和 Closer
。您可以有点将其视为 Java 领域的继承。您不会明确要求嵌入式接口(interface),就像您在 Java 中要求带有子类的父类一样。
现在要实现FooPlusPlus
type Demo int
func (_ *Demo) FooIt() error {return nil}
func (_ *Demo) FooItAll() (bool, error) {return false, nil}
中提琴,现在 Demo 是一个 FooPlusPlus
。
关于Go编程语言接口(interface)概念理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908654/