亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語(yǔ)言版本管理module以及go.sum詳解

 更新時(shí)間:2024年08月20日 10:00:48   作者:吃我一個(gè)平底鍋  
本文介紹了Go語(yǔ)言版本管理go module以及go.sum詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

為了確保一致性構(gòu)建,Go語(yǔ)言中引入了go.mod文件來(lái)標(biāo)記每個(gè)依賴包的版本,在構(gòu)建過程中g(shù)o命令會(huì)下載go.mod中的依賴包,下載的依賴包會(huì)緩存在本地,以便下次構(gòu)建。

在進(jìn)行g(shù)o語(yǔ)言項(xiàng)目開發(fā)的時(shí)候,會(huì)依賴3種類型的庫(kù)包:

  • 內(nèi)置的標(biāo)準(zhǔn)庫(kù)包,在goroot/src目錄下,也就是我們安裝目錄的src目錄下(類似于python的bin目錄)
  • 第三方庫(kù)包(git上開源的)
  • 項(xiàng)目中的庫(kù)包,也就是項(xiàng)目中的其他目錄。自己調(diào)用自己寫的函數(shù)方法

生成go.mod文件

確保go版本>=1.11

在項(xiàng)目的根目錄下,執(zhí)行go mod init xxxxxxxx為對(duì)應(yīng)的項(xiàng)目名稱。
例如:我們創(chuàng)建一個(gè)geecache的項(xiàng)目,在命令行執(zhí)行go mod init geecache

在這里插入圖片描述

此時(shí),項(xiàng)目目錄就產(chǎn)生了go.mod

在這里插入圖片描述

go.sum

為了解決Go module的這一安全隱患,Go開發(fā)團(tuán)隊(duì)在引入go.mod的同時(shí)也引入了go.sum文件,用于記錄每個(gè)依賴包的哈希值,在構(gòu)建時(shí),如果本地的依賴包hash值與go.sum文件中記錄得不一致,則會(huì)拒絕構(gòu)建。

  • 執(zhí)行go mod tidy命令,會(huì)生成go.sum文件

在這里插入圖片描述

在這里插入圖片描述

go.sum文件詳解

go.sum文件中每行記錄由module 名, 版本和哈希組成,并由空格分開,格式如下:

<module> <version>[/go.mod] <hash>

例如:上述go.sum中就記錄了github.com/golang/protobuf這個(gè)依賴v1.3.3版本的哈希值:

github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=

通常,每個(gè)依賴包版本會(huì)包含兩條記錄:

  • 第一條為該依賴包版本整體(所有文件)的哈希值,
  • 第二條僅表示該依賴包版本中go.mod文件的哈希值
    如果該依賴包版本沒有go.mod文件,則只有第一條記錄。如上面的例子中,v1.3.3 表示該依賴包版本整體,而v1.3.3/go.mod表示該依賴包版本中g(shù)o.mod文件。

依賴包版本中任何一個(gè)文件(包括go.mod)改動(dòng),都會(huì)改變其整體哈希值,此處再 **額外記錄依賴包版本 **的go.mod文件主要用于計(jì)算依賴樹時(shí)不必下載完整的依賴包版本,只根據(jù)go.mod即可計(jì)算依賴樹。go.mod只需要記錄直接依賴的依賴包版本,只在依賴包版本不包含go.mod文件時(shí)候才會(huì)記錄間接依賴包版本。而go.sum則是要記錄構(gòu)建用到的所有依賴包版本。

校驗(yàn)

假設(shè)我們拿到某項(xiàng)目的源代碼并嘗試在本地構(gòu)建,go命令會(huì)從本地緩存中查找所有go.mod中記錄的依賴包,并計(jì)算本地依賴包的哈希值,然后與go.sum中的記錄進(jìn)行對(duì)比,即檢測(cè)本地緩存中使用的依賴包版本是否滿足項(xiàng)目go.sum文件的期望。

如果校驗(yàn)失敗,說(shuō)明本地緩存目錄中依賴包版本的哈希值和項(xiàng)目中go.sum中記錄的哈希值不一致,go命令將拒絕構(gòu)建。 這就是go.sum存在的意義,即如果不使用我期望的版本,就不能構(gòu)建。

當(dāng)校驗(yàn)失敗時(shí),有必要確認(rèn)到底是本地緩存錯(cuò)了,還是go.sum記錄錯(cuò)了。 需要說(shuō)明的是,二者都可能出錯(cuò),本地緩存目錄中的依賴包版本有可能被有意或無(wú)意地修改過,項(xiàng)目中go.sum中記錄的哈希值也可能被篡改過。

