|
@@ -46,7 +46,7 @@ go env GOROOT GOPATH
|
|
|
1. 从 <https://code.visualstudio.com/> 安装 VS Code。
|
|
1. 从 <https://code.visualstudio.com/> 安装 VS Code。
|
|
|
2. 扩展面板(`Ctrl + Shift + X`)搜索 `golang.Go`,安装由 Go Team at Google 发布的 Go 扩展。
|
|
2. 扩展面板(`Ctrl + Shift + X`)搜索 `golang.Go`,安装由 Go Team at Google 发布的 Go 扩展。
|
|
|
3. 使用“打开文件夹”打开本项目根目录。
|
|
3. 使用“打开文件夹”打开本项目根目录。
|
|
|
-4. 打开 `main.go`,根据提示安装所需工具;或按 `Ctrl + Shift + P`,执行 `Go: Install/Update Tools`。
|
|
|
|
|
|
|
+4. 打开 `lessons/01_hello/main.go`,根据提示安装所需工具;或按 `Ctrl + Shift + P`,执行 `Go: Install/Update Tools`。
|
|
|
5. 安装 `gopls`;需要 F5 断点调试时再安装 `dlv`。
|
|
5. 安装 `gopls`;需要 F5 断点调试时再安装 `dlv`。
|
|
|
|
|
|
|
|
也可手动安装这些**开发工具**(需要网络,不属于项目运行依赖):
|
|
也可手动安装这些**开发工具**(需要网络,不属于项目运行依赖):
|
|
@@ -64,7 +64,9 @@ go install github.com/go-delve/delve/cmd/dlv@latest
|
|
|
|
|
|
|
|
### 已经打开当前项目
|
|
### 已经打开当前项目
|
|
|
|
|
|
|
|
-直接在项目根目录打开终端即可。仓库已有 `go.mod`,**不要重复执行 `go mod init`**。
|
|
|
|
|
|
|
+直接在项目根目录打开终端即可。仓库已有公共 `go.mod`,所有例程共用它,**不要在根目录或例程目录重复执行 `go mod init`**。
|
|
|
|
|
+
|
|
|
|
|
+每个例程独占 `lessons/编号_主题/` 目录,拥有自己的程序、测试和说明。根目录只放公共配置及教程,不放程序入口。
|
|
|
|
|
|
|
|
### 在新电脑克隆
|
|
### 在新电脑克隆
|
|
|
|
|
|
|
@@ -102,10 +104,10 @@ go env GOPROXY
|
|
|
|
|
|
|
|
## 5. 运行第一个程序
|
|
## 5. 运行第一个程序
|
|
|
|
|
|
|
|
-在项目根目录执行:
|
|
|
|
|
|
|
+在项目根目录指定第 01 课的目录:
|
|
|
|
|
|
|
|
```powershell
|
|
```powershell
|
|
|
-go run .
|
|
|
|
|
|
|
+go run ./lessons/01_hello
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
预期输出:
|
|
预期输出:
|
|
@@ -116,9 +118,16 @@ go run .
|
|
|
2 + 3 = 5
|
|
2 + 3 = 5
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-这里的 `.` 表示当前目录的包。修改代码并保存后,再次运行该命令即可。
|
|
|
|
|
|
|
+修改代码并保存后,再次运行该命令即可。也可以从项目根目录进入本课:
|
|
|
|
|
+
|
|
|
|
|
+```powershell
|
|
|
|
|
+Set-Location lessons/01_hello
|
|
|
|
|
+go run .
|
|
|
|
|
+```
|
|
|
|
|
|
|
|
-也可用 `go run main.go` 运行当前单文件示例,但后续程序拆分为多个文件时,优先使用 `go run .`,避免遗漏其他源码文件。
|
|
|
|
|
|
|
+这里的 `.` 表示当前例程所在的包,能包含本课目录中的多个源码文件。根目录没有 Go 程序入口,不要在根目录执行 `go run .`。每次只运行一课,不使用 `go run ./...` 同时启动所有例程。
|
|
|
|
|
+
|
|
|
|
|
+下文公共命令按项目根目录执行;如果刚进入本课,可用 `Set-Location ../..` 返回根目录。
|
|
|
|
|
|
|
|
## 6. 格式化、测试与检查
|
|
## 6. 格式化、测试与检查
|
|
|
|
|
|
|
@@ -126,7 +135,10 @@ go run .
|
|
|
# 格式化所有包
|
|
# 格式化所有包
|
|
|
go fmt ./...
|
|
go fmt ./...
|
|
|
|
|
|
|
|
-# 运行表驱动单元测试
|
|
|
|
|
|
|
+# 只测试第 01 课
|
|
|
|
|
+go test -v ./lessons/01_hello
|
|
|
|
|
+
|
|
|
|
|
+# 测试所有课程
|
|
|
go test -v ./...
|
|
go test -v ./...
|
|
|
|
|
|
|
|
# 查看测试覆盖率
|
|
# 查看测试覆盖率
|
|
@@ -136,35 +148,45 @@ go test -cover ./...
|
|
|
go vet ./...
|
|
go vet ./...
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-`main_test.go` 验证了正数、零、负数和正负混合相加。`_test.go` 文件不会被编译进正常程序。覆盖率可能不到 100%,因为当前只为加法函数写了测试,没有对终端输出入口做测试。
|
|
|
|
|
|
|
+`lessons/01_hello/main_test.go` 验证了正数、零、负数和正负混合相加。`_test.go` 文件不会被编译进正常程序。覆盖率可能不到 100%,因为当前只为加法函数写了测试,没有对终端输出入口做测试。
|
|
|
|
|
|
|
|
## 7. 编译为 Windows 可执行文件
|
|
## 7. 编译为 Windows 可执行文件
|
|
|
|
|
|
|
|
-在 PowerShell 执行:
|
|
|
|
|
|
|
+在项目根目录的 PowerShell 执行,每课使用单独的产物目录:
|
|
|
|
|
|
|
|
```powershell
|
|
```powershell
|
|
|
-# 创建构建输出目录,重复执行也可以
|
|
|
|
|
-New-Item -ItemType Directory -Force bin | Out-Null
|
|
|
|
|
|
|
+# 创建第 01 课的构建输出目录,重复执行也可以
|
|
|
|
|
+New-Item -ItemType Directory -Force bin/01_hello | Out-Null
|
|
|
|
|
|
|
|
-# 编译
|
|
|
|
|
-go build -o ./bin/hello.exe .
|
|
|
|
|
|
|
+# 只编译第 01 课
|
|
|
|
|
+go build -o ./bin/01_hello/hello.exe ./lessons/01_hello
|
|
|
|
|
|
|
|
# 启动编译后的程序
|
|
# 启动编译后的程序
|
|
|
-.\bin\hello.exe
|
|
|
|
|
|
|
+.\bin\01_hello\hello.exe
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
+命令解释:
|
|
|
|
|
+
|
|
|
|
|
+- `go build` 是编译命令。
|
|
|
|
|
+- `-o ./bin/01_hello/hello.exe` 指定输出文件的路径和名称。
|
|
|
|
|
+- `./lessons/01_hello` 指定要编译的例程目录。
|
|
|
|
|
+- `go run ./lessons/01_hello` 则是先编译再立即运行,不会在指定输出目录保留可执行文件,并不是解释执行。
|
|
|
|
|
+- 修改源码后,需要重新执行编译命令;已经生成的可执行文件不会自动变化。
|
|
|
|
|
+
|
|
|
|
|
+Go 与 C 类似,也有主函数入口:可执行程序使用 `package main`,并声明无参数、无返回值的 `func main()`。它不需要 C 中的 `return 0`,源码也不一定必须叫 `main.go`。详细示例和 C / Go 对照见 [第 01 课:主函数入口](./lessons/01_hello/README.md#go-也有-main-主函数吗)。
|
|
|
|
|
+
|
|
|
编译成功时通常没有额外输出。PowerShell 运行当前目录下的程序需要 `./` 或 `.\` 前缀,不能只输入 `hello.exe`。
|
|
编译成功时通常没有额外输出。PowerShell 运行当前目录下的程序需要 `./` 或 `.\` 前缀,不能只输入 `hello.exe`。
|
|
|
|
|
|
|
|
编译后的程序可以在兼容的 Windows 和 CPU 架构环境运行,一般不需要目标电脑安装 Go SDK。本项目没有 C 语言依赖。`bin` 已加入 Git 忽略规则,不提交可执行文件。
|
|
编译后的程序可以在兼容的 Windows 和 CPU 架构环境运行,一般不需要目标电脑安装 Go SDK。本项目没有 C 语言依赖。`bin` 已加入 Git 忽略规则,不提交可执行文件。
|
|
|
|
|
|
|
|
## 8. 在 VS Code 中调试
|
|
## 8. 在 VS Code 中调试
|
|
|
|
|
|
|
|
-1. 打开 `main.go`,在函数内的可执行语句左侧点击,添加断点。
|
|
|
|
|
|
|
+1. 打开 `lessons/01_hello/main.go`,在函数内的可执行语句左侧点击,添加断点。
|
|
|
2. 按 F5,如提示安装 Delve 则按提示安装。
|
|
2. 按 F5,如提示安装 Delve 则按提示安装。
|
|
|
-3. 如需选择调试配置,选择 Go 的当前包(Launch Package)模式。
|
|
|
|
|
|
|
+3. 如需选择调试配置,选择 Go 的当前包(Launch Package)模式,目标应是当前文件所在的例程目录(`${fileDirname}`),不是仓库根目录。
|
|
|
4. 用 F10 单步执行,观察变量 `a`、`b` 的值。
|
|
4. 用 F10 单步执行,观察变量 `a`、`b` 的值。
|
|
|
|
|
|
|
|
-优先先确认终端 `go run .` 能正常执行,再排查编辑器调试问题。不需要额外安装 Code Runner 扩展。
|
|
|
|
|
|
|
+优先先确认在根目录运行 `go run ./lessons/01_hello` 能正常执行,再排查编辑器调试问题。不需要额外安装 Code Runner 扩展。
|
|
|
|
|
|
|
|
## 9. 日常 Git 提交流程
|
|
## 9. 日常 Git 提交流程
|
|
|
|
|
|
|
@@ -173,7 +195,7 @@ go build -o ./bin/hello.exe .
|
|
|
```powershell
|
|
```powershell
|
|
|
git status
|
|
git status
|
|
|
git diff
|
|
git diff
|
|
|
-git add README.md INSTALL.md main.go main_test.go go.mod .gitignore
|
|
|
|
|
|
|
+git add -A -- README.md INSTALL.md lessons go.mod .gitignore
|
|
|
git commit -m "docs: update Go learning notes"
|
|
git commit -m "docs: update Go learning notes"
|
|
|
git push
|
|
git push
|
|
|
```
|
|
```
|