02 基本数据类型
本节目标:认识 Go 的基本类型;重点掌握 int、float64、string、bool;理解 Go 的"显式类型转换"。
一、类型总览
Go 的基本类型不少,但新手日常只用得到 4 个:
| 常用类型 | 说明 | 例子 |
|---|---|---|
int | 整数 | 42, -7 |
float64 | 小数 | 3.14 |
string | 字符串 | "hello" |
bool | 布尔 | true / false |
其余类型(int8/16/32/64、uint 系列、float32、byte、rune、complex 等)见到认识即可,需要时再查。
二、整数
var a int = 100
b := -50 // := 声明的整数默认就是 int
int在 64 位系统上是 64 位,范围约 ±922 亿亿,日常完全够用- 默认用
int,不要纠结选 int32 还是 int64,有特殊需求(如文件格式、网络协议规定了字节数)才用带位数的类型
整数除法会截断小数(向零取整):
fmt.Println(7 / 2) // 3,不是 3.5!
fmt.Println(7 % 2) // 1(取余数)
三、浮点数
pi := 3.14159 // := 声明的小数默认是 float64
var half float64 = 0.5
- 默认用
float64(精度高),float32基本不用 - 浮点数有精度问题,所有语言都一样:
fmt.Println(0.1 + 0.2) // 0.30000000000000004
所以不要用 == 直接比较浮点数,也不要用浮点数存钱(金额用"分"为单位的整数存)。
四、布尔
var isDone bool = false
ok := true
Go 的布尔非常严格:
- 只有
true/false,不能用 0 和 1 代替 - 条件判断必须是布尔值:
if 1 { }是编译错误(Python/C 程序员注意!)
五、字符串
name := "Go 语言"
常用操作
s := "hello"
// 拼接
greeting := s + ", world" // "hello, world"
// 长度(注意:是字节数,不是字符数!)
fmt.Println(len(s)) // 5
fmt.Println(len("你好")) // 6!一个中文占 3 个字节
// 统计"字符数"要这样:
fmt.Println(len([]rune("你好"))) // 2
// 遍历字符串(range 会正确处理中文)
for _, ch := range "Go语言" {
fmt.Printf("%c ", ch) // G o 语 言
}
重要特性
- 字符串是不可变的:
s[0] = 'H'会编译报错 - 双引号是字符串,反引号是原始字符串(不转义、可跨行):
s1 := "第一行\n第二行" // \n 是换行
s2 := `原样输出,\n 不转义
可以直接换行`
- 单引号是字符(rune),不是字符串:
'A'和"A"是两种类型!
六、fmt 打印速查
name, age, pi := "小明", 18, 3.14159
fmt.Println("你好", name) // 自动加空格和换行
fmt.Printf("姓名:%s,年龄:%d\n", name, age) // 格式化输出,需要自己加 \n
fmt.Printf("圆周率:%.2f\n", pi) // 保留两位小数:3.14
fmt.Printf("值是 %v,类型是 %T\n", age, age) // %v 万能占位符,%T 打印类型
常用占位符:
| 占位符 | 含义 |
|---|---|
%v | 万能,按默认格式打印任何值(不知道用啥就用它) |
%d | 整数 |
%f / %.2f | 浮点数 / 保留 2 位小数 |
%s | 字符串 |
%t | 布尔 |
%T | 打印值的类型(调试神器) |
%p | 指针地址 |
七、类型转换:必须显式!
这是 Go 和很多语言的重大区别:Go 没有隐式类型转换,不同类型之间运算必须手动转换:
var a int = 10
var b float64 = 3.5
fmt.Println(a + b) // ❌ 编译报错:mismatched types int and float64
fmt.Println(float64(a) + b) // ✅ 13.5
fmt.Println(a + int(b)) // ✅ 13(小数被截断)
转换语法就是 类型(值)。
数字和字符串互转:用 strconv 包
string(65) 并不能把数字变成 "65"(它会得到字符 "A"),要用标准库 strconv:
import "strconv"
// 数字 → 字符串
s := strconv.Itoa(123) // "123"
// 字符串 → 数字(可能失败,所以有两个返回值)
n, err := strconv.Atoi("456") // 456, nil
if err != nil {
fmt.Println("转换失败:", err)
}
Itoa= Integer to ASCII,Atoi= ASCII to Integer。err是什么下一章会详细讲,先照着写。
新手常见坑
- 整数除法丢小数:
7/2是3。想要 3.5 需要7.0/2或float64(a)/float64(b) - 不同类型不能直接运算:先转换
- len(中文字符串) 不等于字符数:一个汉字 3 个字节
string(数字)不是你想的那样:转字符串用strconv.Itoa
练习
- 声明一个 int 和一个 float64,把它们加起来打印(体会类型转换)。
- 用
%.1f打印3.14159,保留 1 位小数。 - 打印
len("Go语言")的结果,先猜再验证。 - 把字符串
"2024"转成整数并加 1 后打印;再把100转成字符串和"分"拼接后打印。
下一节:03 运算符