完全搞懂golang的GOROOT和GOPATH

目錄html

一、GOPATH 和 GOROOTjava

二、修改 GOPATH 和 GOROOT緩存

三、HelloWord——GOPATH版工具

四、一些踩坑經驗測試


一、GOPATH 和 GOROOT

不一樣於其餘語言,go中沒有項目的說法,只有包, 其中有兩個重要的路徑,GOROOT 和 GOPATHui

Go開發相關的環境變量以下:url

  • GOROOT:GOROOT就是Go的安裝目錄,(相似於java的JDK)
  • GOPATH:GOPATH是咱們的工做空間,保存go項目代碼和第三方依賴包

GOPATH能夠設置多個,其中,第一個將會是默認的包目錄,使用 go get 下載的包都會在第一個path中的src目錄下,使用 go install時,在哪一個GOPATH中找到了這個包,就會在哪一個GOPATH下的bin目錄生成可執行文件spa

二、修改 GOPATH 和 GOROOT

  • GOROOT

GOROOT是Go的安裝路徑。GOROOT在絕大多數狀況下都不須要修改.net

Mac中安裝Go會自動配置好GOROOT,路徑爲/usr/local/go。Win中默認的GOROOT是在 C:\Go中,也可本身指定命令行

【以下圖所示則個人GORROT爲:D:\development\go】,如下是GOROOT目錄的內容:

能夠看到GOROOT下有bin,doc和src目錄。bin目錄下有咱們熟悉的go和gofmt工具。能夠認爲GOOROOT和Java裏的JDK目錄相似。

  • GOPATH

GOPATH是開發時的工做目錄。用於:

  1. 保存編譯後的二進制文件。
  2. go getgo install命令會下載go代碼到GOPATH。
  3. import包時的搜索路徑

使用GOPATH時,GO會在如下目錄中搜索包:

  1. GOROOT/src:該目錄保存了Go標準庫代碼。
  2. GOPATH/src:該目錄保存了應用自身的代碼和第三方依賴的代碼。

假設程序中引入了以下的包:

import "Go-Player/src/chapter17/models"

第一步:Go會先去GOROOT的scr目錄中查找,很顯然它不是標準庫的包,沒找到。
第二步:繼續在GOPATH的src目錄去找,準確說是GOPATH/src/Go-Player/src/chapter17/models這個目錄。若是該目錄不存在,會報錯找不到package。在使用GOPATH管理項目時,須要按照GO尋找package的規範來合理地保存和組織Go代碼。

三、HelloWord——GOPATH版

(1)設置並查看GOPATH和GOROOT環境變量

  • 安裝go SKD目錄:D:\development\go
  • go項目存放目錄:D:\development\jetbrains\goland\workspace,而且此目錄下含有bin、src、pkg三個文件夾,src文件夾用來存放項目代碼

當引入module時,首先在GOROOT的src目錄下查找,而後再GPOPATH的src目錄下查找

(2)GOLand環境配置

  • 在D:\development\jetbrains\goland\workspace\src目錄下新建項目GO-Player

bin:存放編譯後的exe文件

pkg:存放自定義包的目錄

src:存放項目源文件的目錄

  • 按以下指令進行配置

  • 可在Settings中選擇SDK和添加GOPATH

(3)測試

  • models:Student.go

  • main:hello.go
package main

import (
	//"./models"  //相對路徑
	"Go-Player/src/ademo/models"  //根據GOPATH找
    //根據GOPATH:D:\development\jetbrains\goland\workspace,在其src目錄下查找
    //即GOPATH/src/Go-Player/src/ademo/models
	"fmt"
)

func main() {
	stu := models.Student{
		Name: "張三",
	}
	fmt.Println(stu)
}

此篇文章僅介紹網上大部分GOPATH版本。Go語言Hello World都只簡單地介紹了GOPATH版本。可是從Go的1.11版本以後,已再也不推薦使用GOPATH來構建應用了。也就是說GOPATH被認爲是廢棄的,錯誤的作法。

四、一些踩坑經驗

當你開啓了GO111MODULE,仍然使用GOPATH模式的方法,在引入自定義模塊時會報錯。go mod具體使用將在下一篇介紹

GO111MODULE 有三個值:offonauto(默認值)

  • GO111MODULE=off,go命令行將不會支持module功能,尋找依賴包的方式將會沿用舊版本那種經過vendor目錄或者GOPATH模式來查找。
  • GO111MODULE=on,go命令行會使用modules,而一點也不會去GOPATH目錄下查找。
  • GO111MODULE=auto,默認值,go命令行將會根據當前目錄來決定是否啓用module功能。這種狀況下能夠分爲兩種情形:
    • 當前目錄在GOPATH/src以外且該目錄包含go.mod文件
    • 當前文件在包含go.mod文件的目錄下面。

當modules 功能啓用時,依賴包的存放位置變動爲$GOPATH/pkg,容許同一個package多個版本並存,且多個項目能夠共享緩存的 module。

(1)使用了了相對路徑:import "./models" 

  • 報錯:build command-line-arguments: cannot find module for path _/D_/dev這裏後面一堆本地路徑

這是由於在go module下 你源碼中 impot …/ 這樣的引入形式不支持了, 應該改爲 impot 模塊名/ 。 這樣就ok了

(2)使用結合了GOPATH的形式:import "Go-Player/src/ademo/models" 

因而咱們把上面的import改爲告終合GOPATH的如上形式

  • 報錯:package Go-Player/src/ademo/models is not in GOROOT D:/development/go/src/GPlayer/src/ademo/models

(3)完全解決方法:用go env -u 恢復初始設置

再也不使用go mod:

  • ​​​​​​go env -w GO111MODULE=off  或者  go env -w GO111MODULE=auto
  • ​​​​​​go env -u GO111MODULE

      區別在於,若是GO111MODULE=on或者auto,在go get下載包時候,會下載到GOPATH/pkg/mod,引入時也是一樣的從這個目錄開始。若是這行了上述命令,那麼go get下載包時候,會下載到GOPATH/src 目錄下

      本文僅介紹Hello world(GOPATH版),雖然此種方法不推薦使用,可是初學者在使用的時候仍會遇到不少問題。後續將介紹如何使用Go Module版

 

參考博客:

相關文章
相關標籤/搜索