7.10 类型断言
知识点
- 1.如果断言类型检查成功,会得到具体的值,否则跑出panic异常
- 2.对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保护了接口值内部的动态类型和值的部分
- 3.如果断言操作的对象是一个nil接口值,那么不论被断言的类型是什么这个类型断言都会失败
- 4.如果类型断言出现在一个预期有两个结果的赋值操作中,这个操作不会在失败的时候发生panic但是代替地返回一个额外的第二个结果,这个结果是一个标识成功的布尔值
代码
func test_assertions() {
//1.如果断言类型检查成功,会得到具体的值,否则跑出panic异常
var w io.Writer
w = os.Stdout
f := w.(*os.File) // success: f == os.Stdout
fmt.Println(f)
c := w.(*bytes.Buffer) // panic: interface holds *os.File, not *bytes.Buffer
fmt.Println(c)
//2.对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),
// 但是它保护了接口值内部的动态类型和值的部分
//var w1 io.Writer
//w1 = os.Stdout
//rw := w1.(io.ReadWriter) // success: *os.File has both Read and Write
//w1 = new(ByteCounter)
//rw = w1.(io.ReadWriter) // panic: *ByteCounter has no Read method
//3.如果断言操作的对象是一个nil接口值,那么不论被断言的类型是什么这个类型断言都会失败
//w = rw // io.ReadWriter is assignable to io.Writer
//w = rw.(io.Writer) // fails only if rw == nil
//4.如果类型断言出现在一个预期有两个结果的赋值操作中,
// 这个操作不会在失败的时候发生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
}
——不足之处,欢迎补充——
备注
《Go 语言圣经》
- 学习记录所使用的GO版本是1.8
- 学习记录所使用的编译器工具为GoLand
- 学习记录所使用的系统环境为Mac os
- 学习者有一定的C语言基础
代码仓库