【发布时间】:2017-07-20 12:32:52
【问题描述】:
我正试图围绕 GoLang 类型系统展开思考,但有些地方让我感到困惑。
所以我一直在研究 http 库以试图理解这一点,我遇到了以下没有意义的内容。
package main
import (
"net/http"
"fmt"
"io/ioutil"
"io"
)
func convert(closer io.Closer) ([]byte) {
body, _ := ioutil.ReadAll(closer);
return body
}
func main() {
client := &http.Client{}
req, _ := http.NewRequest("GET", "https://www.google.com", nil)
response, _ := client.Do(req);
body, _ := ioutil.ReadAll(response.Body)
fmt.Println(body);
fmt.Println(convert(response.Body))
}
这与不需要转换函数的事实无关,而是响应主体的类型为 io.closer 并且 ioutil.Readall 需要一个 io.reader,但我可以将它传入一个实例但不是如果在另一个。有没有什么我错过的神奇的事情发生了。
我知道,在实现 Read 方法时,在技术上更接近于通过读取器接口,但在函数和主体中都应该如此。
任何见解都会很棒。
谢谢
【问题讨论】:
-
如果应该是
io.Reader,你为什么要convert接受io.Closer? -
is the fact that the response body is of type io.closer... golang.org/src/net/http/response.go Response 的主体是io.ReadCloser类型。 -
对不起,我在这里犯了一个小错误,http body 的默认类型是 io.ReadCloser 这是来自主包golang.org/pkg/net/http/#Response。