Go 中创建自定义包需遵循规范:以 module 为单位组织,用 go mod init 初始化,包名小写且与目录一致,导出标识符首字母大写,导入时用模块路径 + 子目录名。

在 Go 中创建自定义包是实现代码模块化和复用的核心方式。关键在于遵循 Go 的包管理规范:每个包对应一个目录,以 package 声明开头,导出标识符首字母大写,且需通过 go mod init 初始化模块。
准备项目结构与初始化模块
Go 推荐以模块(module)为单位组织代码。先新建项目目录,例如 myutils,然后在该目录下执行:
-
go mod init myutils—— 生成go.mod文件,声明模块路径 - 模块路径不一定是 URL,但建议使用有意义的名称(如公司 / 项目名),便于将来发布或引用
- 后续所有自定义包都应位于该模块根目录下或其子目录中
编写可导出的自定义包
在项目中新建子目录,例如 mathutil,并在其中创建 mathutil.go:
package mathutil // Add 返回两数之和(首字母大写表示导出)func Add(a, b int) int {return a + b} // Max 是未导出函数,仅在本包内可用 func max(a, b int) int {if a > b { return a} return b }
- 包名(
mathutil)通常小写、简洁,与目录名一致 - 只有首字母大写的函数、变量、类型才能被其他包访问
- 每个
.go文件顶部必须有package xxx声明,同目录下所有文件须属同一包
在主程序中导入并使用自定义包
在模块根目录下创建 main.go,导入本地包时使用模块路径 + 子目录名:
立即学习“go 语言免费学习笔记(深入)”;
package main import ("fmt" "myutils/mathutil" // 模块名 + 包目录名) func main() { result := mathutil.Add(3, 5) fmt.Println(result) // 输出:8 }
- 导入路径是逻辑路径,不是文件系统路径;它由
go.mod中的模块名决定 - 若模块名为
github.com/you/myutils,则导入应为github.com/you/myutils/mathutil - 运行
go run main.go会自动解析依赖并编译,无需额外配置
进阶:支持多平台或条件编译
可通过文件后缀或构建标签控制包行为。例如,为不同 操作系统 提供专用实现:
-
os_linux.go(含//go:build linux)和os_windows.go(含//go:build windows) - 同包内多个文件可分别实现相同接口,Go 编译器按构建约束自动选择
- 适合封装系统调用、路径处理等平台相关逻辑
不复杂但容易忽略:确保 GO111MODULE=on(现代 Go 默认开启),避免误入 GOPATH 模式导致导入失败。