学习了基础语法后,是时候动手写一个完整的项目了。本章将从零开始构建一个简单的 CLI 工具(简易计算器),重点讲解 Go Modules 依赖管理和标准的 项目目录结构。
1. 初始化项目
首先,创建一个文件夹并初始化 Go Module。go mod 是 Go 官方的依赖管理工具。
1mkdir my-calc
2cd my-calc
3# 初始化模块,模块名为 example.com/calc
4go mod init example.com/calc
执行后会生成一个 go.mod 文件,它声明了模块名称和 Go 版本。
2. 项目结构
虽然 Go 对目录结构没有强制要求,但社区约定俗成的标准布局(Standard Layout)如下:
1my-calc/
2├── go.mod // 模块定义
3├── main.go // 程序入口
4└── pkg/ // 库代码目录
5 └── mathop/ // 子包:数学操作
6 └── add.go
3. 编写代码
编写子包逻辑
在 pkg/mathop/add.go 中编写核心业务逻辑:
1package mathop
2
3// Add 函数首字母大写,表示是可以导出的(Public)
4func Add(a, b int) int {
5 return a + b
6}
编写入口函数
在根目录 main.go 中调用我们的子包:
1package main
2
3import (
4 "fmt"
5 "os"
6 "strconv"
7
8 // 导入刚才定义的包
9 "example.com/calc/pkg/mathop"
10)
11
12func main() {
13 // 读取命令行参数
14 if len(os.Args) < 3 {
15 fmt.Println("Usage: calc <num1> <num2>")
16 return
17 }
18
19 // 解析参数
20 a, _ := strconv.Atoi(os.Args[1])
21 b, _ := strconv.Atoi(os.Args[2])
22
23 // 调用业务逻辑
24 sum := mathop.Add(a, b)
25 fmt.Printf("%d + %d = %d\n", a, b, sum)
26}
4. 运行与构建
开发阶段运行
1$ go run main.go 10 20
210 + 20 = 30
编译构建
1# 构建生成可执行文件
2$ go build -o calc
3
4# 运行二进制文件
5$ ./calc 50 50
650 + 50 = 100
关键点解释
- go.mod:任何 Go 项目的起点。如果需要引用第三方库(如 GitHub 上的库),使用
go get命令会自动更新此文件。 - 包可见性:只有 首字母大写 的函数、变量、结构体才能被其他包访问(Public),小写则为包私有(Private)。
- 交叉编译:Go 的一大杀手锏。在 Mac 上编译 Linux 程序只需:
GOOS=linux go build。
小结
一个标准的 Go 项目包含 go.mod 管理依赖,清晰的目录结构分离 main 入口和业务逻辑。掌握这些,你就可以开始构建复杂的应用了。
练习题
- 扩展此项目,添加一个
Subtract函数支持减法。 - 尝试引入一个第三方库(如
github.com/fatih/color),让输出的结果带有颜色。