# Go 语言分级学习与测试 按编号逐级学习,**每个例程独占一个文件夹**,代码、测试和该例程说明放在一起,不与其他例程混放。 ## 项目结构 ```text . ├── README.md # 学习目录与公共命令 ├── INSTALL.md # 环境、依赖、编译运行教程 ├── go.mod # 所有例程共用的模块配置 ├── .gitignore └── lessons/ ├── 01_hello/ # 第 01 课:第一个 Go 程序 │ ├── README.md # 本课目标、运行方法与练习 │ ├── main.go # 本课独立入口 │ └── main_test.go # 本课测试 ├── 02_variables/ # 第 02 课:变量、常量与基础类型 │ ├── README.md # 知识点、预期输出与手敲练习 │ └── main.go # 带逐节注释的参考代码 ├── 03_conditions/ # 第 03 课:if 条件判断 │ ├── README.md # 语法、编译运行与边界练习 │ └── main.go # 分支、比较和逻辑运算 ├── 04_loops/ # 第 04 课:for 循环 │ ├── README.md # 循环语法、编译运行与练习 │ └── main.go # 累加、跳过、退出和字符串遍历 ├── 05_arrays_slices/ # 第 05 课:数组与切片 │ ├── README.md # 固定长度、追加、共享和复制 │ └── main.go # 带逐节注释的参考代码 ├── 06_maps/ # 第 06 课:map 键值对 │ ├── README.md # 增删改查、遍历、nil 与共享 │ └── main.go # 按姓名查询成绩的参考代码 ├── 07_functions/ # 第 07 课:函数 │ ├── README.md # 参数、返回值、值传递和练习 │ ├── main.go # 普通函数、多返回值、可变参数 │ └── main_test.go # 本课函数测试 ├── 08_structs/ # 第 08 课:结构体 │ ├── README.md # 定义、字段、复制和结构体切片 │ └── main.go # 学生记录与简化测试数据表 ├── 09_pointers/ # 第 09 课:指针 │ ├── README.md # 取地址、解引用、nil 和参数传递 │ └── main.go # 指针修改整数与结构体 ├── 10_methods/ # 第 10 课:方法与接收者 │ ├── README.md # 值接收者、指针接收者与方法调用 │ └── main.go # 学生信息、生日和成绩修改 ├── 11_errors/ # 第 11 课:错误处理 │ ├── README.md # error、nil、检查与错误传递 │ └── main.go # 除法、成绩校验和字符串转换 ├── 12_switch_defer/ # 第 12 课:switch 与 defer │ ├── README.md # 多分支、延迟调用与执行顺序 │ └── main.go # 指令选择、成绩判断和 defer 示例 ├── 13_function_values/ # 第 13 课:函数进阶 │ ├── README.md # 函数值、匿名函数、闭包与 t.Run 预习 │ └── main.go # 回调计算、独立计数器和 defer 对比 ├── 14_testing/ # 第 14 课:单元测试专题 │ ├── README.md # 测试语法、子测试、错误断言和运行命令 │ ├── main.go # 被测函数与普通程序入口 │ └── main_test.go # 基础测试、表驱动测试和边界用例 ├── 15_packages/ # 第 15 课:包与模块 │ ├── README.md # 模块路径、导入、导出与外部测试 │ ├── main.go # 导入自定义包的程序入口 │ └── score/ │ ├── score.go # 成绩转换与校验包 │ └── score_test.go # 外部测试包 ├── 16_interfaces/ # 第 16 课:接口 │ ├── README.md # 隐式实现、方法集、nil 与测试替身 │ ├── main.go # 不同类型通过统一接口自我介绍 │ └── main_test.go # 接口实现及测试替身验证 ├── 17_files/ # 第 17 课:文件读写 │ ├── README.md # 路径、读写、追加、关闭与逐行扫描 │ ├── main.go # 在独立临时目录操作学习记录 │ └── main_test.go # 使用临时目录隔离的文件测试 ├── 18_json/ # 第 18 课:JSON 编码与解码 │ ├── README.md # 标签、编码、解码和文件操作 │ ├── main.go # 学习记录的 JSON 往返示例 │ └── main_test.go # 往返、字段省略和非法输入测试 ├── 19_cli/ # 第 19 课:命令行输入与参数 │ ├── README.md # 参数、交互输入、帮助和退出状态 │ ├── main.go # 学习记录输入示例 │ └── main_test.go # 模拟输入输出与边界测试 └── 20_http/ # 第 20 课:HTTP 客户端与服务端 ├── README.md # 请求、响应、状态码与本地测试 ├── main.go # 临时服务和客户端请求 └── main_test.go # 服务处理和客户端测试 ``` 根目录不放例程代码。各课共享根目录的 `go.mod`,不需要逐课初始化模块,也不需要 `go.work`。当前模块路径 `example.com/go-study` 是学习用标识,不必与 Git 地址相同。 ## 学习目录 | 级别 | 例程 | 内容 | 状态 | | --- | --- | --- | --- | | 01 | [第一个 Go 程序](./lessons/01_hello/README.md) | 输出、变量、函数、首次测试 | 已建立 | | 02 | [变量、常量与基础类型](./lessons/02_variables/README.md) | 声明、赋值、零值、类型转换 | 已建立 | | 03 | [if 条件判断](./lessons/03_conditions/README.md) | 条件分支、比较、逻辑运算 | 已建立 | | 04 | [for 循环](./lessons/04_loops/README.md) | 三段式、条件循环、break、continue、range | 已建立 | | 05 | [数组与切片](./lessons/05_arrays_slices/README.md) | 索引、遍历、append、截取、make、copy | 已建立 | | 06 | [map 键值对](./lessons/06_maps/README.md) | 增删改查、存在性判断、遍历、nil | 已建立 | | 07 | [函数](./lessons/07_functions/README.md) | 参数、返回值、值传递、多返回值、可变参数 | 已建立 | | 08 | [结构体](./lessons/08_structs/README.md) | 定义、字段访问、零值、复制、结构体切片 | 已建立 | | 09 | [指针](./lessons/09_pointers/README.md) | &、*、nil、指针参数、结构体指针、new | 已建立 | | 10 | [方法与接收者](./lessons/10_methods/README.md) | 方法声明、值接收者、指针接收者、nil 处理 | 已建立 | | 11 | [错误处理](./lessons/11_errors/README.md) | error、nil、errors.New、fmt.Errorf、错误传递 | 已建立 | | 12 | [switch 与 defer](./lessons/12_switch_defer/README.md) | 多分支、延迟调用、后进先出、参数求值 | 已建立 | | 13 | [函数进阶](./lessons/13_function_values/README.md) | 函数值、匿名函数、函数参数、闭包 | 已建立 | | 14 | [单元测试专题](./lessons/14_testing/README.md) | testing.T、表驱动、t.Run、错误断言、测试命令 | 已建立 | | 15 | [包与模块](./lessons/15_packages/README.md) | package、import、module、导出、跨包测试 | 已建立 | | 16 | [接口](./lessons/16_interfaces/README.md) | 隐式实现、接口参数、方法集、nil、测试替身 | 已建立 | | 17 | [文件读写](./lessons/17_files/README.md) | filepath、整体读写、追加、Scanner、Close | 已建立 | | 18 | [JSON 编码与解码](./lessons/18_json/README.md) | 结构体标签、Marshal、Unmarshal、文件往返 | 已建立 | | 19 | [命令行输入与参数](./lessons/19_cli/README.md) | os.Args、flag、交互输入、校验、退出状态 | 已建立 | | 20 | [HTTP 客户端与服务端](./lessons/20_http/README.md) | 请求、响应、状态码、JSON、本地测试 | 已建立 | 后续按编号逐步新增独立目录。不一次性铺开后续课程,也不把新例程写进旧例程的入口文件。 ## 快速开始 在项目根目录执行: ```powershell go version go run ./lessons/01_hello ``` 预期输出: ```text 你好,Go! 欢迎开始 Go 语言学习与测试。 2 + 3 = 5 ``` 也可以进入本课目录运行: ```powershell Set-Location lessons/01_hello go run . go test -v . ``` > 根目录没有 Go 程序入口,不要在根目录使用 `go run .`。进入具体例程目录后才使用该命令。 ## 公共命令 以下命令均在**项目根目录**执行: ```powershell # 只运行第 01 课 go run ./lessons/01_hello # 只测试第 01 课 go test -v ./lessons/01_hello # 格式化、测试、检查所有课程 go fmt ./... go test -v ./... go vet ./... # 编译第 01 课到对应的构建目录 New-Item -ItemType Directory -Force bin/01_hello | Out-Null go build -o ./bin/01_hello/hello.exe ./lessons/01_hello .\bin\01_hello\hello.exe ``` 每个例程独立编译运行,不要使用 `go run ./...` 尝试一次启动所有课程。构建产物统一放入已忽略的 `bin/课程编号/` 目录。 ## 安装与依赖 当前仅使用 Go 标准库,**不需要第三方运行依赖**。详见 [安装与运行教程](./INSTALL.md),包含 SDK、VS Code 工具安装、依赖管理、编译、测试和调试步骤。 ## 参考资料 - [Go 官方文档](https://go.dev/doc/) - [A Tour of Go](https://go.dev/tour/) - [标准库参考](https://pkg.go.dev/std) ## Git 仓库 远程地址: 请勿提交密码、访问令牌或个人环境配置。当前 HTTP 地址没有 HTTPS 传输加密;如服务端支持,建议改用 HTTPS 或 SSH。