前言
数字类型当然是用来表示数字的, 分为整型和浮点型.
整型
整型用来存储整数, Go 有几种不同大小的内置整数类型, 用于存储有符号和无符号整数.
有符号整型
int 类型的大小取决于机器, 在 32 位机器上是 32 bits, 在 64 位机器上则是 64 bits.
无符号整型
uint 的大小也取决于机器.
使用整数值时, 除非有充分的理由必须使用符合大小的无符号整数类型, 否则应始终使用 int 数据类型.
举个:
- medals := []string{"gold", "silver", "bronze"}
- for i := len(medals) - 1; i>= 0; i-- {
- fmt.Println(medals[i]) // "bronze", "silver", "gold"
- }
程序的意思一眼就能看懂: 循环输出数组的元素. 看下, 程序有没有问题? 如果 len 函数返回一个无符号数, 那么 i 也将是无符号的 uint 类型, 然后条件 i>= 0 则永远为真. 在三次迭代之后, 也就是 i == 0 时, i-- 语句将不会产生 - 1, 而是变成一个 uint 类型的最大值 (可能是 - 1), 然后 medals[i] 表达式运行时将发生访问异常.
- var myInt8 int8 = 97
- // 变量不声明类型, 系统默认 int 类型
- var myInt = 1200
- var myUint uint = 500
- var myHexNumber = 0xFF // '0x' or '0X' 前缀 表示 16 进制数
- var myOctalNumber = 034 // '0' 前缀表示 8 进制数
- fmt.Printf("%T\n",myInt) // %T 输出变量类型
- fmt.Printf("%d, %d, %d, %#x, %#o\n", myInt8, myInt, myUint, myHexNumber, myOctalNumber)
- // % 后的 # 副词告诉 Printf 在用 %o,%x 或 %X 输出时生成 0,0x 或 0X 前缀.
输出:
还有一种无符号的整数类型 uintptr, 没有指定具体的 bit 大小但是足以容纳指针. uintptr 类型只有在底层编程时才需要, 特别是 Go 语言和 C 语言函数库或操作系统接口相交互的地方, 我们以后再讲它的用法.
整型别名
Golang 还有另外两种整数类型: byte 和 rune, 它们分别是 uint8 和 int32 的别名:
在 Go 中, 没有 char 字符类型, byte 和 rune 用于强调字符而不是整型值. byte 用来表示 ASCII 字符, rune 表示以 UTF-8 格式编码的 Unicode 码点. 字符在 Go 中怎么表示呢? 用单引号括起来, 例如:'A' 字符默认的类型是 rune, 所以, 如果在声明一个字符变量时没有指明类型, Go 编译器会默认是 rune:
- var myByte = 'A'
- fmt.Printf("%T\n",myByte)
输出: int32,rune 是 int32 的别名嘛, 所以输出 int32. 那我们就直接使用 byte 指明变量的类型:
var lastLetter byte = 'Z'
byte 和 rune 实质上都是整数, 例如, byte 类型的'A'可以转成整型值 97; 类似的, rune 类型的 Unicode 字符'♥'可以转成对应的 Unicode 码点 U+2665(U + 用来表示 unicode,2665 是十六进制数值), 实质上也是整型.
- var myByte byte = 'a'
- var myRune rune = '♥'
- fmt.Printf("%c = %d and %c = %U\n", myByte, myByte, myRune, myRune)
输出: a = 97 and ♥ = U+2665 上面的例子中, 输出的是 byte 变量 myByte 和对应的十进制数字, rune 变量 myRune 和对应的 Unicode 码.
浮点数
浮点数用户存储带小数点的数字, Go 有两种浮点数 float32 和 float64.
float32,32 位, 单精度;
float64,64 位, 双精度;
默认的浮点型是 float64, 所以, 但你初始化一个浮点型的变量而没有指明是哪种浮点类型时, 编译器默认是 float64.
var a = 9715.635 // 默认 float64
类型转化
Go 的类型系统非常强大, 不允许你在表达式中将数字类型混淆. 例如, 不允许 int 和 float64 类型执行相加操作, 甚至连 int 和 int64 之间也不能:
- var a int64 = 4
- var b int = a // 编译出错 (Cannot use a (type in64) as type int in assignment)
- var c int = 500
- var result = a + c // 编译出错 (Invalid Operation: mismatched types int64 and int)
与其他静态类型语言 (如 C,C ++ 和 Java) 不同, Go 是不提供任何隐式类型转换的. 好了, 如果你非要在不同类型的数字之间执行类似相加, 相减等操作, 怎么办? 类型转换, 转换成你需要的类型, 语法是这样的: T(v),T 就是目标类型, v 是想转的值:
- var a int64 = 4
- var b int = int(a) // 显式类型转换
- var c float64 = 6.5
- // 显式类型转换
- var result = float64(b) + c // Works
输出: 10.5
来源: https://juejin.im/post/5c09fab9e51d4569f74e90da