美文网首页技术
类型转换和类型断言

类型转换和类型断言

作者: Garry2018 | 来源:发表于2018-10-11 18:32 被阅读21次

    go语言不允许隐式类型转换,而类型转换和类型断言的本质,就是把一个类型转换到另一个类型。

    一、类型转换

    1.语法: <结果类型> := <目标类型>(<表达式>)

    2.类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,当类型不兼容的时候,是无法转换的。如下:

    func test() {
      var var1 int = 10
      fmt.Printf("%T->%v \n", var1, var1)
      var2 := float32(var1)
      var3 := int64(var1)
      //var4 := []int8(var1)
      //var5 := []string(var1)
      fmt.Printf("%T->%v \n", var2, var2)
      fmt.Printf("%T->%v \n", var3, var3)
      //fmt.Printf("%T->%v \n", var4, var4)
      //fmt.Printf("%T->%v \n", var5, var5)  
    }
    

    var4和var5处运行时报错,因为类型不兼容,注释后,输出如下:

    int->10
    float32->10
    int64->10
    

    二、类型断言

    1.语法:
    <目标类型的值>,<布尔参数> := <表达式>.(目标类型) //安全类型断言
    <目标类型的值> := <表达式>.(目标类型) //非安全类型断言

    2.类型断言的本质,跟类型转换类似,都是类型之间进行转换,不同之处在于,类型断言是在接口之间进行,相当于Java中,对于一个对象,把一种接口的引用转换成另一种。

    先看一个最简单的错误的类型断言:

    func test2(){
      var i interface{} = "kk"
      j:= i.(int)
      fmt.Printf("%T->%d\n",j ,j )
    }
    

    var i interface{} = "kk" 相当于java中的, Object i = "kk";
    现在把这个i转换成int类型,系统内部检测到这种不匹配,会抛出一个异常。
    改一下,把i的定义改为: var i interface{} =99, 就没问题了,输出为:

    int->99
    

    以上为不安全类型的断言,来看下安全的类型断言:

    func test3() {
      var i interface{} ="123"
      j, b := i.(int)
      if b {
        fmt.Printf("%T->%d\n",j, j)
      } else {
        fmt.Printf("类型不匹配")
      }
    }
    

    输出“类型不匹配”

    相关文章

      网友评论

        本文标题:类型转换和类型断言

        本文链接:https://www.haomeiwen.com/subject/qfxiaftx.html