以下是有问题的源代码:
http://play.golang.org/p/lcN4Osdkgs
package main
import(
"net/url"
"io"
"strings"
)
func main(){
v := url.Values{"key": {"Value"}, "id": {"123"}}
body := strings.NewReader(v.Encode())
_ = proxy(body)
// this work
//invalid type assertion: body.(io.ReadCloser) (non-interface type *strings.Reader on left)
_, _ = body.(io.ReadCloser)
}
func proxy( body io.Reader) error{
_, _ = body.(io.ReadCloser)
return nil
}
有人可以告诉我为什么这段代码不起作用吗?
此处发生错误:
body := strings.NewReader(v.Encode())
rc, ok := body.(io.ReadCloser)
// invalid type assertion: body.(io.ReadCloser) (non-interface type *strings.Reader on left)
然而proxy(body io.Reader)
执行相同的操作,但没有错误。为什么呢?
答案 0 :(得分:11)
您正在处理两个不同的Reader
:
strings.Reader
,这不是界面
但由于它实现了io.Reader
,您可以将其传递给proxy()
。proxy()
需要一个io.Reader
,这是一个界面。对于非接口类型,动态类型始终是静态类型 type assertion仅适用于接口,可以具有任意基础类型 (请参阅my answer on interface和“Go: Named type assertions and conversions”)