为什么类型断言在一个案例中有效,而在另一个案例中有效?

时间:2014-06-04 07:10:58

标签: go

以下是有问题的源代码:

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)执行相同的操作,但没有错误。为什么呢?

http://play.golang.org/p/CWd-zMlrAZ

1 个答案:

答案 0 :(得分:11)

您正在处理两个不同的Reader

对于非接口类型,动态类型始终是静态类型 type assertion仅适用于接口,可以具有任意基础类型 (请参阅my answer on interface和“Go: Named type assertions and conversions”)