最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中的go.mod使用詳解

 更新時(shí)間:2023年12月28日 16:39:08   作者:SanfordZhu  
這篇文章主要介紹了Go中的go.mod使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

什么是go.mod?

Go.mod是Golang1.11版本新引入的官方包管理工具用于解決之前沒有地方記錄依賴包具體版本的問題,方便依賴包的管理。

Go.mod其實(shí)就是一個(gè)Modules,關(guān)于Modules的官方定義為:

Modules是相關(guān)Go包的集合,是源代碼交換和版本控制的單元。go命令直接支持使用Modules,包括記錄和解析對(duì)其他模塊的依賴性。Modules替換舊的基于GOPATH的方法,來指定使用哪些源文件。

Modules和傳統(tǒng)的GOPATH不同,不需要包含例如src,bin這樣的子目錄,一個(gè)源代碼目錄甚至是空目錄都可以作為Modules,只要其中包含有g(shù)o.mod文件。

如何使用go.mod?

1.首先將go的版本升級(jí)為1.11以上

2.設(shè)置GO111MODULE

GO111MODULE

GO111MODULE有三個(gè)值:offonauto(默認(rèn)值)。

GO111MODULE=off,go命令行將不會(huì)支持module功能,尋找依賴包的方式將會(huì)沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。

GO111MODULE=on,go命令行會(huì)使用modules,而一點(diǎn)也不會(huì)去GOPATH目錄下查找。

GO111MODULE=auto,默認(rèn)值,go命令行將會(huì)根據(jù)當(dāng)前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:

  • 當(dāng)前目錄在GOPATH/src之外且該目錄包含go.mod文件
  • 當(dāng)前文件在包含go.mod文件的目錄下面。

go mod命令

golang 提供了 go mod命令來管理包。

go mod 有以下命令:

go.mod如何在項(xiàng)目中使用?

1.首先我們要在GOPATH/src 目錄之外新建工程,或?qū)⒗瞎こ蘡opy到GOPATH/src 目錄之外。

PS:go.mod文件一旦創(chuàng)建后,它的內(nèi)容將會(huì)被go toolchain全面掌控。

go toolchain會(huì)在各類命令執(zhí)行時(shí),比如go get、go build、go mod等修改和維護(hù)go.mod文件。

go.mod 文件內(nèi)提供了modulerequirereplaceexclude四個(gè)關(guān)鍵字,這里注意區(qū)分與上表中命令的區(qū)別,一個(gè)是管理go mod命令,一個(gè)是go mod文件內(nèi)的關(guān)鍵字。

  • module語句指定包的名字(路徑)
  • require語句指定的依賴項(xiàng)模塊
  • replace語句可以替換依賴項(xiàng)模塊
  • exclude語句可以忽略依賴項(xiàng)模塊

下面是我們建立了一個(gè)hello.go的文件

package main
 
import (
	"fmt"
)
 
func main() {
    fmt.Println("Hello, world!")
}

2.在當(dāng)前目錄下,命令行運(yùn)行 go mod init + 模塊名稱 初始化模塊

即go mod init hello

運(yùn)行完之后,會(huì)在當(dāng)前目錄下生成一個(gè)go.mod文件,這是一個(gè)關(guān)鍵文件,之后的包的管理都是通過這個(gè)文件管理。

官方說明:除了go.mod之外,go命令還維護(hù)一個(gè)名為go.sum的文件,其中包含特定模塊版本內(nèi)容的預(yù)期加密哈希 

go命令使用go.sum文件確保這些模塊的未來下載檢索與第一次下載相同的位,以確保項(xiàng)目所依賴的模塊不會(huì)出現(xiàn)意外更改,無論是出于惡意、意外還是其他原因。 go.mod和go.sum都應(yīng)檢入版本控制。 

go.sum 不需要手工維護(hù),所以可以不用太關(guān)注。

