我参考如下的gopl示例代码:
v := os.Stdout
v2 = v.(io.readWriter)
但是go 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
为类型/接口,因此您的代码具有编译错误,同样,如果接口i
不持有类型T
,则该语句将触发紧急情况。
这应该做您所要做的,但不会触发运行时错误,因为os.Stdout
满足io.ReadWriter
界面
var v interface{} = os.Stdout
v2 := v.(io.ReadWriter)