Go 语言圣经 7.10 类型断言

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语言基础

代码仓库

猜你喜欢

转载自blog.csdn.net/liushihua147/article/details/80797635