欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析GOROOT、GOPATH、Go-Modules-三者的關系

 更新時間:2020年10月16日 11:27:28   作者:阿壯Jonsson  
這篇文章主要介紹了解析GOROOT、GOPATH、Go-Modules-三者的關系,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、GOROOT介紹

在安裝完Golang語言的時候,所謂的安裝路徑其實就是你的GOROOT路徑,也就是說GOROOT存放的Golang語言內(nèi)建的程式庫的所在位置,而通常你安裝完后,你電腦的環(huán)境變數(shù)就會設好GOROOT路徑,當你開發(fā)Golang程式的時候,當你import內(nèi)建的程式庫的時候,并不需要額外安裝,而當程式運行后,預設也會先去GOROOT路徑下尋找相對應的程式庫來運行。

1、查看Glang環(huán)境變量

go env

環(huán)境變量

env中有些是我已經(jīng)修改過的,通常如果你是初次安裝Golang語言并且沒做什么環(huán)境變數(shù)設定的話,GOROOT設定路徑就是你當初安裝Golang語言的路徑,而GOPATH通常預設會是使用者目錄下的go資料夾。

2、使用 go run 執(zhí)行某個文件

package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

然后再執(zhí)行以下指令:

go run main.go

就會成功輸出hello world,go run其實會幫你將程式碼進行編譯并產(chǎn)生執(zhí)行檔,而編譯檔跟執(zhí)行檔事實上是存在一個暫存資料夾里面,當運行完此程式就會自動刪除。該指令可以想成類似直譯的方式運行,而不需要做其他任何環(huán)境設定,即可運行。

3、引用第三方套件

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.Run()
}

import了一個github.com/gin-gonic/gin套件,這個是別人開發(fā)的Web Framework套件,是不存在于官方程式庫的,而是放在GitHub上的第三方套件。

  • 當執(zhí)行Golang程式碼,當需要存取套件時,會先去GOROOT路徑下的src資料夾找同等于我們在程式碼中import的路徑下去找有沒有gin這個資料夾,而這資料夾里面就是包含了所有有關于該套件的程式庫。
  • 如果在GOROOT路徑下沒有找到,則會往GOPATH路徑下的src資料夾找同等于我們在程式碼中import的路徑下去找有沒有gin這個資料夾。

所以只要GOROOTGOPATH路徑下都沒有找到該套件的話,就無法執(zhí)行該程式碼。

二、GOPATH介紹

根據(jù)上面GOROOT的介紹,我們可以知道官方的程式庫所在位置就是在GOROOT里面,而GOPATH就是專門存放第三方套件以供我們程式碼的需要。那通常開發(fā)Golang的話,通常會在重新設定GOPATH的位置。

1、GOPATH目錄

bin
pkg
src

依照Golang語言的慣例(強制),GOPATH是指src路徑的上一層,我們要在GOPATH路徑下主動新增src資料夾,所謂src就是代表source code的意思,也就是放我們開發(fā)Golang程式碼的相關專案的原始碼。

2、GOPATH的缺點

第三方套件只要不是官方程式庫,都需要放置在GOPATH/src的路徑下才可以使用。

go get最常用在當我們想用別人公開在GitHub上的套件,可以幫我們從網(wǎng)路上clone到GOPATH/src里面。雖然這樣很方便,但是你會發(fā)現(xiàn)GOPATH/src下的程式碼會很復雜,除了有你自己開發(fā)的專案資料夾,也包含其他第三方程式庫的專案資料夾。

再來,如果你開發(fā)的專案采用第三方套件是不同版本怎么辦?以往的解決方法是要設定多組不同的GOPATH。雖然社群也有開發(fā)相對應的package manager,如Vendor、Dep來解決該問題,但畢竟不是官方主導的。

三、Go Modules的誕生

為了解決不被GOPATH的問題,因此官方在1.11開始推出了Go Modules的功能。Go Modules解決方式很像是Java看到Maven的做法,將第三方程式庫儲存在本地的空間,并且給程式去引用。

1、設定GO111MODULE環(huán)境變數(shù)

總共可以三種不同的值:

  • auto

默認值,go命令會根據(jù)當前目錄來決定是否啟用modules功能。需要滿足兩種情形:
該專案目錄不在GOPATH/src/
當前或上一層目錄存在go.mod檔案

  • on

go命令會使用modules,而不會GOPATH目錄下查找。

  • off

go命令將不會支持module功能,尋找套件如以前GOPATH的做法去尋找。

我是建議要開發(fā)Go專案就不再使用GOPATH的功能了,而是采用Go Modules的做法,因此建議都設定為on。
而采用Go Modules,下載下來的第三方套件都在哪呢?其實就位在GOPATH/pkg/mod資料夾里面。

2、初始化mod

go mod init <module name>

