# 第 02 课:变量、常量与基础类型 ## 怎么学习 打开 [main.go](./main.go),按注释中的 1~7 节顺序照着敲一遍。每敲完一节,可以先运行,再继续下一节。不需要安装第三方依赖,也不需要重新初始化模块。 如果想保留参考代码并另外手敲:在本课下创建 `practice/` 目录,在里面新建自己的 `main.go`。从仓库根目录用 `go run ./lessons/02_variables/practice` 运行;不要在本课同一目录里再创建第二个 `main` 函数。 ## 本课知识点 | 写法 | 含义 | 注意 | | --- | --- | --- | | `var age int = 18` | 指定类型和初始值 | 类型写在变量名后面 | | `var city = "上海"` | 由初始值推断类型 | 这里推断为 `string` | | `lesson := 2` | 短变量声明 | 仅限函数内部 | | `age = 19` | 给已有变量赋新值 | 不是重新声明 | | `age, score := 20, 95` | 声明新变量并给已有变量赋值 | 同一作用域内至少有一个新变量 | | `const courseName = "Go 语言基础"` | 声明常量 | 不能重新赋值 | | `var count int` | 使用零值初始化 | 整数零值是 `0` | | `float64(quantity)` | 显式类型转换 | 不会改变原变量类型 | 先掌握四种类型:`int`(整数)、`float64`(浮点数)、`string`(字符串)、`bool`(布尔值)。 Go 不会自动把 `int` 变量转为 `float64` 来参与混合运算。浮点数转整数会向零截断,例如 `int(7.5)` 的结果是 `7`,不是四舍五入。 ## 运行 在仓库根目录执行: ```powershell go run ./lessons/02_variables ``` 或从根目录进入本课: ```powershell Set-Location lessons/02_variables go run . ``` 预期输出: ```text === 个人资料 === 姓名:小朱,年龄:18,正在学习 Go:true 城市:上海,类型:string 当前是第 2 课,修改后的年龄:19 再次修改后的年龄:20,分数:95 课程:Go 语言基础 === 零值 === int:0,float64:0.0,string:"",bool:false === 购物计算 === 数量:3,单价:2.50,总价:7.50 数量类型:int,单价类型:float64,总价类型:float64 总价转为整数:7,原总价仍为:7.50 ``` ## 编译 以下命令在仓库根目录执行: ```powershell New-Item -ItemType Directory -Force bin/02_variables | Out-Null go build -o ./bin/02_variables/variables.exe ./lessons/02_variables .\bin\02_variables\variables.exe ``` `go build` 保留可执行文件;`go run` 先编译再直接运行。修改源码后,可执行文件需要重新编译才会更新。 ## 输出占位符 | 占位符 | 用途 | | --- | --- | | `%s` | 字符串 | | `%d` | 十进制整数 | | `%t` | 布尔值 | | `%.2f` | 浮点数,输出保留两位小数 | | `%q` | 带引号的字符串,方便观察空字符串 | | `%T` | 值的类型 | | `\n` | 换行 | 注意:`%.2f` 只是控制输出格式,不会把变量变成“精确的两位小数”。`float64` 可能存在精度误差,本例仅用于学习,实际金额处理需要另行设计。 ## 动手练习 - [ ] 把姓名、城市和年龄改成自己的资料。 - [ ] 将 `learning` 改为 `false`,观察输出。 - [ ] 将商品数量改成 `4`、单价改成 `3.25`,核对总价 `13.00`。 - [ ] 改为只计算 `quantity * unitPrice`,观察编译器的类型错误,再恢复转换。 - [ ] 尝试给 `courseName` 重新赋值,观察常量不能修改的报错,再恢复。 - [ ] 声明一个没有使用的局部变量,观察编译错误,再删除或使用它。 故意制造错误的练习一次只做一个,观察后恢复可编译状态。不要同时保留多处错误。 本课先专注变量与类型,不额外引入测试框架或函数封装。下一课再学习 `if` 条件判断。 [上一课:第一个 Go 程序](../01_hello/README.md) · [学习总览](../../README.md)