我指的是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
一个接受a的方法,io.ReadWriter
因为它实现该接口时不会进行任何转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句