登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-02-25 15:03:25 247浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《无效类型转换:无法将 os.Stdout 转换为 io.ReadWriter 接口类型?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我指的是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是一个writer,这种向readwriter的转换就应该会触发运行时类型转换错误,但实际上是报编译错误。

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


解决方案


您可以使用 io.readwriter(os.stdout) 来执行此操作,因为您已经有一个指向结构的具体指针(或者也适用于结构)。

v 实现某些接口并且您希望将其转换为具体类型(结构体/指针...)时,将使用诸如 v.(*someconcretetype) 之类的类型断言。您尝试以相反的方式执行此操作,这就是编译器抱怨非接口类型的原因。

这实际上没有意义,因为您唯一要做的就是限制可以在 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 的要求,则该语句将触发恐慌。

例如,这些语句将触发恐慌,因为类型为 *fileos.stdout 不满足 io.bytescanner 的要求

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

以上就是《无效类型转换:无法将 os.Stdout 转换为 io.ReadWriter 接口类型?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>