重學(xué)Go語言之如何使用Modules
Module
在Go Modules
這種新的依賴機制中定義了Module
這個概念,也就是所謂的模塊。
模塊的組成
一個模塊就是一個或者多個包(package
)的集合,創(chuàng)建模塊時,會在根目錄下生成一個go.mod
文件,go.mod
文件包含了模塊的路徑(module path
)以及該模塊依賴的其他模塊列表,在下載依賴模塊后,還會生成一個go.sum
文件,因此大體上,模塊的構(gòu)成如下圖所示:
module path
module path
,即模塊路徑,是該模塊的身份標(biāo)識,在模塊內(nèi)或者其他模塊導(dǎo)入該模塊的包時,必須以模塊路徑為前綴,比如模塊路徑為github.com/test/test
,那么導(dǎo)入該模塊的hello
包時,則其導(dǎo)入的路徑為:
import?"github.com/test/test/hello"
下載依賴模塊時也需要使用到模塊路徑:
go?get?github.com/test/test
語義化版本號
同一個模塊可能會存在不同的版本,Go模塊采用語義化版本號來定義模塊的版本,其版本號格式為:
v<major>.<minor>.<patch>
- major:主版本號,當(dāng)模塊做了不兼容的修改后,需更改主版本號。
- minor:次版本號,當(dāng)模塊做了向下兼容的功能時,需要更改次版本號。
- patch:修訂版本號,當(dāng)模塊做了向下兼容的bug修改時,需要更改修訂版本號。
前面我們使用go get
命令下載依賴模塊時并沒有指定義版本號,那么默認(rèn)下載master
分支上最新的commit
:
go?get?github.com/test/test
如果指定版本號,且該版本號有對應(yīng)的tag
,那么就會下載對應(yīng)的tag
,如果沒有對應(yīng)tag
,那么還是下載master
分支上最新的commmit
:
go?get?github.com/test/test@v1.1.1
使用@latest
可以下載最新版本的模塊:
go?get?github.com/test/test@latest
當(dāng)主版本號為v0
或者v1
時,在下載和導(dǎo)入時,可以省略版本號,當(dāng)主版本大于或等于v2時,不可省略主版本號:
比如我們現(xiàn)在要下載有模塊有v1.6.0
、v1.7.0
以及v2.0.5
三個版本,此時:
go?get?github.com/test/test go?get?github.com/test/test@latest
上面的語句會下載v1.7.0
,這是因為主版本v1版本可以省略且未指定版本,其效果與@latest
一樣。
因為1.6.0
版本不是v1
的最版本,所以要下載v1.6.0
版本,則需要指定版本號:
go?get?github.com/test/test@1.6.0
如果要下載v2.0.5
版本,下載路徑為:
go?get?github.com/test/test/v2
創(chuàng)建一個新的模塊
創(chuàng)建模塊的命令為go mod init
,該命令后面的參數(shù)就是模塊路徑,在目錄名為hello
的空目錄執(zhí)行以下語句:
$?go?mod?init?example.com/hello
此時在hello
目錄會生成一個go.mod
文件:
module?example.com/hello go?1.20
創(chuàng)建hello.go
文件,代碼如下:
package?hello func?Hello()?string?{ ????return?"Hello,?world." }
創(chuàng)建hello_test.go
文件,代碼如下:
package?hello import?"testing" func?TestHello(t?*testing.T)?{ ????want?:=?"Hello,?world." ????if?got?:=?Hello();?got?!=?want?{ ????????t.Errorf("Hello()?=?%q,?want?%q",?got,?want) ????} }
運行go test
命令:
$?go?test PASS ok??????example.com/hello???????0.024s
這樣,我們就已經(jīng)創(chuàng)建了一個自己的模塊。
依賴其他的模塊
Go Modules
的作用就在于定義與規(guī)范了模塊之間的版本依賴關(guān)系,通過這套機制,我們可以在自己的模塊中導(dǎo)入其他的模塊。
現(xiàn)在我們假設(shè)有一個其他開發(fā)者創(chuàng)建好的模塊:github.com/test/MyUtil
,該模塊當(dāng)前的版本為v1.13
,我們使用import
語句導(dǎo)出,并在Hello()
方法中使用:
package?hello import?"github.com/test/MyUtil" func?Hello()?string?{ ????return?MyUtil.Hello() }
現(xiàn)在代碼還不能運行,因為我們還沒將該模塊下載到本地,下載依賴的模塊使用go get
命令:
$?go?get?github.com/test/MyUtil go:?downloading?github.com/test/MyUtil?v1.1.3 go:?added?github.com/test/MyUtil?v1.1.3
下載了依賴的模塊之后,go.mod
文件會記錄當(dāng)前模塊的依賴項:
module?example.com/hello go?1.20 require?github.com/test/MyUtil?v1.1.3
另外,下載依賴模塊時也會生成一個go.sum
文件,其內(nèi)容如下:
github.com/test/MyUtil?v1.1.3?h1:A2x2RDcKl0rxZaOKk0Mn71HQfISoS/0Vex+UHjtou4o= github.com/test/MyUtil?v1.1.3/go.mod?h1:8PqlR4GowL1as1JuS979xEp6TmJjrCIG+Bnjrdo3bfE=
go.sum
文件在下載依賴時會發(fā)生變化,每個依賴模塊可能會生成兩行記錄,一行表示依賴模塊的全體文件的SHA-256
哈希值,另一行則為依賴模塊的go.mod
文件的哈希值。
再次運行go test
命令:
$?go?test PASS ok??????example.com/hello???????0.024s
現(xiàn)在,我們就已經(jīng)成功在自己的模塊中調(diào)用其他模塊的功能了。
升級依賴的模塊
我們依賴的模塊也會更新升級,現(xiàn)在假設(shè)模塊MyUtil
增加了其他函數(shù),并且版本升級到v.1.12.10
,我們可以調(diào)用go get
命令模塊版本升級。
在模塊路徑后面可以指定義升級的版本:
?go?get?github.com/test/MyUtil@1.12.10
也可以在路徑后直接跟上@latest
升級最新的版本:
github.com/test/MyUtil@latest?
因為當(dāng)前最新版本為v1.12.10
,因此上面兩種路徑的效果是一樣的:
$?go?get?github.com/test/MyUtil@latest?? go:?downloading?github.com/test/MyUtil?v1.12.10 go:?upgraded?github.com/test/MyUtil?v1.1.3?=>?v1.12.10
從go.mod
文件可以看出依賴模塊版本的變化:
module?example.com/hello go?1.20 require?github.com/test/MyUtil?v1.12.10
添加一個新的主版本
當(dāng)模塊的主版本號發(fā)生變化時,比如從v1
升級到v2
,說明新版本做出之前不兼容的變更,我們可以通過在模塊路徑后面跟上版本來下載對應(yīng)的版本:
?go?get?github.com/test/MyUtil/v2
此時import
語句后面的路徑也發(fā)生了變化:
package?hello import?( ?"github.com/test/MyUtil" ?v2?"github.com/test/MyUtil/v2" ) func?Hello()?string?{ ?return?MyUtil.Hello() } func?Hello2()?string?{ ?return?v2.HelloV2("%s",?"Hello") }
小結(jié)
Go Module
是一種比較復(fù)雜的依賴解決方案,今天的這篇文章算是講解了Go Modules
的基本使用與一些基本概念,沒有涉及到Go Modules
的全部知識,在以后的文章,我們再詳細(xì)展開。
到此這篇關(guān)于重學(xué)Go語言之如何使用Modules的文章就介紹到這了,更多相關(guān)Go Modules內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang結(jié)構(gòu)化日志slog的用法簡介
日志是任何軟件的重要組成部分,Go?提供了一個內(nèi)置日志包(slog),在本文中,小編將簡單介紹一下slog包的功能以及如何在?Go?應(yīng)用程序中使用它,感興趣的可以了解下2023-09-09Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度
這篇文章主要介紹了Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度,使用Go語言后,可以并發(fā)獲取,極大提升效率,需要的朋友可以參考下2023-02-02Go語言實現(xiàn)一個Http Server框架(二) Server的抽象
上一篇文章對http庫的基本使用做了說明,這篇文章主要介紹了如何實現(xiàn)一個簡單地httpServer,文中代碼示例非常詳細(xì),感興趣的朋友可以參考下2023-04-04GO使用socket和channel實現(xiàn)簡單控制臺聊天室
今天小編給大家分享一個簡單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實現(xiàn)思路也很簡單明了,下面小編給大家?guī)砹送暾a,感興趣的朋友跟隨小編一起看看吧2021-12-12Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例
本篇文章主要介紹了Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05