为什么golang无法将os.Stdout转换为io.readWriter类型?

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

我参考如下的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的转换都将触发运行时类型转换错误,但实际上,报告了编译错误。

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

非常感谢。

go types compilation assert
2个回答
0
投票

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

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

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


0
投票

在您的代码中,v是具体类型*FILE,并且对于形式为i.(T)的类型声明,i必须为interface,并且T为类型/接口,因此您的代码具有编译错误,同样,如果接口i不持有类型T,则该语句将触发紧急情况。

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

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