跳到主要内容

02 基本数据类型

本节目标:认识 Go 的基本类型;重点掌握 int、float64、string、bool;理解 Go 的"显式类型转换"。

一、类型总览

Go 的基本类型不少,但新手日常只用得到 4 个

常用类型说明例子
int整数42, -7
float64小数3.14
string字符串"hello"
bool布尔true / false

其余类型(int8/16/32/64uint 系列、float32byterunecomplex 等)见到认识即可,需要时再查。

二、整数

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 语 言
}

重要特性

  1. 字符串是不可变的s[0] = 'H' 会编译报错
  2. 双引号是字符串,反引号是原始字符串(不转义、可跨行):
s1 := "第一行\n第二行" // \n 是换行
s2 := `原样输出,\n 不转义
可以直接换行`
  1. 单引号是字符(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 是什么下一章会详细讲,先照着写。


新手常见坑

  1. 整数除法丢小数7/23。想要 3.5 需要 7.0/2float64(a)/float64(b)
  2. 不同类型不能直接运算:先转换
  3. len(中文字符串) 不等于字符数:一个汉字 3 个字节
  4. string(数字) 不是你想的那样:转字符串用 strconv.Itoa

练习

  1. 声明一个 int 和一个 float64,把它们加起来打印(体会类型转换)。
  2. %.1f 打印 3.14159,保留 1 位小数。
  3. 打印 len("Go语言") 的结果,先猜再验证。
  4. 把字符串 "2024" 转成整数并加 1 后打印;再把 100 转成字符串和 "分" 拼接后打印。

下一节:03 运算符