Go 数字类型详解

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。

数字类型虽然简单,但在实际项目中非常重要,错误的数据类型选择可能导致:

  • 数据溢出;

  • 精度错误;

  • 数据异常。

理解数字类型,是后续学习:

  • 数组;

  • 切片;

  • 结构体;

  • 数据库开发;

的重要基础。


本章练习

  1. 定义一个 int 类型保存年龄。
  2. 定义一个 int64 保存用户 ID。
  3. 定义一个 float64 保存商品价格。
  4. 计算两个整数相除的结果。
  5. 将整数转换成浮点数。
  6. 使用 math.Sqrt 计算平方根。
  7. 思考为什么订单金额应该使用整数保存。
  8. 使用不同进制表示数字 255。

下一篇预告

《Go 布尔类型 bool 详解》

下一篇将介绍 Go 中最简单但非常重要的数据类型------布尔类型。

内容包括:

  • bool 类型特点;

  • true 和 false;

  • 条件判断;

  • 比较运算;

  • 逻辑运算;

  • &&、||、! 使用;

  • 布尔值最佳实践;

  • 常见判断错误。

布尔类型是 Go 流程控制、权限判断、业务逻辑处理的基础。

相关推荐
程序员爱钓鱼1 小时前
Rust Move 详解:所有权移动与变量失效
后端·面试·rust
snow@li1 小时前
SpringBoot:Payload统一响应包装/全景深入梳理
java·spring boot·后端
JaguarJack1 小时前
对标 npx 的 CPX PHP 的 Composer 包执行器
后端·php·服务端
BingoGo1 小时前
对标 npx 的 CPX PHP 的 Composer 包执行器
后端·php
艾莉丝努力练剑1 小时前
【MYSQL】MYSQL学习的一大重点:视图
android·服务器·数据库·学习·mysql·面试·视图
AINative软件工程2 小时前
LLM 多租户 Quota 工程实践:Token 配额、用量预警与自动熔断的生产设计
后端·llm·ai编程
艾莉丝努力练剑2 小时前
【MYSQL】MYSQL学习的一大重点:事务(下)- InnoDB 事务隔离性原理(MVCC 视角)
android·数据库·b树·sql·学习·mysql·面试
Ivanqhz2 小时前
php7 闭包实现
开发语言·后端·rust·php
有梦不弃10 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构