注意:子目錄里是不需要init的,所有的子目錄里的依賴都會(huì)組織在根目錄的go.mod文件里

接下來,讓我們的項(xiàng)目依稀一下第三方包

如修改hello.go文件如下,按照過去的做法,要運(yùn)行hello.go需要執(zhí)行go get 命令 下載gorose包到 $GOPATH/src

package main
 
import (
	"fmt"
	"github.com/gohouse/gorose"
)
 
func main() {
    fmt.Println("Hello, world!")
}

但是,使用了新的包管理就不在需要這樣做了

直接 go run hello.go

稍等片刻… go 會(huì)自動(dòng)查找代碼中的包,下載依賴包,并且把具體的依賴關(guān)系和版本寫入到go.mod和go.sum文件中。

查看go.mod,它會(huì)變成這樣:

module test
 
require (
	github.com/gohouse/gorose v1.0.5
)

require 關(guān)鍵字是引用,后面是包,最后v1.11.1 是引用的版本號(hào)

這樣,一個(gè)使用Go包管理方式創(chuàng)建項(xiàng)目的小例子就完成了。

問題一

依賴的包下載到哪里了?還在GOPATH/src里嗎?

不在。

使用Go的包管理方式,依賴的第三方包被下載到了$GOPATH/pkg/mod路徑下。

問題二

依賴包的版本是怎么控制的?

在上一個(gè)問題里,可以看到最終下載在$GOPATH/pkg/mod 下的包中最后會(huì)有一個(gè)版本號(hào) v1.0.5,也就是說,$GOPATH/pkg/mod里可以保存相同包的不同版本。

版本是在go.mod中指定的。如果,在go.mod中沒有指定,go命令會(huì)自動(dòng)下載代碼中的依賴的最新版本,本例就是自動(dòng)下載最新的版本。

如果,在go.mod用require語句指定包和版本 ,go命令會(huì)根據(jù)指定的路徑和版本下載包,

指定版本時(shí)可以用latest,這樣它會(huì)自動(dòng)下載指定包的最新版本;

問題三 

可以把項(xiàng)目放在$GOPATH/src下嗎?

可以。

但是go會(huì)根據(jù)GO111MODULE的值而采取不同的處理方式,默認(rèn)情況下,GO111MODULE=auto 自動(dòng)模式

1.auto 自動(dòng)模式下,項(xiàng)目在$GOPATH/src里會(huì)使用$GOPATH/src的依賴包,在$GOPATH/src外,就使用go.mod 里 require的包

2.on 開啟模式,1.12后,無論在$GOPATH/src里還是在外面,都會(huì)使用go.mod 里 require的包

3.off 關(guān)閉模式,就是老規(guī)矩。

問題四 

依賴包中的地址失效了怎么辦?比如 golang.org/x/… 下的包都無法下載怎么辦?

在go快速發(fā)展的過程中,有一些依賴包地址變更了。以前的做法:

1.修改源碼,用新路徑替換import的地址

2.git clone 或 go get 新包后,copy到$GOPATH/src里舊的路徑下

無論什么方法,都不便于維護(hù),特別是多人協(xié)同開發(fā)時(shí)。

使用go.mod就簡(jiǎn)單了,在go.mod文件里用 replace 替換包,例如

replace golang.org/x/text => github.com/golang/text latest

這樣,go會(huì)用 github.com/golang/text 替代golang.org/x/text,原理就是下載github.com/golang/text 的最新版本到 $GOPATH/pkg/mod/golang.org/x/text下。

問題五 

init生成的go.mod的模塊名稱有什么用?

本例里,用 go mod init hello 生成的go.mod文件里的第一行會(huì)申明module hello

因?yàn)槲覀兊捻?xiàng)目已經(jīng)不在$GOPATH/src里了,那么引用自己怎么辦?就用模塊名+路徑。

例如,在項(xiàng)目下新建目錄 utils,創(chuàng)建一個(gè)tools.go文件:

