README.md 4.2 KB

第 01 课:第一个 Go 程序

学习目标

先跑通程序,再初步认识入口函数、标准输出、变量和函数。测试代码作为配套示范,不要求第一遍就掌握表驱动测试。

本课文件

  • main.go:本课程序入口和 Sum 加法函数。
  • main_test.go:验证加法函数的 4 组测试。

本课与其他例程相互独立,共享仓库根目录的 go.mod,不要在这里再次执行 go mod init。

运行方法

方式一:在仓库根目录执行:

go run ./lessons/01_hello

方式二:从仓库根目录进入本课,再运行:

Set-Location lessons/01_hello
go run .

两种方式输出相同:

你好,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 函数进入主要逻辑:

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,先理解主函数入口即可。

本课测试

在仓库根目录执行:

go test -v ./lessons/01_hello

如果终端已经在本课目录,执行:

go test -v .

测试覆盖正数、零、负数、正负混合相加。_test.go 文件不会进入正常的可执行程序。

编译与运行的区别

编译指令是 go build。以下命令在仓库根目录执行:

# 创建输出目录,第一次编译时执行,重复执行也可以
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 执行本地文件需要路径前缀。

如果只想快速运行,不需要保留可执行文件:

go run ./lessons/01_hello

go run 也是先编译再运行,不是解释执行;go build 则把可执行文件保留在指定位置,之后可以多次直接启动。编译后修改源码,需要重新编译,已有的可执行文件不会自动更新。

动手练习

  • 成功运行程序。
  • 把欢迎语修改成自己的文字并再次运行。
  • 修改 a、b 的值,观察计算结果。
  • 运行测试,确认所有用例通过。
  • 尝试解释 main 与 Sum 两个函数各自的作用。

完成后再新增第 02 课目录;不要把下一课代码堆进本课。环境安装和公共教程见 安装与运行教程,课程目录见 学习总览。