眾所周知——“包”治百病。
理解包與模塊,是 Go 邁向工程化開發的關鍵一環!
📂 一、包(Package)是 Go 的基本組織單位
在 Go 中,每個 .go
文件都屬于某個包(package):
package main
- 一個包由一個或多個
.go
文件組成 - 包名決定該文件屬于哪個邏輯單元
- 主程序必須是
main
包,且包含main()
函數
自定義包示例:
package utilsfunc Add(a, b int) int {return a + b
}
📌 小貼士:
- 文件夾名不等于包名,但通常建議保持一致
- 例如:
utils/add.go
中使用package utils
📦 二、模塊(Module)是項目的根目錄單位
Go 1.11 引入 go module(現代 Go 的項目管理方式)
初始化模塊:
go mod init github.com/yourname/hellogo
會生成 go.mod
文件,內容大致如下:
module github.com/yourname/hellogogo 1.20
從此你的 Go 項目脫離 GOPATH 束縛,正式進入“模塊自由”時代!
🔧 三、導入標準包 & 第三方包
導入標準庫非常簡單:
import ("fmt""math"
)
使用第三方包(比如 Gin):
go get github.com/gin-gonic/gin
go.mod
會自動加入依賴記錄:
require github.com/gin-gonic/gin v1.9.0
🧠 同時生成/更新 go.sum
文件用于校驗包完整性,保障供應鏈安全。
🛠? 四、自定義包的使用
項目結構示例:
myapp/
├── go.mod
├── main.go
└── utils/└── calc.go
utils/calc.go:
package utilsfunc Add(x, y int) int {return x + y
}
main.go:
package mainimport ("fmt""myapp/utils"
)func main() {fmt.Println(utils.Add(2, 3))
}
?? 模塊名與包路徑需匹配,否則導入失敗!
🗃? 五、推薦的項目結構(中型項目)
myapp/
├── cmd/ # 主程序入口(main.go)
├── pkg/ # 可復用公共包
├── internal/ # 內部包(只能被當前 module 引用)
├── api/ # 接口定義結構體
├── configs/ # 配置文件
├── go.mod
└── README.md
📌 internal
是 Go 的“私有訪問控制機制”:
- internal 下的包只能被本模塊代碼引用
- 防止被外部誤用,提高安全性和封裝性
🔁 六、常用 go 命令回顧
命令 | 說明 |
---|---|
go mod init | 初始化模塊 |
go get | 安裝依賴包 |
go build | 構建編譯 |
go run | 編譯 + 運行 |
go fmt | 格式化所有 Go 文件 |
go clean | 清除構建緩存 |
go test | 執行測試函數(_test.go) |
go mod tidy | 清理無效依賴、補全缺失模塊 |
🧠 總結
- ? 包(package) 是最小邏輯單位,決定代碼歸屬
- ? 模塊(module) 是工程管理單位,通過
go.mod
管理依賴 - ?
go get
、go mod tidy
、internal
等機制,保證模塊解耦、依賴清晰 - ? 包和模塊是 Go 工程化開發的起點,是你走向架構師之路的第一步!
🧪 推薦練習
- ? 寫一個
utils
包,封裝Add
,Sub
函數 - ? 在
main.go
中引用它,組織模塊結構 - ? 修改
go.mod
,改為 GitHub 上實際地址后發布
🏁 下一篇預告
👉 Go語言-初學者日記(五):文件操作與 JSON 實戰,打造實用命令行工具!