當(dāng)校驗(yàn)失敗時(shí),go命令傾向于相信go.sum,因?yàn)橐粋€(gè)新的依賴包版本在被添加到go.sum前是經(jīng)過GOSUMDB(校驗(yàn)和數(shù)據(jù)庫(kù))驗(yàn)證過的。此時(shí)即便系統(tǒng)中配置了GOSUMDB(校驗(yàn)和數(shù)據(jù)庫(kù)),go命令也不會(huì)查詢?cè)摂?shù)據(jù)庫(kù)。

校驗(yàn)和數(shù)據(jù)庫(kù)

環(huán)境變量GOSUMDB標(biāo)識(shí)一個(gè)checksum database,即校驗(yàn)和數(shù)據(jù)庫(kù),實(shí)際上是一個(gè)web服務(wù)器,該服務(wù)器提供查詢依賴包版本哈希值的服務(wù)。

該數(shù)據(jù)庫(kù)中記錄了很多依賴包版本的哈希值,比如Google官方的sum.golang.org則記錄了所有的可公開獲得的依賴包版本。除了使用官方的數(shù)據(jù)庫(kù),還可以指定自行搭建的數(shù)據(jù)庫(kù),甚至干脆禁用它(export GOSUMDB=off)。

如果系統(tǒng)配置了GOSUMDB,在依賴包版本被寫入go.sum之前會(huì)向該數(shù)據(jù)庫(kù)查詢?cè)撘蕾嚢姹镜墓V颠M(jìn)行二次校驗(yàn),校驗(yàn)無(wú)誤后再寫入go.sum。

如果系統(tǒng)禁用了GOSUMDB,在依賴包版本被寫入go.sum之前則不會(huì)進(jìn)行二次校驗(yàn),go命令會(huì)相信所有下載到的依賴包,并把其哈希值記錄到go.sum中。

到此這篇關(guān)于Go語(yǔ)言版本管理go module以及go.sum詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 go module go.sum內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang拼接字符串的5種實(shí)現(xiàn)方式

    golang拼接字符串的5種實(shí)現(xiàn)方式

    文章總結(jié)了五種拼接字符串的方式,包括使用 "+"、strings.Join()、fmt.Sprint、bytes.Buffer 和 strings.Builder,每種方式都有其適用場(chǎng)景和性能特點(diǎn)
    2024-12-12
  • Go使用TimerController解決timer過多的問題

    Go使用TimerController解決timer過多的問題

    多路復(fù)用,實(shí)際上Go底層也是一種多路復(fù)用的思想去實(shí)現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下
    2024-12-12
  • 使用Go語(yǔ)言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解

    使用Go語(yǔ)言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解

    在這篇文章中,我們將介紹如何使用Go語(yǔ)言編寫代碼來(lái)實(shí)現(xiàn)Yaml編碼和解碼,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解

    Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解

    限流器是后臺(tái)服務(wù)中十分重要的組件,在實(shí)際的業(yè)務(wù)場(chǎng)景中使用居多。time/rate?包基于令牌桶算法實(shí)現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實(shí)現(xiàn),需要的可以參考一下
    2023-04-04
  • Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例

    Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Go如何在HTTP請(qǐng)求中操作cookie教程詳解

    Go如何在HTTP請(qǐng)求中操作cookie教程詳解

    這篇文章主要為大家介紹了Go如何在HTTP請(qǐng)求中操作cookie教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語(yǔ)言等待組sync.WaitGrou的使用示例

    Go語(yǔ)言等待組sync.WaitGrou的使用示例

    本文主要介紹了Go語(yǔ)言等待組sync.WaitGrou的使用示例,sync.WaitGroup只有3個(gè)方法,Add(),Done(),Wait(),下面就來(lái)具體的介紹一下如何使用,感興趣的可以了解一下
    2024-08-08
  • Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼

    Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼

    本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang 40行代碼實(shí)現(xiàn)通用協(xié)程池

    golang 40行代碼實(shí)現(xiàn)通用協(xié)程池

    golang協(xié)程機(jī)制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當(dāng)限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實(shí)現(xiàn)通用協(xié)程池,需要的朋友可以參考下
    2018-08-08
  • 利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解

    利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解

    公司中遇到了一個(gè)使用golang編寫的agent程序,所以這篇文章主要給大家介紹了關(guān)于利用Go如何實(shí)現(xiàn)TCP連接的雙向拷貝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考,下面隨著小編來(lái)一起看看吧。
    2017-09-09

最新評(píng)論