视频: https://www.bilibili.com/video/BV18h411C7Yz/

抛砖引玉的两个例子

int的值与float64的值相加,下面程序能够正常执行吗?

编译失败无法执行: invalid operation: a + b (mismatched types int and float64)

提示非法的操作,不能将intfloat64相加 @_@


int的值初始化float64的变量,下面的程序能够正常执行吗?

编译失败无法执行: cannot use a (type int) as type float64 in assignment

提示不能用int作为float64进行赋值 =。=

Go语言不支持自动类型转换(Automatic Type Conversion)或隐式类型转换(Implicit Type Conversion)

所以要想上面两个例子成功执行,在此之前我们必须将两个不同类型的变量转为同类型的变量,这时就需要显式类型转换

显式类型转换

显式类型转换(Explicit Type Conversion),其实从英文来看就很好理解,意思是明确的类型转换

表达式T(v)表示将值v转换成类型T的值

利用显式类型转换修正上面两个例子:

[1]:

  • 第一个Println处表示将变量a转成float64类型后再与变量b相加
  • 第一个Println处表示将变量b转成int类型后再与变量a相加(注意这时会有精度损失,3.14的小数部份没了)

[2]:

类型别名

就像小时候长辈会给我们取小名,长大学了英语喜欢给自己取个英文名一样,这些就是别名,实际上指代的还是我们这个人

在Go中,类型也可以取别名(Type Alias),使用type 类型新名 = 原类型名这样的语法

注意上面声明变量a时,类型是myint,运行看看有没有问题~

我们的程序可以顺利执行,a + b是ok的,说明了a与b是同一个类型的变量(所以不需要进行类型转换即可相加)

Go语言的基本数据类型定义在builtin这个内置包里,在这个包里定义了这样的两个类型别名:

  • type byte = uint8
  • type rune = int32

byte就是uint8rune就是int32

题外话: 不信可以在终端通过go doc builtin命令进行验证

定义新类型

type关键词除了可以进行类型别名,还可以定义一个新的类型,通过type 新类型名 原类型名这样的语法

注意在上一个例子的基础上,将type myint = int改成了type myint int,表示myint是建立在int基础上的新类型,它不等于int

执行一下试试看看~

编译失败报错了,因为a与b并不是同一个类型的变量,而且Go不支持自动类型转换

怎么办?有两种办法:

  1. 把a转换成int类型再与b相加
  2. 把b转换成myint类型再与a相加

总结

see you~

原文地址: https://nbody1996.gitee.io/becoming_gopher/posts/007/

读后有收获可以请作者喝咖啡~