<module name>可填可不填,不填的話預設就是采用專案資料夾的名稱。

在此檔案內(nèi)可以寫以下幾個關鍵字:

  • module

定義模組路徑

  • go

定義go語言version

  • require

指定依賴的套件,預設是最新版,可以指定版本號

  • exclude

排除該套件和其版本

  • replace

使用不同的套件版本并替換原有的套件版本注解
// 單行注解
/* 多行注解*/
indirect 代表被間接導入的依賴包

假設現(xiàn)在我要引入GitHub上的gin-gonic/gin的套件,如下定義:

module awesomeProject

go 1.13

require github.com/gin-gonic/gin v1.6.3

再執(zhí)行以下指令:

go mod download

會將需要的套件安裝在GOPATH/pkg/mod資料夾里面。而且會發(fā)現(xiàn)出現(xiàn)一個go.sum的檔案,這個檔案基本上用來記錄套件版本的關系,確保是正確的,是不太需要理會的。

官方說明:除了go.mod之外,go命令還維護一個名為go.sum的文件,其中包含特定模塊版本內(nèi)容的預期加密哈希
go命令使用go.sum文件確保這些模塊的未來下載檢索與第一次下載相同的位,以確保項目所依賴的模塊不會出現(xiàn)意外更改,無論是出于惡意、意外還是其他原因。 go.mod和go.sum都應檢入版本控制。
go.sum 不需要手工維護,所以可以不用太關注。

如果將gin版本改成v1.4.0再重新執(zhí)行go mod download,就會發(fā)現(xiàn)在GOPATH/pkg/mod里面gin-gonic會有兩個資料夾分別是gin@v1.4.0、gin@v1.5.0,借此來區(qū)分版本。

當然其實也可以不執(zhí)行go mod download,而直接運行go build or go install 也會自動將套件安裝在相對應的地方。

還有一種方式直接下載套件而不用在go.mod中定義:

go get github.com/gin-gonic/gin@v1.5.0

只要有開啟go modules功能,go get 就不會像以前一樣在GOPATH/src下放置套件檔案,而是會放在GOPATH/pkg/mod里面,并且go.mod會寫好引入,這樣也就不用使用go mod download指令了。

到此這篇關于解析GOROOT、GOPATH、Go-Modules-三者的關系的文章就介紹到這了,更多相關GOROOT GOPATH Go-Modules內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang?pprof監(jiān)控memory?block?mutex使用指南

    golang?pprof監(jiān)控memory?block?mutex使用指南

    這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Go web入門Go pongo2模板引擎

    Go web入門Go pongo2模板引擎

    這篇文章主要為大家介紹了Go web編程入門Go pongo2模板引擎使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Golang內(nèi)存泄漏場景以及解決方案詳析

    Golang內(nèi)存泄漏場景以及解決方案詳析

    golang中內(nèi)存泄露的發(fā)現(xiàn)與排查一直是來是go開發(fā)者頭疼的一件事,下面這篇文章主要給大家介紹了關于Golang內(nèi)存泄漏場景以及解決的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Golang極簡入門教程(四):編寫第一個項目

    Golang極簡入門教程(四):編寫第一個項目

    這篇文章主要介紹了Golang極簡入門教程(四):編寫第一個項目,本文講解了workspace、包路徑、第一個可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • go mod包拉不下來的問題及解決方案

    go mod包拉不下來的問題及解決方案

    這篇文章主要介紹了go mod包拉不下來的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Golang實現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map

    Golang實現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map

    在項目實踐中,有時候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來介紹下常用的兩種轉(zhuǎn)換方式,希望對大家有所幫助
    2023-01-01
  • golang的基礎語法和常用開發(fā)工具詳解

    golang的基礎語法和常用開發(fā)工具詳解

    這篇文章主要介紹了golang的基礎語法和常用開發(fā)工具,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • golang如何使用gomobile進行Android開發(fā)

    golang如何使用gomobile進行Android開發(fā)

    golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關于golang如何使用gomobile進行Android開發(fā)的相關資料,需要的朋友可以參考下
    2023-01-01
  • 淺談beego默認處理靜態(tài)文件性能低下的問題

    淺談beego默認處理靜態(tài)文件性能低下的問題

    下面小編就為大家?guī)硪黄獪\談beego默認處理靜態(tài)文件性能低下的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Golang程序漏洞檢測器govulncheck的安裝和使用

    Golang程序漏洞檢測器govulncheck的安裝和使用

    govulncheck 是一個命令行工具,可以幫助 Golang 開發(fā)者快速找到項目代碼和依賴的模塊中的安全漏洞,該工具可以分析源代碼和二進制文件,識別代碼中對這些漏洞的任何直接或間接調(diào)用,本文就給大家介紹一下govulncheck安裝和使用,需要的朋友可以參考下
    2023-09-09

最新評論