Go编程语言接口(interface)概念理解

标签 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 两个方法的接口(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)的好方法,例如 ReaderCloser。您可以有点将其视为 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/

相关文章:

websocket - 将 io 字符串转为 int Atoi 无效参数

json - 忽略 struct 中的对象为 nil,而不是当它是空数组时

json - 如何在 Golang 中解析嵌套 JSON 对象中的嵌套数组?

javascript - gorilla /csrf 的问题

unit-testing - golang 中用于测试的模拟函数

go - 使用golang从 postman 那里获取多个Id的方法是什么

sockets - 将 net.Conn.Read 用于持久 TCP 套接字的正确方法是什么

go - 不是 “selected”的 channel 会怎样?

android - 将 JNIEnv 或上下文从 Java 传递给 Go

unicode - Go 中 unicode 中 IsDigit 和 IsNumber 的区别