# 第 01 课:第一个 Go 程序 ## 学习目标 先跑通程序,再初步认识入口函数、标准输出、变量和函数。测试代码作为配套示范,不要求第一遍就掌握表驱动测试。 ## 本课文件 - [main.go](./main.go):本课程序入口和 `Sum` 加法函数。 - [main_test.go](./main_test.go):验证加法函数的 4 组测试。 本课与其他例程相互独立,共享仓库根目录的 `go.mod`,不要在这里再次执行 `go mod init`。 ## 运行方法 方式一:在仓库根目录执行: ```powershell go run ./lessons/01_hello ``` 方式二:从仓库根目录进入本课,再运行: ```powershell Set-Location lessons/01_hello go run . ``` 两种方式输出相同: ```text 你好,Go! 欢迎开始 Go 语言学习与测试。 2 + 3 = 5 ``` ## 阅读顺序 1. `package main`:声明这是可执行程序所在的包。 2. `import "fmt"`:引入标准库中的格式化输出包,不需要额外安装。 3. `func main()`:程序启动入口。 4. `fmt.Println`:输出一行文字。 5. `a, b := 2, 3`:声明并初始化两个整数变量。 6. `Sum(a, b)`:调用自定义函数并获得返回值。 7. `fmt.Printf`:按格式输出,`%d` 代表整数,`\n` 代表换行。 ## Go 也有 main 主函数吗? 有,和 C 类似,Go 可执行程序也通过 `main` 函数进入主要逻辑: ```go package main // 可执行程序必须属于 main 包 import "fmt" func main() { // 主函数入口 fmt.Println("你好,Go!") } ``` | 对比项 | C | Go | | --- | --- | --- | | 常见入口声明 | `int main(void)` | `func main()` | | 入口返回值 | 返回整数退出码,通常写 `return 0;` | 不声明返回值,不需要 `return 0` | | 标准输出 | `printf(...)` | `fmt.Printf(...)` 或 `fmt.Println(...)` | 注意: - 可执行程序需要 `package main` 和包级 `func main()`,入口不由文件名决定;源码不一定必须叫 `main.go`。 - 同一个例程所在的包只能有一个包级 `main` 函数,不同目录的例程可以各有自己的 `main`。 - `main` 不接收参数,也没有返回值。命令行参数可通过标准库 `os.Args` 获取;需要指定退出码时可使用 `os.Exit`,后续课程再学习。 - 更准确地说,Go 会先完成包级变量初始化和 `init` 函数执行,再调用 `main`;当前课程没有自定义 `init`,先理解主函数入口即可。 ## 本课测试 在仓库根目录执行: ```powershell go test -v ./lessons/01_hello ``` 如果终端已经在本课目录,执行: ```powershell go test -v . ``` 测试覆盖正数、零、负数、正负混合相加。`_test.go` 文件不会进入正常的可执行程序。 ## 编译与运行的区别 编译指令是 **`go build`**。以下命令在仓库根目录执行: ```powershell # 创建输出目录,第一次编译时执行,重复执行也可以 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 build`:编译程序。 - `-o ./bin/01_hello/hello.exe`:指定生成的可执行文件路径和名称。 - `./lessons/01_hello`:要编译的例程目录,编译的是本课的包,不是其他课程。 - `.\bin\01_hello\hello.exe`:启动生成的程序;PowerShell 执行本地文件需要路径前缀。 如果只想快速运行,不需要保留可执行文件: ```powershell go run ./lessons/01_hello ``` `go run` 也是**先编译再运行**,不是解释执行;`go build` 则把可执行文件保留在指定位置,之后可以多次直接启动。编译后修改源码,需要重新编译,已有的可执行文件不会自动更新。 ## 动手练习 - [ ] 成功运行程序。 - [ ] 把欢迎语修改成自己的文字并再次运行。 - [ ] 修改 `a`、`b` 的值,观察计算结果。 - [ ] 运行测试,确认所有用例通过。 - [ ] 尝试解释 `main` 与 `Sum` 两个函数各自的作用。 完成后再新增第 02 课目录;不要把下一课代码堆进本课。环境安装和公共教程见 [安装与运行教程](../../INSTALL.md),课程目录见 [学习总览](../../README.md)。