学习了基础语法后,是时候动手写一个完整的项目了。本章将从零开始构建一个简单的 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 入口和业务逻辑。掌握这些,你就可以开始构建复杂的应用了。

练习题

  1. 扩展此项目,添加一个 Subtract 函数支持减法。
  2. 尝试引入一个第三方库(如 github.com/fatih/color),让输出的结果带有颜色。

相关阅读