成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你 Go 語言的模塊化

開發 后端
最近發現基于 go 寫的 esbuild 異軍突起,想要深入研究下它的奧秘,發現看不懂。于是,打算先從 go 開始學一遍,等我把 go 學好了,再去研究 esbuild。所以,最近的幾篇文章都會寫 go 的一些學習心得,今天的文章就從 go 語言的模塊化開始。

前言

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

環境變量

學習 go 語言的第一步,當然是安裝以及環境變量。由于我是 macos,直接運行 brew install go 就能安裝成功,也可以在官網(https://golang.google.cn/)下載對應的二進制包。

安裝成功后,需要配置下面幾個環境變量:

  • GOROOT:go 語言的安裝路徑;
  • GOBIN:go 語言的可執行文件路徑,一般為 "$GOROOT/bin";
  • GOPATH:工作目錄,可設置多個,每個項目都可以設置一個單獨的GOPATH;

GOPATH

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

GOPATH 最早出現的意義是用來進行模塊管理,每個 GOPATH 中會有三個目錄:

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

一般設置為工作目錄的 src 文件夾需要手動創建,其他兩個目錄都是編譯后自動生成的。

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

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

然后在當前目錄新建一個 src 文件夾,并新建一個 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() // 解析命令行參數 
  14.  fmt.Printf("\nHello %s\n"name

flag 庫是 go 內置的模塊,類似于 node 的 commander 庫,運行后結果如下所示:

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

  1. go get github.com/TreyBastian/colourize  

運行之后,我們可以看到在工作區自動創建了一個 pkg 目錄,目錄下新生成的是 colourize 庫文件,同時 src 目錄也新建了一個 github.com 目錄,用來放 colourize 的源碼。

go get 命令可以簡單理解為 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

運行 hello/main.go 可以看到命令行輸出了藍色的文字。

默認情況下,go 依賴的加載機制為:

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

Go Vendor

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

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

go 在 1.5 版本的時候,引入了 vendor 機制,在每個項目目錄下可以通過 vendor 目錄存放依賴,這類似于 node 中的 node_modules 目錄。

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

  1. go get govendor 

然后在項目目錄運行如下命令。

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

可以看到,hello 項目下新生成了一個 vendor 目錄,而且 colourize 也被拷貝到了該目錄下。

而且 govendor 會新建一個 vendor.json 文件,用來進行依賴項的管理。

有了 go vendor 之后,依賴項的加載順序如下:

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

配置開關

有一點需要注意,在 go 1.5 版本下,go vendor 并不是默認開啟的,需要手動配置環境變量:

  1. export GO15VENDOREXPERIMENT=1 

在 go 1.6 版本中,go vendor 已經改為默認開啟。

Go Modules

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

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

使用 go mod 的時候,我們無需 GOPATH,所以我們需要把之前配置的 GOPATH 清理掉,調整下目錄結構,將 go-story/hello/main.go 直接移動到 go-story/main.go,然后將 src、pkg 目錄刪除。

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

此時,會在目錄下生成一個 go.mod 文件。

查看其內容,發現里面會聲明 go 的版本號,以及當前模塊的名稱。

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

  1. go get github.com/TreyBastian/colourize 

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

總結

之前開發 node 的過程中,也踩過很多 npm 的坑,而且社區對 npm 也有很多怨言,也出現了很多第三方的模塊:yarn、pnpm 等等。

想不到 go 的模塊管理,也是一部血淚史,現在下載一些 go 的老項目還會發現一些 go vendor 管理方式的項目。另外,go mod 出現后,go 官方也在計劃移除 GOPATH。

 

責任編輯:姜華 來源: 自然醒的筆記本
相關推薦

2021-06-24 06:35:00

Go語言進程

2021-04-30 09:04:11

Go 語言結構體type

2021-04-09 10:38:59

Go 語言數組與切片

2021-03-24 06:06:13

Go并發編程Singlefligh

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-09-16 05:32:31

No.js 模塊加載器module1.js

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-14 14:16:58

HttpHttp協議網絡協議

2021-04-08 11:00:56

CountDownLaJava進階開發

2024-06-13 08:34:48

2022-03-22 09:09:17

HookReact前端

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2022-02-17 08:53:38

ElasticSea集群部署

2022-04-29 14:38:49

class文件結構分析

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-10-28 08:51:53

GPIO軟件框架 Linux

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线免费观看亚洲 | 亚洲精品二三区 | 成人在线免费观看 | 婷婷久久久久 | 日韩色图视频 | 午夜成人在线视频 | 美女一区二区在线观看 | 成人国产精品色哟哟 | 日韩电影一区 | 欧美综合国产精品久久丁香 | 国产在线视频一区 | 成人午夜在线 | 成人精品网 | 国产91久久久久久久免费 | 亚洲在线一区 | 精品国产免费一区二区三区演员表 | 久久久久久国产精品免费免费男同 | 亚洲高清在线 | 日韩国产一区二区三区 | 日韩欧美国产精品一区 | 亚洲福利在线观看 | 自拍偷拍一区二区三区 | 福利视频一区二区三区 | 久久三区 | 日本网站免费观看 | 拍真实国产伦偷精品 | 色本道| 久久久久久毛片免费观看 | 成人国产免费视频 | 中文字幕在线观看日韩 | 国产精品欧美一区二区 | 久久国产视频网 | 免费国产网站 | 久草网址| 亚洲手机视频在线 | 亚洲高清在线 | 久久国产视频播放 | 精品久久久久久亚洲综合网 | 久久亚洲国产精品 | 成人av观看 | 亚洲一二三区在线观看 |