gpt4 book ai didi

go - 为什么类型断言在一种情况下有效,而在另一种情况下无效?

转载 作者:IT王子 更新时间:2023-10-29 00:35:56 24 4
gpt4 key购买 nike

这是有问题的源代码:

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

最佳答案

您正在处理两个不同的Reader:

  • strings.NewReader()返回 strings.Reader ,这不是一个接口(interface)。
    但由于它实现了 io.Reader,您可以将它传递给 proxy()
  • proxy() 需要一个 io.Reader , 这是一个接口(interface)。

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

关于go - 为什么类型断言在一种情况下有效,而在另一种情况下无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24031205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com