隐藏页面特效

类型断言

类型断言是一个使用在接口值上的操作。语法上它看起来像x.(T)被成为断言类型,这里x表示一个接口的类型和T表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。 这里有两种可能。 第一种,如果断言的类型T是一个具体类型,然后类型断言检查x的动态类型是否和T相同。如果这个检查成功了,类型断言的结果是x的动态值,当然它的类型是T。换句话说,具体类型的类型断言从它的操作对象中获得具体的值。如果检查失败,接下来这个操作会抛出panic var w io.Writer w = os.Stdout f := w.(*os.File) // success: f == os.Stdout c := w.(*bytes.Buffer) // panic 第二种,如果相反地断言的类型T是一个接口类型,然后类型断言检查是否x的动态类型满足T。如果这个检查成功了,动态值没有获取到;这个接口仍然是一个有相同动态类型和值部分的接口之,但是结果为类型T。换句话说,对一个接口类型的类型断言改吧了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保留了接口值内部的动态类型和值的部分 在下面的第一个类型断言后,wrw都持有os.Stdout,因此他们都有一个动态类型*os.File,但是变量w是一个io.Writer类型,只对外公开了文件的Write方法,而rw变量还公开了它的Read方法 var w io.Writer w = os.Stdout rw := w.(io.ReadWriter) // success *os.File w = new(ByteCount) rw = w.(io.ReadWriter) // panic has no Read method 如果断言操作的对象是一个nil接口值,那么不论被断言的类型是上面这个类型断言都会失败,我们几乎不需要对一个更少限制性的接口类型(更少的方法集合)做断言,因为它表现的就像是赋值操作一样,除了对于nil接口值的情况。 w = rw w = rw.(io.Writer) // fail 经常地,对一个接口值的动态类型我们是不确定的,并且我们更愿意去检验它是否是一些特定的类型。如果类型断言出现在一个预期有两个结果的赋值操作中,例如如下的定义,这个操作不会再失败的时候发生panic,但是替代地返回一个额外的第二个结果,这个结果是一个标识成功与否的布尔值: var w io.Writer = os.Stdout f, ok := w.(*os.File) // success: ok,f == os.Stdout b, ok := w.(*bytes.Buffer) // failure: !ok, b == nil 第二个结果通常赋值给一个命名为ok的变量,如果这个操作失败了,那么ok就是false值,第一个结果等于被断言类型的零值,再这个例子中就是一个nil的*bytes.Buffer类型 这个ok结果经常立即用于决定程序下面做上面,if语句的拓展格式让这个变的很简洁: if f, ok:= w.(*os.File); ok{ //... } 当类型断言的操作对象是一个变量,你有时会看见原来的变量名重用而不是声明一个新的本地变量名,这个重用的变量原来的值会被覆盖(理解:其实是声明了一个同名的新的本地变量,外层原来的w不会被改变),如下: if w,ok := w.(*os.File);ok{ //... }

__EOF__

本文作者404 Not Found
本文链接https://www.cnblogs.com/weiweivip666/p/15950268.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
posted @   我在路上回头看  阅读(168)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示