技术

类型转换和类型断言

2018-10-11  本文已影响21人  Garry2018

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("类型不匹配")
  }
}

输出“类型不匹配”

上一篇 下一篇

猜你喜欢

热点阅读