无效类型断言:无法将os.Stdout转换为接口类型io.ReadWriter?

问题描述 投票:0回答:2

我参考的是gopl示例代码,如下所示:

v := os.Stdout
v2 = v.(io.ReadWriter)

但是在1.13版中,报告编译错误:

invalid type assertion: v.(io.ReadWriter) (non-interface type *os.File on left)

我以为只要Stdout是作家,对ReadWriter的这种转换就应该触发运行时类型转换错误,但是实际上,报告了编译错误。

我想知道在什么情况下类型断言/转换将在编译时失败,在什么情况下它将在运行时失败?

go types compilation assert
2个回答
2
投票

您可以使用io.ReadWriter(os.Stdout)来执行此操作,因为您已经有了指向结构的具体指针(或者也可以使用结构)。

v.(*SomeConcreteType)之类的类型断言在v实现某些接口并且您想将其转换为具体类型(结构/指针...)时使用。您正在尝试采用另一种方法,这就是为什么编译器会抱怨非接口类型的原因。

这没有任何意义,因为您唯一要做的就是限制可以在v2上调用的方法。您仍然可以将v传递给接受io.ReadWriter的方法,因为它实现该接口时无需进行任何转换。


1
投票

在您的代码中,v是具体类型*FILE,并且对于形式为i.(T)的类型声明,i必须为interface,并且T为类型/接口,因此您的代码具有编译错误

这应该做您所要做的,但不会触发运行时错误,因为os.Stdout满足io.ReadWriter界面

var v interface{} = os.Stdout
v2 := v.(io.ReadWriter)

在什么情况下它将在运行时失败

如果接口i不满足/不能满足类型T的要求,则该语句将引发恐慌。

例如,这些语句将触发恐慌,因为类型为os.Stdout*FILE不满足io.ByteScanner的要求

var v interface{} = os.Stdout
v2 := v.(io.ByteScanner)
© www.soinside.com 2019 - 2024. All rights reserved.