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("类型不匹配")
}
}
输出“类型不匹配”
网友评论