日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一篇帶給你 Go 語言的模塊化

前言

在很久很久以前,就 push 自己學(xué)過 go 語言,但是之前只是看了一下基礎(chǔ)語法就放棄了,實(shí)在是工作當(dāng)中沒有應(yīng)用場(chǎng)景。最近發(fā)現(xiàn)基于 go 寫的 esbuild 異軍突起,想要深入研究下它的奧秘,發(fā)現(xiàn)看不懂。于是,打算先從 go 開始學(xué)一遍,等我把 go 學(xué)好了,再去研究 esbuild。所以,最近的幾篇文章都會(huì)寫 go 的一些學(xué)習(xí)心得,今天的文章就從 go 語言的模塊化開始。

我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、嶺東ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的嶺東網(wǎng)站制作公司

環(huán)境變量

學(xué)習(xí) go 語言的第一步,當(dāng)然是安裝以及環(huán)境變量。由于我是 macos,直接運(yùn)行 brew install go 就能安裝成功,也可以在官網(wǎng)(https://golang.google.cn/)下載對(duì)應(yīng)的二進(jìn)制包。

安裝成功后,需要配置下面幾個(gè)環(huán)境變量:

  • GOROOT:go 語言的安裝路徑;
  • GOBIN:go 語言的可執(zhí)行文件路徑,一般為 "$GOROOT/bin";
  • GOPATH:工作目錄,可設(shè)置多個(gè),每個(gè)項(xiàng)目都可以設(shè)置一個(gè)單獨(dú)的GOPATH;

GOPATH

在 GoLand(go 語言最強(qiáng)IDE) 中,我們可以在 Preferences 中設(shè)置多個(gè) GOPATH,而且將 GOPATH 分為全局和局部的。

GOPATH 最早出現(xiàn)的意義是用來進(jìn)行模塊管理,每個(gè) GOPATH 中會(huì)有三個(gè)目錄:

  • src:用來存放源代碼;
  • pkg:用來存放編譯后的 .a(archive) 靜態(tài)庫文件;
  • bin:用來存放編譯后可直接運(yùn)行的二進(jìn)制文件;

一般設(shè)置為工作目錄的 src 文件夾需要手動(dòng)創(chuàng)建,其他兩個(gè)目錄都是編譯后自動(dòng)生成的。

接下來,我們新建了一個(gè)目錄 ~/Code/goland/go-story,并將該目錄設(shè)置為工作目錄。

 
 
 
 
  1. export GOPATH="~/Code/goland/go-story" 

然后在當(dāng)前目錄新建一個(gè) src 文件夾,并新建一個(gè) hello 目錄,在 hello 目錄新建 main.go 文件。

在 hello/main.go 文件中,寫入如下代碼:

 
 
 
 
  1. package main 
  2.  
  3. import ( 
  4.  "flag" 
  5.  "fmt" 
  6.  
  7. var name string 
  8.  
  9. func init() { 
  10.  flag.StringVar(&name, "name", "everyone", "The greeting object.") 
  11.  
  12. func main() { 
  13.  flag.Parse() // 解析命令行參數(shù) 
  14.  fmt.Printf("\nHello %s\n", name) 

flag 庫是 go 內(nèi)置的模塊,類似于 node 的 commander 庫,運(yùn)行后結(jié)果如下所示:

下面我們引入一個(gè)能夠讓命令行輸出色彩更加豐富的庫:colourize,類似于 node 中的 chalk。通過下面這個(gè)命令來安裝依賴:

 
 
 
 
  1. go get github.com/TreyBastian/colourize  

運(yùn)行之后,我們可以看到在工作區(qū)自動(dòng)創(chuàng)建了一個(gè) pkg 目錄,目錄下新生成的是 colourize 庫文件,同時(shí) src 目錄也新建了一個(gè) github.com 目錄,用來放 colourize 的源碼。

go get 命令可以簡(jiǎn)單理解為 npm install。接下來就能在 hello/main.go 中引入依賴。

 
 
 
 
  1. package main 
  2.  
  3. import ( 
  4.  "flag" 
  5.  "fmt" 
  6.  
  7.  "github.com/TreyBastian/colourize" 
  8.  
  9. var name string 
  10.  
  11. func init() { 
  12.  flag.StringVar(&name, "name", "everyone", "The greeting object.") 
  13.  
  14. func hello(name string) { 
  15.  fmt.Printf(colourize.Colourize("\nHello %s\n", colourize.Blue), name) 
  16.  
  17. func main() { 
  18.  flag.Parse() 
  19.  hello(name) 

運(yùn)行 hello/main.go 可以看到命令行輸出了藍(lán)色的文字。

默認(rèn)情況下,go 依賴的加載機(jī)制為:

  • $GOROOT 下的 src 目錄
  • $GOPATH 下的 src 目錄

Go Vendor

前面這種方式,有個(gè)很麻煩的問題,就是沒有辦法進(jìn)行很好的版本管理,而且多個(gè)依賴分散在 $GOPATH/src 目錄下,可能會(huì)出現(xiàn)很多很麻煩的問題。

例如,我現(xiàn)在在 GOPATH 下有兩個(gè)項(xiàng)目:go-blog、go-stroy,這兩個(gè)項(xiàng)目分別有不同的依賴,分散在 github.com 目錄,這個(gè)時(shí)候到底要不要將整個(gè) github.com 目錄添加到版本庫呢?

go 在 1.5 版本的時(shí)候,引入了 vendor 機(jī)制,在每個(gè)項(xiàng)目目錄下可以通過 vendor 目錄存放依賴,這類似于 node 中的 node_modules 目錄。

使用 go vendor 需要先安裝 govendor 模塊。

 
 
 
 
  1. go get govendor 

然后在項(xiàng)目目錄運(yùn)行如下命令。

 
 
 
 
  1. cd ~/Code/gland/go-story/src/hello 
  2. govendor init 
  3. govendor add github.com/TreyBastian/colourize 

可以看到,hello 項(xiàng)目下新生成了一個(gè) vendor 目錄,而且 colourize 也被拷貝到了該目錄下。

而且 govendor 會(huì)新建一個(gè) vendor.json 文件,用來進(jìn)行依賴項(xiàng)的管理。

有了 go vendor 之后,依賴項(xiàng)的加載順序如下:

  • 項(xiàng)目目錄下的 vendor 目錄
  • 項(xiàng)目目錄上一級(jí)的 vendor 目錄
  • 不斷向上冒泡 ……(PS. 類似于 node_modules)
  • $GOPATH 下的 vendor 目錄
  • $GOROOT 下的 src 目錄
  • $GOPATH 下的 src 目錄

配置開關(guān)

有一點(diǎn)需要注意,在 go 1.5 版本下,go vendor 并不是默認(rèn)開啟的,需要手動(dòng)配置環(huán)境變量:

 
 
 
 
  1. export GO15VENDOREXPERIMENT=1 

在 go 1.6 版本中,go vendor 已經(jīng)改為默認(rèn)開啟。

Go Modules

雖然 1.5 版本推出了 go vendor,但是沒有解決根本問題,只是依賴的查找上支持到了 vendor 目錄,vendor 目錄還是需要一些第三方的庫(govendor、godep、glide)進(jìn)行管理,而且對(duì)于 GOPATH 環(huán)境變量依然有所依賴。

官方為了解決這些問題,終于在 1.11 版本中,實(shí)驗(yàn)性的內(nèi)置了其模塊管理的能力(1.12 版本正式開啟):go mod。

使用 go mod 的時(shí)候,我們無需 GOPATH,所以我們需要把之前配置的 GOPATH 清理掉,調(diào)整下目錄結(jié)構(gòu),將 go-story/hello/main.go 直接移動(dòng)到 go-story/main.go,然后將 src、pkg 目錄刪除。

 
 
 
 
  1. # 初始化 go modules 
  2. go mod init [pkg-name] 

此時(shí),會(huì)在目錄下生成一個(gè) go.mod 文件。

查看其內(nèi)容,發(fā)現(xiàn)里面會(huì)聲明 go 的版本號(hào),以及當(dāng)前模塊的名稱。

然后我們安裝依賴(不管是何種依賴管理的方式,安裝方法依舊不變):

 
 
 
 
  1. go get github.com/TreyBastian/colourize 

go.mod 中,會(huì)寫入添加的依賴,以及版本號(hào),同時(shí),該模塊會(huì)被安裝到 GOPATH 中。由于我們之前將 GOPATH 移除,這里會(huì)安裝到 GOPATH 的默認(rèn)值中(~/go/)。

總結(jié)

之前開發(fā) node 的過程中,也踩過很多 npm 的坑,而且社區(qū)對(duì) npm 也有很多怨言,也出現(xiàn)了很多第三方的模塊:yarn、pnpm 等等。

想不到 go 的模塊管理,也是一部血淚史,現(xiàn)在下載一些 go 的老項(xiàng)目還會(huì)發(fā)現(xiàn)一些 go vendor 管理方式的項(xiàng)目。另外,go mod 出現(xiàn)后,go 官方也在計(jì)劃移除 GOPATH。


分享題目:一篇帶給你 Go 語言的模塊化
文章出自:http://www.dlmjj.cn/article/djsijsh.html