Golang 从入门到放弃 -0x0A
package、module、go mod 和项目结构基础,开始把代码从单文件拆开。
前面几章我们一直在一个文件里折腾,是时候把视野拉大一点了。真正的 Go 项目不可能永远只有一个 main.go。这一章我们聊包、模块,以及项目该怎么别那么像一坨。
package 先认清
每个 Go 文件开头几乎都会先来一句 package xxx。它代表这个文件属于哪个包。
package mainpackage main 是一个特殊包,表示这是一个可执行程序的入口。里面如果再有一个 func main(),程序就能跑起来。
如果你写的是可复用的功能,就通常不会叫 main,而是按功能给个名字,比如 calc、utils、service。
拆一个最简单的包
比如我们有这样一个项目结构:
demo/
├── go.mod
├── main.go
└── calc/
└── add.gocalc/add.go:
package calc
func Add(a, b int) int {
return a + b
}main.go:
package main
import (
"demo/calc"
"fmt"
)
func main() {
fmt.Println(calc.Add(3, 5))
}注意那个大写的 Add。如果你把它写成小写 add,那就只能在 calc 包内部使用,包外看不到。这条规则我们在 0x04 提过一次,到这里就开始真正发挥作用了。
go mod 是什么
Go 现在的依赖管理核心就是 module。你可以理解成“这个项目自己的身份证加依赖清单”。初始化方式也很简单:
go mod init demo执行后会生成一个 go.mod 文件,里面至少会写明模块名和 Go 版本。
module demo
go 1.24.2模块名在本地玩具项目里随便一点问题不大,但一旦你准备把代码放到 GitHub 或公司仓库里,最好从一开始就按真实路径来,比如 github.com/yourname/demo。
导入第三方包
如果你用到了外部依赖,Go 会在你第一次构建时自动拉下来,前提是你的网络和代理别太折腾人。
import "github.com/google/uuid"写完以后跑一遍:
go mod tidy这个命令非常值得记住,它会帮你整理依赖,把该加的加上,该删的删掉。很多 Go 项目出问题,第一反应先来一发 go mod tidy,经常能少骂半小时街。
项目结构别一上来就过度设计
刚学 Go 时,很多人特别容易走两个极端:
- 所有代码全堆在
main.go里 - 刚写三百行,就拆出二十个目录,仿佛准备上市
我建议先克制一点。小项目结构简单些没问题,能看懂、能维护最重要。比如这样已经很够用了:
demo/
├── go.mod
├── main.go
├── handler/
├── service/
├── model/
└── config/等业务复杂了,再慢慢细分,不要为了“像大厂项目”而提前给自己制造阅读成本。
小结
这一章的关键词其实就三个:
package:组织代码。module:管理项目和依赖。go mod tidy:你未来会很常敲的一条命令。
下一章我们聊 JSON 和文件 I/O。到那时,代码就开始更像一个正常服务,而不只是控制台玩具了。