Go 编程实战系列(十一)
上一篇《Go 字符串 String 详解》中,我们学习了 Go 中最常用的数据类型之一------字符串。
在实际开发中,除了字符串,数字类型也是使用频率最高的数据类型。
例如:
-
用户年龄
-
商品价格
-
订单数量
-
数据库 ID
-
时间戳
-
统计数据
-
数学计算
这些都离不开数字类型。
Go 作为一门静态类型语言,对数字类型进行了严格设计。不同数字类型拥有不同的取值范围和使用场景,合理选择数字类型可以提高程序安全性和运行效率。
本文将详细介绍 Go 中的数字类型,包括:
-
整数类型
-
无符号整数类型
-
浮点数类型
-
复数类型
-
数字类型转换
-
常量数字
-
数学计算
-
精度问题
-
实际开发中的选择建议
一、Go 数字类型分类
Go 中数字类型主要分为:
数字类型
├── 整数类型
│
├── 浮点类型
│
└── 复数类型
其中整数类型又分为:
go
有符号整数
int8
int16
int32
int64
int
以及:
go
无符号整数
uint8
uint16
uint32
uint64
uint
浮点类型:
go
float32
float64
复数类型:
go
complex64
complex128
二、整数类型
整数表示没有小数部分的数字。
例如:
diff
10
-20
1000
Go 提供了多种整数类型。
1. int 类型
在日常开发中,最常使用:
arduino
int
例如:
go
age := 18
count := 100
Go 会默认推导为:
arduino
int
int 的大小与运行平台有关。
在现代 64 位系统中:
go
int = int64
在 32 位系统:
go
int = int32
因此:
普通业务开发中,通常直接使用:
arduino
int
即可。
例如:
-
用户数量
-
循环计数
-
数组长度
三、有符号整数
有符号整数可以表示:
-
正数
-
负数
-
0
包括:
go
int8
int16
int32
int64
例如:
go
var a int8 = 100
var b int16 = 10000
var c int32 = 100000
var d int64 = 9999999999
数字后面的:
8
16
32
64
表示占用的位数。
int8
范围:
diff
-128 ~ 127
例如:
go
var age int8 = 18
适合:
-
小范围状态值
-
节省空间的数据
int16
范围:
diff
-32768 ~ 32767
int32
范围:
diff
-2147483648 ~ 2147483647
常用于:
-
网络协议
-
文件格式
-
固定长度数据
int64
范围非常大:
diff
-9223372036854775808
到
9223372036854775807
常用于:
-
时间戳
-
数据库 ID
-
大整数计算
例如:
go
var id int64 = 100000000000
四、无符号整数 uint
无符号整数只能表示:
diff
0
+
正数
不能表示负数。
包括:
go
uint8
uint16
uint32
uint64
uint
例如:
csharp
var count uint = 100
错误:
csharp
var age uint = -1
因为:
csharp
uint 不支持负数
uint8
范围:
0 ~ 255
它非常常用。
实际上:
arduino
byte
就是:
go
uint8
的别名。
例如:
csharp
var data byte = 255
等价:
go
var data uint8 = 255
常用于:
-
文件数据
-
图片数据
-
网络数据
五、整数溢出问题
每种整数类型都有自己的范围。
例如:
go
var num int8 = 127
最大值:
127
继续增加:
dart
num++
会发生溢出。
因为:
128
已经超过 int8 范围。
在实际开发中,如果数据规模不确定,不建议随意使用较小整数类型。
例如:
用户数量:
错误:
go
var users int8
正确:
csharp
var users int
因为用户数量未来可能超过:
127
六、数字类型转换
Go 不支持隐式类型转换。
例如:
css
var a int = 10
var b int64 = 20
下面错误:
css
fmt.Println(a + b)
因为:
go
int
和
int64
是不同类型
需要显式转换:
css
fmt.Println(int64(a) + b)
整数转换
例如:
go
a := 100
b := int64(a)
整数转浮点
例如:
go
num := 10
result := float64(num)
fmt.Println(result)
输出:
10
浮点转整数
例如:
go
price := 99.99
num := int(price)
结果:
99
注意:
Go 会直接截断小数。
不会:
四舍五入
例如:
99.99
转换后:
99
七、浮点类型
浮点数表示带小数的数据。
例如:
3.14
99.99
0.5
Go 提供:
go
float32
float64
八、float32 和 float64
float32
占用:
32 位
精度较低。
例如:
go
var price float32 = 99.99
适合:
-
图形计算
-
对精度要求不高的场景
float64
占用:
64 位
精度更高。
Go 默认浮点数字类型:
go
float64
例如:
go
price := 99.99
类型:
go
float64
实际开发中:
通常优先使用:
go
float64
九、浮点数精度问题
很多开发者第一次使用浮点数会遇到问题。
例如:
go
package main
import "fmt"
func main(){
a := 0.1
b := 0.2
fmt.Println(a+b)
}
结果可能:
0.30000000000000004
为什么?
因为计算机使用二进制保存浮点数。
很多十进制小数无法被二进制精确表示。
这不是 Go 的问题,而是计算机浮点数设计的问题。
十、金额计算为什么不用 float64?
例如:
商品价格:
19.99
订单金额:
999.99
如果直接使用:
go
float64
可能出现:
999.98999999
金融系统通常使用整数保存最小单位。
例如:
人民币:
1元 = 100分
保存:
go
price := int64(1999)
表示:
19.99 元
这样可以避免精度问题。
十一、数字常量
Go 中数字常量非常灵活。
例如:
ini
const age = 18
Go 会根据使用场景确定类型。
例如:
dart
const num = 100
var a int = num
var b float64 = num
都是合法的。
十二、不同进制数字
Go 支持多种数字表示。
十进制
go
num := 100
二进制
go
num := 0b1100100
结果:
100
八进制
go
num := 0144
十六进制
go
num := 0x64
结果:
100
十六进制在:
-
网络编程
-
位运算
-
底层开发
中经常使用。
十三、数学运算
Go 支持基本数学运算:
加:
diff
+
减:
diff
-
乘:
markdown
*
除:
/
取余:
shell
%
例如:
css
a := 10
b := 3
fmt.Println(a+b)
fmt.Println(a-b)
fmt.Println(a*b)
fmt.Println(a/b)
fmt.Println(a%b)
结果:
13
7
30
3
1
十四、整数除法注意
整数相除:
10 / 3
结果:
3
不是:
3.3333
因为两个整数:
arduino
int / int
结果仍然是:
arduino
int
如果需要小数:
需要转换:
go
result := float64(10) / float64(3)
结果:
3.333333
十五、math 数学库
Go 标准库提供:
lua
math
用于高级数学计算。
导入:
arduino
import "math"
例如:
平方根:
lua
math.Sqrt(16)
结果:
4
幂:
lua
math.Pow(2,3)
结果:
8
最大值:
lua
math.Max(10,20)
结果:
20
最小值:
lua
math.Min(10,20)
结果:
10
十六、数字类型选择建议
实际开发中:
普通整数
使用:
arduino
int
例如:
-
数量
-
页码
-
索引
数据库 ID
推荐:
go
int64
例如:
go
userID int64
时间戳
推荐:
go
int64
例如:
Unix 时间:
scss
time.Now().Unix()
返回:
go
int64
金额
不要:
go
float64
推荐:
go
int64
保存最小单位。
二进制数据
使用:
arduino
byte
或者:
arduino
[]byte
十七、完整示例
go
package main
import "fmt"
func main(){
var age int = 20
var userID int64 = 10001
var price float64 = 99.99
var count uint = 100
fmt.Println(age)
fmt.Println(userID)
fmt.Println(price)
fmt.Println(count)
}
输出:
20
10001
99.99
100
十八、本章小结
本篇详细介绍了 Go 数字类型。
重点内容:
-
整数类型:
-
int
-
int8
-
int16
-
int32
-
int64
-
-
无符号整数:
-
uint
-
uint8
-
uint16
-
uint32
-
uint64
-
-
浮点类型:
-
float32
-
float64
-
-
数字转换必须显式进行;
-
整数除法不会产生小数;
-
浮点数存在精度问题;
-
金额计算不要直接使用 float64;
-
普通业务优先使用 int 和 int64。
数字类型虽然简单,但在实际项目中非常重要,错误的数据类型选择可能导致:
-
数据溢出;
-
精度错误;
-
数据异常。
理解数字类型,是后续学习:
-
数组;
-
切片;
-
结构体;
-
数据库开发;
的重要基础。
本章练习
- 定义一个 int 类型保存年龄。
- 定义一个 int64 保存用户 ID。
- 定义一个 float64 保存商品价格。
- 计算两个整数相除的结果。
- 将整数转换成浮点数。
- 使用 math.Sqrt 计算平方根。
- 思考为什么订单金额应该使用整数保存。
- 使用不同进制表示数字 255。
下一篇预告
《Go 布尔类型 bool 详解》
下一篇将介绍 Go 中最简单但非常重要的数据类型------布尔类型。
内容包括:
-
bool 类型特点;
-
true 和 false;
-
条件判断;
-
比较运算;
-
逻辑运算;
-
&&、||、! 使用;
-
布尔值最佳实践;
-
常见判断错误。
布尔类型是 Go 流程控制、权限判断、业务逻辑处理的基础。