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实现了现代化的依赖管理; - • 模块支持版本控制与远程仓库,便于团队协作和持续集成。