一文徹底搞懂go mod使用

目錄

一、如何使用go mod

二、golang開啓mod後import報紅解決

三、go mod 怎麼導入本地其它項目的包?

四、完整代碼


一、如何使用go mod

下面的函數中使用了iris,所以我們需要先使用go mod下載相關依賴,直接使用go get命令太慢了,還可能被牆~~

【此時項目可以放在任意位置,不必非要放在GOPATH目錄下】

  • test.go
package main

import (
	iris "github.com/kataras/iris/v12"
)

func main() {
	app := iris.New()
	app.Get("/", func(ctx iris.Context) {
		ctx.HTML("<h1>Hello World!</h1>")
	})

	app.Run(iris.Addr(":8080"))
}

1、打開CMD命令提示框,設置臨時環境變量

  • set GO111MODULE=on
  • set GOPROXY=https://goproxy.io

注意 https://goproxy.io 也可替換成阿里雲的 https://mirrors.aliyun.com/goproxy

2、再次執行 go get github.com/kataras/iris 也可以加 -v -u ,如下

  •  go get -u github.com/kataras/iris/v12@latest

 這時候就把所有的依賴都下載下來了。

值得注意的是,這些包並沒有下載到 GOPATH/src 目錄下,而是在 GOPATH/pkg/mod 目錄中。

3、使用初始化生成go.mod 文件

  • go mod init  初始化生成go.mod文件

4、添加依賴運行

  • 執行 go run test.go 運行代碼會發現 go mod 會自動查找依賴自動下載

5、再次運行主函數

go run test.go ,訪問http://localhost:8080/

go mod更加詳細的使用可參考我的另一篇博客:

二、golang開啓mod後import報紅解決

在golang中,開啓mod模式後,import包變紅,但是程序可以正常運行

如下所示:

猜測是索引路徑出了問題,當前項目的依賴路徑如下,可以看到只有sdk和GOPATH,沒有go mod模塊

新建go項目,然後老老實實的go mod init [項目名],然後go build拉包,一切正常,這時,在setting裏再啓用go mod勾選上

然後,奇蹟出現了,我們的依賴中,多了一個go mod路徑,這時原來報紅的import路徑消失了!!!

三、go mod 怎麼導入本地其它項目的包?

通過上圖中的引入依賴可以清晰地看到,我們啓用go mod後,很明顯的由GOPATH路徑變成了go mod路徑

也就是說,之前的基於GOPATH的路徑訪問方式不管用,並且go mod不支持相對路徑的引入方式,這個時候如果要引入其他模塊,怎麼做呢?

GOPATH和GOROOT加詳細的理解可參考我的另一篇博客:

項目結構如下所示,需要在modelDemo模塊中引入model模塊

hellodemo.go是應用的入口,main 所在位置,而model可以理解爲你寫的一個公共的庫,其中提供了一個函數 Hello()。現在,要在 hellodemo.go中調用 model中的 Hello() 函數。傳統的方式是基於GOPATH或者相對路徑的方式,但go mod均不支持,那如何解決呢?

1、model模塊中的 go.mod 內容如下:

(在model目錄下運行go mod init生成go.mod文件)

2、model模塊中的mymodel.go 內容如下:

3、modelDemo模塊中的 go.mod 內容如下:

(在modeldemo目錄下運行go mod init生成go.mod文件)

go.mod 提供了modulerequirereplaceexclude 四個命令

  • module 語句指定包的名字(路徑)
  • require 語句指定的依賴項模塊
  • replace 語句可以替換依賴項模塊
  • exclude 語句可以忽略依賴項模塊

現需要引入model模塊

 

此處的 replac稍微介紹下,之所以要是 github.com/model 的格式,是因爲在 go1.13 中, go module 名稱規範要求路徑的第一部分必須滿足域名規範,否則可能彙報類似 malformed module path "model": missing dot in first path element 這樣的錯誤。當然,在 go1.12 不會有報這個錯誤。建議的話,如果是公司內部使用,可以替換成公司內部域名。

引入上面的replace內容侯,再次運行hellodemo.go,就會自動生成上面的require內容

replace 的第二個參數指定了不從遠程獲取,而是本地某個路徑下的模塊替換 github.com/model

4、hellodemo.go內容如下:

 

此時,執行 go run hellodemo.go 是可以成功運行的。

四、完整代碼

1、model -> mymodel.go

package model

func Hello() string {
	return "Hello"
}

2、model -> go.mod

module Demo/model

go 1.14

3、helloDemo -> hellodemo.go

package main

import (
	"fmt"
	"github.com/model"
)

func main()  {
	fmt.Println("Hello")
	fmt.Println(model.Hello())
}

4、helloDemo -> go.mod

module Demo/modelDemo

go 1.14

require github.com/model v0.0.0-00010101000000-000000000000 // indirect

replace github.com/model => ../model

 

參考文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章