我正在努力将自己的头围在GoLang类型系统上,还有一些使我感到困惑的地方。
因此,我一直在研究http库以尝试理解这一点,并且遇到了以下毫无意义的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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,但是我可以在一种情况下将其传递给我,而不是 如果在另一个。 有什么我梦missing以求的事情正在发生。
我知道,在实现读方法时,从技术上讲,更近的传递给阅读器接口,但这在函数和主体上都应如此。
任何见识都会很棒。
谢谢
-
为什么要让
convert 接受io.Closer (如果应该为io.Reader )? -
is the fact that the response body is of type io.closer ... golang.org/src/net/http/response.go响应的正文为io.ReadCloser 类型。 - 抱歉,我在这里犯了一个小错误,http正文的默认类型是io.ReadCloser,它来自主包golang.org/pkg/net/http/#Response。
it is the fact that the response body is of type io.closer
不它不是。
1 | Body io.ReadCloser |
由于它是
由于它还实现了
但是在convert
1 2 3 4 5 6 7 8 | type mycloser int func (mycloser) Close() error { return nil } func main() { var m io.Closer = mycloser(0) convert(m) } |
在上面的示例中,
如果您的
1 2 3 4 5 6 7 8 | func convert(rc io.ReadCloser) ([]byte, error) { body, err := ioutil.ReadAll(rc) if err != nil { return body, err } err = rc.Close() return body, err } |