1.4 数据类型:整型、浮点型与复数型
1. 整型
Go 为整数提供 10 种具名类型:带符号、无符号的 8 / 16 / 32 / 64 位整数各一对,以及与实现相关的 int、uint。全貌见下图(与语言规范一致;以当前官方文档为准)。

有符号与无符号
- 名称含
u的为无符号(如uint8):只能表示非负整数。 - 不含
u的为有符号(如int8):可表示负数。
以 int8 与 uint8 为例:二者宽度均为 8 bit,共 2⁸ = 256 种位组合。
| 类型 | 取值范围 |
|---|---|
uint8 | 0~255 |
int8 | -128~127 |
固定宽度与 int / uint
int8、int16、int32、int64(及 uint8 … uint64)在类型名中写明了位宽,语义与目标平台无关。
int、uint 的位宽取决于编译目标平台(常见情况:32 位目标上多为 32 bit,64 位目标上多为 64 bit)。因此:
- 协议、文件格式、跨语言数据交换等需要固定宽度时,宜用
int32/int64或uint32/uint64。 - 本地计数、切片下标、循环变量等,用
int很自然,也与len等内置结果的常用类型一致。
整型字面量与进制
十进制最常用:
var num int = 10整数还可写为二进制、八进制、十六进制字面量(浮点字面量不能用整型那套进制前缀表示「整个小数」,见下节)。
| 进制 | 前缀 | 示例(十进制值均为 12) |
|---|---|---|
| 二进制 | 0b / 0B | 0b1100 |
| 八进制 | 0o / 0O | 0o14 |
| 十六进制 | 0x | 0xC |
用 fmt.Printf 按不同进制打印同一数值:
package main
import (
"fmt"
)
func main() {
var num01 int = 0b1100
var num02 int = 0o14
var num03 int = 0xC
fmt.Printf("二进制 %%b: %b → 十进制 %%d: %d\n", num01, num01)
fmt.Printf("八进制 %%o: %o → 十进制 %%d: %d\n", num02, num02)
fmt.Printf("十六进制 %%X: %X → 十进制 %%d: %d\n", num03, num03)
}二进制 %b: 1100 → 十进制 %d: 12
八进制 %o: 14 → 十进制 %d: 12
十六进制 %X: C → 十进制 %d: 12(格式串中的 %% 在输出中为单个 %,用于在屏幕上标出动词名;一般打印只需 %b、%d 等。)
与整型相关的 fmt 动词(节选)
| 动词 | 含义 |
|---|---|
%b | 二进制 |
%o | 八进制 |
%d | 十进制 |
%x / %X | 十六进制(小写 / 大写字母) |
%c | 以 Unicode 字符形式输出(整数须为合法码点) |
%q | 单引号括起的 Go 字符字面量形式 |
%U | U+1234 形式的 Unicode |
%f、%e、%E 等用于浮点数,见下一节。
2. 浮点型
浮点字面量由整数部分、小数点 .、小数部分(两侧可省略其一)组成;也可使用指数形式:在尾数后写 e 或 E,再跟十进制指数。例如 3.7e-2 为 0.037,3.7e+1 为 37。
37.0 可写作 37;0.037 可写作 .037。
注意: 浮点字面量只能用十进制数字书写,不能像整数那样用 0x / 0o / 0b 表示整个浮点数。形如 03.7 的写法仍表示十进制 3.7(前导 0 无八进制含义)。
float32 与 float64
Go 提供 float32(常称单精度)与 float64(常称双精度),遵循 IEEE 754 二进制浮点格式。
float32:4 字节(32 bit),1 位符号、8 位指数、23 位尾数。

float64:8 字节(64 bit),1 位符号、11 位指数、52 位尾数。

有效数字与取值范围
十进制有效位数大致由尾数位数决定:
float32:约 6~7 位有效十进制数字。float64:约 15~16 位有效十进制数字(双精度,勿与单精度混淆)。
数量级上可参考 math 包,例如 math.MaxFloat32 ≈ 3.4e38、math.MaxFloat64 ≈ 1.8e308;正数可小至约 1.4e-45(float32)与 4.9e-324(float64)量级(含非正规数),连续逼近 0。
精度示例:float32
例 1: 10000018 用 float32 表示约为 1.0000018×10⁷,仍在约 7 位有效数字内,x+1 与 x 可区分。
package main
import "fmt"
func main() {
var x float32 = 10000018
fmt.Println(x)
fmt.Println(x + 1)
}1.0000018e+07
1.0000019e+07例 2: 数值更大时,float32 尾数不足以区分某些相邻整数,加法结果可能与数学预期不一致。
package main
import "fmt"
func main() {
var a float32 = 100000182
var b float32 = 100000187
fmt.Println(a)
fmt.Println(a + 5)
fmt.Println(a+5 == b)
}1.00000184e+08
1.0000019e+08
false例 3: 在部分取值上会出现 x == x+1 为 true 的情况(增量相对 x 过小,舍入后不变)。需要精确十进制或整数计数时,应使用整型或 math/big,不宜依赖浮点相等比较。
3. 复数型
Go 内置两种复数类型,由实部与虚部组成,虚部用虚数单位 i(即数学上的虚数单位,满足 i² = -1)书写。
| 类型 | 说明 |
|---|---|
complex64 | 实部、虚部均为 float32,共 8 字节。 |
complex128 | 实部、虚部均为 float64,共 16 字节(默认无类型复数字面量的默认类型)。 |
字面量与内置函数
复数字面量把 i 写在虚部系数后面,实部与虚部均为浮点形式,例如 1+2i、3.0 - 0.5i。
内置函数 complex、real、imag 用于构造与拆取实虚部(参数类型需匹配,如 complex128 对应 float64):
package main
import "fmt"
func main() {
var c1 complex128 = 1 + 2i
c2 := complex(3.0, 4.0) // 与 3+4i 等价
fmt.Println(c1, real(c1), imag(c1)) // (1+2i) 1 2
fmt.Println(c2, real(c2), imag(c2)) // (3+4i) 3 4
}complex64 需用 float32 构造,例如 complex(float32(1), float32(2)) 或保证字面量落在 complex64 上下文中。
运算与标准库
对复数可使用 +、-、*、/ 等运算符。更高层的函数(如幂、三角函数)可使用标准库 math/cmplx,其接口以 complex128 为主。