我创建了一个简单的go程序(基本上只是示例代码):
package main
import (
"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实际上是Response类型的Get()?
无论如何,http.Get()返回一个Body
为io.ReadCloser
的响应。 ioutil.ReadAll()接受一个io.Reader - 但我怎样才能找到接受这个作为参数的其他函数呢?有点似乎文档是“向后” - 如果我知道我想要哪个函数我可以找到文档,但如果我有一个类型,我怎么能找到哪些函数可以用呢?
答案 0 :(得分:7)
函数定义如下:
func (c *Client) Get(url string) (resp *Response, err error)
func (h Header) Get(key string) string
func Get(url string) (resp *Response, err error)
请参阅how functions are declared。
在func
和函数名称(Get
)之间,您有接收者类型和名称(在括号之间)。这些函数中只有一个没有接收器,必须直接调用前缀为包名(http
)。这就是你需要的那个。
答案 1 :(得分:0)
关于您的io.Reader
和io.ReadCloser
问题:
这些是接口,如果你不熟悉它们,请阅读它们here
接口基本上是一组方法,这两个方法定义如下:
type Reader interface{
Read([]byte)(int, error)
}
type ReadCloser interface{
Read([]byte)(int, error)
Close()
}
这意味着任何具有上述签名的Read方法的具体数据类型都可以作为io.Reader传递。满足io.ReadCloser的数据类型肯定会这样做,因为它必须提供Read方法和附加的close方法。
因此,您只需将ReadCloser作为Reader传递。
接口工作的方式在开始时有点难以理解,因为它们是如此隐含, 但它们非常强大,可以为您提供很多可能性。绝对阅读我上面链接的文字。我读了整篇文章,当我开始时,它让事情变得更容易。