首页 / Go 语言入门教程 / 基本数据类型

Go 语言入门教程

基本数据类型

本教程共 80 篇 · 第 11 篇 · 更新于 2026-07-27 · 约 8 分钟阅读

GoGo 入门教程数据类型intfloatboolcomplexGo 类型

11. 基本数据类型

本节目标:搞清楚 Go 有哪些基本数据类型,各自的取值范围是多少,什么时候用哪个。

类型总览

Go 的基本数据类型分四大类:

  1. 布尔型bool
  2. 整数型intuint 及各种位宽变体
  3. 浮点型float32float64
  4. 复数型complex64complex128

另外还有两个和字符相关的类型:byte(等于 uint8)和 rune(等于 int32),下下节专门讲。

布尔型

bool 只有两个值:truefalse

var ok bool = true
var done bool = false
flag := true  // 短声明自动推断为 bool

Go 的布尔型和其他语言有个重要区别:整数不能当布尔值用

var count int = 0
if count {  // 报错:non-bool count used as if condition
    fmt.Println("不为零")
}

你必须显式比较:

if count != 0 {
    fmt.Println("不为零")
}

bool 的零值是 false

整数型

Go 的整数类型比较丰富,分有符号无符号两大类,每类有不同的位宽。

有符号整数

类型大小取值范围
int81 字节-128 到 127
int162 字节-32768 到 32767
int324 字节-2147483648 到 2147483647
int648 字节-9223372036854775808 到 9223372036854775807
int平台相关(32 或 64 位)32 位平台同 int32,64 位平台同 int64

无符号整数

类型大小取值范围
uint81 字节0 到 255
uint162 字节0 到 65535
uint324 字节0 到 4294967295
uint648 字节0 到 18446744073709551615
uint平台相关32 或 64 位

特殊整数类型

类型用途
uintptr存放指针地址,用于底层编程
byteuint8 的别名,表示一个字节
runeint32 的别名,表示一个 Unicode 码点

日常怎么选

大部分时候用 int 就行。它是平台相关的,在 64 位系统上就是 64 位,性能最好。

var count int = 100
age := 18

需要明确控制位宽时(比如网络协议、文件格式),才用 int32int64 这些。

需要非负数时用 uint,比如数组长度、计数器。但 Go 社区通常建议优先用 int,因为 intuint 混用容易出 bug。

Tip

intint32 是不同的类型,不能直接赋值或运算,需要类型转换。这在后面「类型转换」一节会详细讲。

整数溢出

Go 的整数运算不会自动检查溢出,溢出后会回绕:

var a int8 = 127
a = a + 1
fmt.Println(a)  // -128,溢出了

如果担心溢出,可以用 math/bits 包提供的函数检查,或者用 math/big 包处理大数。

浮点型

Go 有两种浮点数类型,遵循 IEEE 754 标准:

类型大小精度
float324 字节约 6-7 位小数
float648 字节约 15-16 位小数
var pi float64 = 3.141592653589793
var e float32 = 2.7182818

日常开发默认用 float64。Go 的字面量 3.14 默认就是 float64 类型。

x := 3.14  // 自动推断为 float64
Warning

浮点数有精度问题,不要用 == 直接比较:

fmt.Println(0.1 + 0.2 == 0.3)  // false

这是因为 0.1 和 0.2 在二进制浮点数中无法精确表示。比较浮点数要用差值小于某个阈值的方式。

复数型

Go 内置了复数类型,这在编程语言里比较少见:

类型说明
complex64实部和虚部都是 float32
complex128实部和虚部都是 float64
var c1 complex64 = 3 + 4i
var c2 complex128 = complex(3.0, 4.0)

fmt.Println(c1)           // (3+4i)
fmt.Println(real(c1))     // 3(实部)
fmt.Println(imag(c1))     // 4(虚部)

real() 取实部,imag() 取虚部,complex() 构造复数。

Note

复数类型在日常开发中很少用到,主要在科学计算和信号处理领域。初学者知道有这个东西就行。

类型的零值

回顾一下各基本类型的零值:

类型零值
boolfalse
所有整数类型0
所有浮点类型0.0
所有复数类型(0+0i)
var b bool
var i int
var f float64
var c complex128

fmt.Println(b)  // false
fmt.Println(i)  // 0
fmt.Println(f)  // 0
fmt.Println(c)  // (0+0i)

字面量与类型推断

整数字面量默认推断为 int

x := 42       // int
y := 100      // int

如果超出 int 范围(在 64 位平台上),会自动用 int64,再大就报错。

浮点数字面量默认推断为 float64

f := 3.14     // float64

可以用类型后缀改变默认推断:

i := 42       // int
i8 := int8(42)  // 显式指定
f32 := 3.14    // float64
f32_2 := float32(3.14)  // 显式指定

查看类型

fmt.Printf%T 动词可以查看变量类型:

func main() {
    a := 42
    b := 3.14
    c := true
    d := 'A'  // rune

    fmt.Printf("a: %T\n", a)  // a: int
    fmt.Printf("b: %T\n", b)  // b: float64
    fmt.Printf("c: %T\n", c)  // c: bool
    fmt.Printf("d: %T\n", d)  // d: int32
}

类型大小

unsafe.Sizeof 可以查看类型占多少字节:

func main() {
    fmt.Println("bool:", unsafe.Sizeof(true))          // 1
    fmt.Println("int:", unsafe.Sizeof(int(0)))          // 8(64位平台)
    fmt.Println("int32:", unsafe.Sizeof(int32(0)))      // 4
    fmt.Println("float64:", unsafe.Sizeof(float64(0)))  // 8
}
Note

int 在 32 位平台上占 4 字节,在 64 位平台上占 8 字节。如果你的代码依赖 int 的大小,在跨平台时可能出问题。需要确定大小就用 int32int64

常见问题

int 和 int32 不能混用

var a int = 10
var b int32 = 20
c := a + b  // 报错:mismatched types int and int32

Go 没有隐式类型转换,intint32 虽然在 32 位平台上大小一样,但它们是不同的类型。必须显式转换:

c := a + int(b)  // 正确

不要用 uint 做减法

var a uint = 3
var b uint = 5
c := a - b  // 不会报错,但结果是 18446744073709551614(下溢)
fmt.Println(c)

无符号整数减法下溢会得到一个巨大的正数,这是常见 bug 来源。

学完这节你能做什么

  • 知道 Go 有哪些基本数据类型
  • 选择合适的整数类型和浮点类型
  • 理解整数溢出和浮点精度问题
  • %T 查看变量类型
  • 避开 int/uint 混用的陷阱

下一节讲字符串。