翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Go 的类型断言type assertion

Posted on   翔云123456  阅读(184)  评论(0编辑  收藏  举报

Go语言中的类型断言,语法上是这样的:

x.(T)

其中,x是interface接口的表达式,T是类型,称为被断言类型。

补充一下,接口有接口值的概念,其包括动态类型和动态值两部分。

类型断言根据T的不同可以分为两种情况:

1. T是具体类型

类型断言首先检查x的动态类型是否是T.
如果是,类型断言的结果就是x的动态值.
如果否,操作就会panic
例如,

var w io.Writer
w = os.Stdout
f := w.(*os.File) // success: f == os.Stdout
c := w.(*bytes.Buffer) // panic: interface holds *os.File, not *bytes.Buffer

其中,os.Stdout的类型就是*os.File

2. T是接口类型

类型断言首先检查x的动态类型是否满足T。
如果断言成功,x的动态值不会被提取,结果仍然是以前的动态类型和动态值。但结果的类型是接口类型T.

换句话说,对接口类型的断言,结果的类型是T,不是x的类型,从而改变了可访问的方法集合(通常更大),但会保留x接口值中的动态类型和动态值。

举个例子,下面的语句中,
第一个类型断言后,
w、rw两个接口的动态值都是os.Stout,动态类型都是*os.File。

w的类型是io.Writer,只暴露Write方法,
rw的类型是io.ReadWriter,暴露Read和Write方法。

var w io.Writer
w = os.Stdout
rw := w.(io.ReadWriter) // success: *os.File has both Read and Write

w = new(ByteCounter)
rw = w.(io.ReadWriter) // panic: *ByteCounter has no Read method

另外,无论被断言的类型是什么,如果操作数x是一个nil 接口类型,断言就会失败。

我们几乎不需要对一个更少限制性接口类型(或者说拥有更少的方法)进行断言,
这就跟赋值操作是一样的。

w = rw // io.ReadWriter is assignable to io.Writer
w = rw.(io.Writer) // fails only if rw == nil

更多interface的参考

http://blog.csdn.net/lanyang123456/article/details/78155431

http://blog.csdn.net/lanyang123456/article/details/78155458

http://blog.csdn.net/lanyang123456/article/details/78070886

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示