Go语言从一开始就强调模块化和可重用性,**包(package)和模块(module)**是构建Go项目的核心。本章将带你深入了解这两个概念,并通过实际示例掌握它们的基本用法。
一、什么是包(Package)?
在Go中,每个 .go
文件都属于一个包。包是代码组织的最小单位,Go通过 import
引用其他包来实现代码复用。
包的命名规则:
- • 每个目录一个包;
- • 包名通常与目录名相同;
- • 主程序包必须命名为
main
,并包含main()
函数。
示例:自定义包
目录结构:
myproject/
├── main.go
└── mathutil/
└── add.go
add.go
:
package mathutil
func Add(a, b int) int {
return a + b
}
main.go
:
package main
import (
"fmt"
"myproject/mathutil"
)
func main() {
result := mathutil.Add(3, 5)
fmt.Println("Result:", result)
}
二、什么是模块(Module)?
模块是Go 1.11 引入的依赖管理机制,是一组相关包的集合。
初始化模块
在项目根目录执行:
go mod init myproject
会生成一个 go.mod
文件,记录模块名与依赖信息:
module myproject
go 1.21
模块特性:
- • 自动管理依赖版本;
- • 支持私有/远程仓库;
- • 无需设置
GOPATH
。
三、使用第三方模块
以引入 github.com/gin-gonic/gin
为例:
- 1. 导入模块:
import "github.com/gin-gonic/gin"
- 2. 执行:
go mod tidy
此命令会自动下载并写入 go.sum
(用于验证依赖的完整性)。
四、常用命令汇总
命令 | 说明 |
go mod init xxx | 初始化模块 |
go mod tidy | 自动整理/拉取依赖 |
go build | 编译模块 |
go run . | 运行整个模块目录 |
go list -m all | 查看所有依赖 |
go get 包路径 | 显式添加依赖(旧方式) |
五、工作示例
目录结构:
greetapp/
├── go.mod
├── main.go
└── greet/
└── hello.go
greet/hello.go
:
package greet
import "fmt"
func SayHello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
main.go
:
package main
import "greetapp/greet"
func main() {
greet.SayHello("Go开发者")
}
命令:
go mod init greetapp
go run .
输出:
Hello, Go开发者!
六、小结
- • 包是代码组织单位,负责功能划分;
- • 模块是项目与依赖管理单位,从根本上替代了旧的
GOPATH
; - • 使用
go.mod
+go.sum
,Go实现了现代化的依赖管理; - • 模块支持版本控制与远程仓库,便于团队协作和持续集成。