学习了基础语法后,是时候动手写一个完整的项目了。本章将从零开始构建一个简单的 CLI 工具(简易计算器),重点讲解 Go Modules 依赖管理和标准的 项目目录结构

1. 初始化项目

首先,创建一个文件夹并初始化 Go Module。go mod 是 Go 官方的依赖管理工具。

mkdir my-calc
cd my-calc
# 初始化模块,模块名为 example.com/calc
go mod init example.com/calc

执行后会生成一个 go.mod 文件,它声明了模块名称和 Go 版本。

2. 项目结构

虽然 Go 对目录结构没有强制要求,但社区约定俗成的标准布局(Standard Layout)如下:

my-calc/
├── go.mod        // 模块定义
├── main.go       // 程序入口
└── pkg/          // 库代码目录
    └── mathop/   // 子包:数学操作
        └── add.go

3. 编写代码

编写子包逻辑

pkg/mathop/add.go 中编写核心业务逻辑:

package mathop

// Add 函数首字母大写,表示是可以导出的(Public)
func Add(a, b int) int {
    return a + b
}

编写入口函数

在根目录 main.go 中调用我们的子包:

package main

import (
    "fmt"
    "os"
    "strconv"

    // 导入刚才定义的包
    "example.com/calc/pkg/mathop"
)

func main() {
    // 读取命令行参数
    if len(os.Args) < 3 {
        fmt.Println("Usage: calc <num1> <num2>")
        return
    }

    // 解析参数
    a, _ := strconv.Atoi(os.Args[1])
    b, _ := strconv.Atoi(os.Args[2])

    // 调用业务逻辑
    sum := mathop.Add(a, b)
    fmt.Printf("%d + %d = %d\n", a, b, sum)
}

4. 运行与构建

开发阶段运行

$ go run main.go 10 20
10 + 20 = 30

编译构建

# 构建生成可执行文件
$ go build -o calc

# 运行二进制文件
$ ./calc 50 50
50 + 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),让输出的结果带有颜色。


相关阅读