package utils
 
import “fmt”
 
func PrintText(text string) {
    fmt.Println(text)
}

在根目錄下的hello.go文件就可以 import “hello/utils” 引用utils

package main
 
import (
	"hello/utils"
	"github.com/astaxie/beego"
)
 
func main() {
	utils.PrintText("Hi")
	beego.Run()
}

問題六

以前老項(xiàng)目如何用新的包管理 

  • 如果用auto模式,把項(xiàng)目移動(dòng)到$GOPATH/src
  • 進(jìn)入目錄,運(yùn)行 go mod init + 模塊名稱
  • go build 或者 go run 一次

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • go中使用curl實(shí)現(xiàn)https請(qǐng)求的示例代碼

    go中使用curl實(shí)現(xiàn)https請(qǐng)求的示例代碼

    本文主要介紹了go中使用curl實(shí)現(xiàn)https請(qǐng)求的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • go值賦值和引用賦值的使用

    go值賦值和引用賦值的使用

    本文將介紹Go語言中的值賦值和引用賦值,并比較它們之間的差異,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析

    Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析

    這篇文章主要為大家介紹了Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go語言單元測(cè)試基準(zhǔn)測(cè)試及表驅(qū)動(dòng)測(cè)試示例詳解

    go語言單元測(cè)試基準(zhǔn)測(cè)試及表驅(qū)動(dòng)測(cè)試示例詳解

    這篇文章主要為大家介紹了go語言單元測(cè)試基準(zhǔn)測(cè)試及表驅(qū)動(dòng)測(cè)試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • go語言中的log 包示例詳解

    go語言中的log 包示例詳解

    Go語言的log包提供了用于記錄日志的基本功能,相比fmt包,增加了時(shí)間戳、日志級(jí)別等日志管理功能,非常適合用于調(diào)試和記錄運(yùn)行信息,本文呢介紹go語言中的log 包,感興趣的朋友一起看看吧
    2024-11-11
  • 詳解Golang使用MongoDB通用操作

    詳解Golang使用MongoDB通用操作

    這篇文章主要介紹了詳解Golang使用MongoDB通用操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解go語言判斷管道是否關(guān)閉的常見誤區(qū)

    詳解go語言判斷管道是否關(guān)閉的常見誤區(qū)

    這篇文章主要想和大家一起探討一下在Go語言中,我們是否可以使用讀取管道時(shí)的第二個(gè)返回值來判斷管道是否關(guān)閉,文中的示例代碼講解詳細(xì),有興趣的可以了解下
    2023-10-10
  • Go語言中接口組合的實(shí)現(xiàn)方法

    Go語言中接口組合的實(shí)現(xiàn)方法

    這篇文章主要介紹了Go語言中接口組合的實(shí)現(xiàn)方法,實(shí)例分析了接口中包含接口的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-02-02
  • golang 微服務(wù)之gRPC與Protobuf的使用

    golang 微服務(wù)之gRPC與Protobuf的使用

    這篇文章主要介紹了golang 微服務(wù)之gRPC與Protobuf的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Go通過不變性優(yōu)化程序詳解

    Go通過不變性優(yōu)化程序詳解

    這篇文章主要為大家介紹了Go通過不變性優(yōu)化程序?qū)嵗斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

万全县| 合阳县| 盐津县| 襄垣县| 横峰县| 姚安县| 增城市| 罗平县| 开鲁县| 高清| 房山区| 车致| 万山特区| 衡东县| 永福县| 海丰县| 丁青县| 手机| 贵定县| 随州市| 竹山县| 石楼县| 嘉兴市| 宜丰县| 安丘市| 闵行区| 若羌县| 大足县| 连江县| 望都县| 武汉市| 盐山县| 芜湖县| 金堂县| 吉木乃县| 兰溪市| 固始县| 芷江| 北流市| 周至县| 绥化市|