4

我创建了一个简单的 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() 返回一个带有 a Bodyof的 Response io.ReadCloser。ioutil.ReadAll() 需要一个 io.Reader - 但是我怎样才能找到其他接受它作为参数的函数?文档似乎是“倒退”的——如果我知道我想要哪个函数,我可以找到文档,但如果我有一个类型,我怎么能找到哪些函数可以使用它?

4

2 回答 2

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)

看看函数是如何声明的

func函数名称和函数之间(Get),您有接收者类型和名称(括号之间)。只有其中一个函数没有接收者,并且必须以包名 ( http) 为前缀直接调用。那就是你需要的那个。

于 2013-03-15T13:48:10.903 回答
0

关于您的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 时,我阅读了整件事,它让事情变得容易多了。

于 2013-06-18T16:48:53.767 回答