我创建了一个简单的 go 程序(基本上只是示例代码):package mainimport ( "fmt" "io/ioutil" "net/http")func getPage(url string) (body []byte, err error) { resp, err := http.Get(url) body = nil if (err != nil) { return } defer resp.Body.Close() body, err = ioutil.ReadAll(resp.Body) return}func main() { startUrl := "http://slashdot.org/" body, err := getPage(startUrl) if (err != nil) { fmt.Println("Error: " , err) } fmt.Println(body)}我正在尝试阅读文档以了解它们是如何组合在一起的。第一个问题:http.Get()。它不在文档中(位于http://golang.org/pkg/net/http/)。除了它是,但在响应下。但是还有 2 个其他的 Get() 函数。我怎么知道 net/http.Get 实际上是响应类型上的 Get() ?无论如何,所以http.Get()返回了一个响应Body的io.ReadCloser。ioutil.ReadAll() 需要一个 io.Reader - 但是我怎样才能找到其他接受它作为参数的函数呢?文档似乎是“向后”的——如果我知道我想要哪个函数,我可以找到文档,但是如果我有一个类型,我怎么能找到哪些函数可以使用它?
2 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
关于你io.Reader和io.ReadCloser问题:
这些是接口,如果您不熟悉它们,请在此处阅读它们
接口基本上是一组方法,这两个定义如下:
type Reader interface{
Read([]byte)(int, error)
}
type ReadCloser interface{
Read([]byte)(int, error)
Close()
}
这意味着任何具有上述签名的读取方法的具体数据类型都可以作为 io.Reader 传递。满足 io.ReadCloser 的数据类型肯定会这样做,因为它必须提供 Read 方法和额外的 close 方法。
所以你可以简单地将你的 ReadCloser 作为 Reader 传递。
接口在 Go 中的工作方式一开始有点难以理解,因为它们非常隐含,但是它们非常强大,并为您提供了很多可能性。一定要阅读我上面链接的文字。当我开始使用 go 时,我把整个事情都读了下来,这让事情变得容易多了。
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报
0/150
提交
取消