一文詳解go.mod與go.sum有什么區(qū)別
前言
這是 Go 模塊機(jī)制里最基礎(chǔ)、也最容易被誤解的一組文件。
我用 一句話 + 對照表 + 實(shí)際場景,把 go.mod 和 go.sum 講透。
一句話先記住
go.mod 負(fù)責(zé)“聲明我要用什么”
go.sum 負(fù)責(zé)“證明我用的就是它”
go.mod 是什么?
go.mod 是 模塊的“需求說明書”。
它告訴 Go 工具鏈三件事:
- 這個(gè)項(xiàng)目是誰
- 依賴哪些模塊
- 用哪些版本規(guī)則
示例 go.mod
module github.com/example/myapp
go 1.22
require (
github.com/gin-gonic/gin v1.9.1
go.uber.org/zap v1.27.0
)
go.mod 的核心作用
| 作用 | 說明 |
|---|---|
| 模塊名 | module 路徑 |
| Go 版本 | 編譯語義 |
| 直接依賴 | require |
| 替換規(guī)則 | replace |
| 版本收斂 | indirect |
?? go.mod 決定“依賴關(guān)系圖”
go.sum 是什么?
go.sum 是 依賴完整性的“校驗(yàn)賬本”。
它記錄的是:
某個(gè)模塊的某個(gè)版本,對應(yīng)的內(nèi)容哈希
示例 go.sum
github.com/gin-gonic/gin v1.9.1 h1:abcd... github.com/gin-gonic/gin v1.9.1/go.mod h1:efgh...
go.sum 的核心作用
| 作用 | 說明 |
|---|---|
| 校驗(yàn)完整性 | 防止依賴被篡改 |
| 可復(fù)現(xiàn)構(gòu)建 | 每個(gè)人拉到的內(nèi)容一致 |
| 安全 | 防供應(yīng)鏈攻擊 |
?? go.sum 決定“內(nèi)容是不是同一個(gè)”
二者的本質(zhì)區(qū)別(重點(diǎn))
| 對比點(diǎn) | go.mod | go.sum |
|---|---|---|
| 關(guān)注點(diǎn) | 依賴關(guān)系 | 依賴內(nèi)容 |
| 是否聲明依賴 | ? | ? |
| 是否參與校驗(yàn) | ? | ? |
| 是否可手寫 | 可以 | 不建議 |
| 是否必須提交 | ? | ? |
一個(gè)真實(shí)的工作流(非常重要)
寫代碼 / 加依賴
go get github.com/gin-gonic/gin
?? Go 會自動(dòng):
- 修改
go.mod - 更新
go.sum
構(gòu)建 / CI
go build
Go 會:
- 按
go.mod決定要拉哪些模塊 - 按
go.sum校驗(yàn)?zāi)K內(nèi)容 - 校驗(yàn)失敗 → 直接報(bào)錯(cuò)
為什么不能刪 go.sum?
很多人問:
“我能不能刪 go.sum,讓它重新生成?”
? 生產(chǎn)項(xiàng)目不應(yīng)該這么做
原因:
- go.sum 是安全邊界
- 刪了 = 放棄內(nèi)容一致性
- CI/CD 可能直接失敗
- 離線構(gòu)建直接崩
常見誤區(qū)(你可能踩過)
誤區(qū) 1:只提交 go.mod
構(gòu)建成功(我機(jī)器) CI 失敗(別人機(jī)器)
?? 因?yàn)?依賴內(nèi)容不一致
誤區(qū) 2:手改 go.sum
go.sum 是 機(jī)器生成文件
你手改它 ≈ 手改校驗(yàn)和,毫無意義
誤區(qū) 3:go.sum 里有沒用到的依賴
這是 正?,F(xiàn)象:
- go.sum 記錄的是 歷史依賴校驗(yàn)
- 即使 go.mod 不再 require
- 只要構(gòu)建路徑出現(xiàn)過,就可能保留
一個(gè)非常形象的類比(最好記)
| 文件 | 類比 |
|---|---|
| go.mod | 購物清單 |
| go.sum | 收據(jù) + 防偽碼 |
- go.mod:我要買什么
- go.sum:我買到的確實(shí)是這件商品
在你這種工程場景里的實(shí)際建議
結(jié)合你做 Kubernetes / 平臺 / Operator / Helm 的背景:
- ? go.mod + go.sum 必須一起提交
- ? 離線環(huán)境尤為重要
- ? 構(gòu)建失敗先看 go.sum 校驗(yàn)
- ? 不要忽略 indirect 依賴
一句工程師級總結(jié)
go.mod 解決“依賴關(guān)系”問題
go.sum 解決“依賴可信與可復(fù)現(xiàn)”問題
到此這篇關(guān)于一文詳解go.mod與go.sum有什么區(qū)別的文章就介紹到這了,更多相關(guān)go.mod與go.sum區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go標(biāo)準(zhǔn)庫bytes|strings使用解析
本文介紹了Go語言中`strings`和`bytes`庫的基本功能、設(shè)計(jì)思想、核心函數(shù)以及應(yīng)用場景,這兩個(gè)庫提供了豐富的工具函數(shù)來處理字符串和字節(jié)切片,適用于各種字符串操作需求,通過對比兩者的性能和適用場景,可以幫助開發(fā)者更好地選擇合適的工具庫來提高代碼效率和性能2026-01-01
goland Duration 和time的區(qū)別說明
這篇文章主要介紹了goland Duration 和time的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
golang?gorm實(shí)現(xiàn)get請求查詢案例測試
這篇文章主要為大家介紹了golang?gorm實(shí)現(xiàn)get請求查詢案例測試,2022-04-04
深度剖析Golang如何實(shí)現(xiàn)GC掃描對象
這篇文章主要為大家詳細(xì)介紹了Golang是如何實(shí)現(xiàn)GC掃描對象的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-03-03
wind10 idea中 go 開發(fā)環(huán)境搭建教程圖解
這篇文章主要介紹了wind10 idea中 go 開發(fā)環(huán)境搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
詳解Go語言如何對數(shù)據(jù)庫進(jìn)行CRUD操作
在這篇文章中,主要帶大家來學(xué)習(xí)一下在Go語言中如何對數(shù)據(jù)庫進(jìn)行CRUD操作,從而探討一下Go的接口編程,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05

