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

Go 的类型断言type assertion的更多相关文章

  1. 7.2 Go type assertion

    7.2 Go type assertion 类型断言是使用在接口值上的操作. 语法x.(T)被称为类型断言,x代表接口的类型,T代表一个类型检查. 类型断言检查它操作对象的动态类型是否和断言类型匹配. ...

  2. [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法

    最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...

  3. 类型检查 Type Checking 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类

    Compiler http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/ http://staff.ustc.edu.cn/~bjhua/cour ...

  4. TypeScript 入门自学笔记 — 类型断言(二)

    码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...

  5. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

  6. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  7. golang类型断言

    一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...

  8. [Go] golang类型断言

    类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...

  9. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

随机推荐

  1. 无名管道跟dup,dup的使用

    参考资料: http://www.tldp.org/LDP/lpg/node11.html http://blog.csdn.net/yeyuangen/article/details/6852682 ...

  2. JavaScript学习总结(九)——Javascript面向(基于)对象编程

    一.澄清概念 1.JS中"基于对象=面向对象" 2.JS中没有类(Class),但是它取了一个新的名字叫“原型对象”,因此"类=原型对象" 二.类(原型对象)和 ...

  3. json 与字符串相互转换,

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. ps和fireworks切图网页优化,jpg为80时

  5. MinGW的gdb调试

        MinGW(Minimalist GNU for Windows)提供了一套简单方便的Windows下的基于GCC程序开发环境.MinGW收集了一系列免费的Windows是用的头文件和库文件: ...

  6. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  7. 0122有关List、Set、Map的练习

    import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; public class SZYL { ...

  8. STL标准库-一个万用的hash function

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过hash的使用,本次主要介绍一下Hash Function Hash Function即获得hash code的函 ...

  9. STL标准库-容器适配器

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class ...

  10. parser_url

    $url="http://127.0.0.1/test2.php?sitename=mysite.cn&a=1&b=2";$a=parse_url($url);p( ...