我参考的是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的这种转换就应该触发运行时类型转换错误,但是实际上,报告了编译错误。
我想知道在什么情况下类型断言/转换将在编译时失败,在什么情况下它将在运行时失败?
您可以使用io.ReadWriter(os.Stdout)
来执行此操作,因为您已经有了指向结构的具体指针(或者也可以使用结构)。
v.(*SomeConcreteType)
之类的类型断言在v
实现某些接口并且您想将其转换为具体类型(结构/指针...)时使用。您正在尝试采用另一种方法,这就是为什么编译器会抱怨非接口类型的原因。
这没有任何意义,因为您唯一要做的就是限制可以在v2
上调用的方法。您仍然可以将v
传递给接受io.ReadWriter
的方法,因为它实现该接口时无需进行任何转换。
在您的代码中,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)