1.类型转换

只有相互兼容的类型之间才可以转换,不兼容的类型,如果使用了转换函数,在编译时会出错。

1.1不兼容类型的错误示范

已知:bool型和int型不兼容

  1. package main
  2. import "fmt"
  3. func main(){
  4. var a int = 10
  5. var b bool = true
  6. fmt.Println(bool(a)) //试图把a变为bool类型输出
  7. }

报错信息:不能转化一个int类型到bool类型

捕获.PNG

1.2兼容类型示例

已知:int32和float32互相兼容

  1. package main
  2. import "fmt"
  3. func main(){
  4. var a int32 = 100
  5. fmt.Println(float32(a))
  6. fmt.Printf("%T\n",a) //格式化输出a的类型
  7. fmt.Printf("%T\n",float32(a)) //格式化输出float32(a)转换后的类型
  8. }

捕获.PNG

1.3转换类型时的坑

我们不难猜测出哪些类型是兼容的,哪些是不兼容的。如需详细了解类型的转换,请参阅更详细的资料。
但是,我们还是经常在转换类型时出错,往往编译不会报错,但是得到的结果却让人匪夷所思。
如下:

  1. package main
  2. import "fmt"
  3. func main(){
  4. var a int32 = 156
  5. fmt.Printf("%d %T\n", a,a)
  6. fmt.Printf("%d %T\n",int8(a),int8(a))
  7. }

上面这个程序,在语法上不存在问题,在编译时也不会报错。但是结果却让我们很意外。
捕获.PNG
为什么会出现这种情况呢?
这就牵涉到前面讲的基本数据类型了。
回顾一下《05_基础数据类型》里的那张表。

07_类型转换及类型别名 - 图5
由此,我们发现int8的取值范围在-128~127之间,而我们定义的156超出了这个范围,导致了数据溢出,而出现异常。

所以,我们在转换类型的时候,通常由低类型转化为高类型。
例如:
int8—>int64
float32—>float64

2.类型别名

熟悉python的同学,看到别名这个次,很容易联想到python中导入库时的操作。

  1. #python导入库时采取别名
  2. import requests as r

golang中的类型别名和python的库导入有异曲同工之妙。

2.1 基本语法

  1. type 别名 类型名

2.2类型别名示例

  1. package main
  2. import "fmt"
  3. func main(){
  4. type big_int int64 //把int64类型,称为big_int
  5. var a big_int = 100 //等价于var a int64 = 100
  6. fmt.Printf("数值:%d\n",a)
  7. fmt.Printf("类型:%T\n",a)
  8. }

输出:
捕获.PNG