使用go module導入本地包


使用go module導入本地包

go module是Go1.11版本之后官方推出的版本管理工具,並且從Go1.13版本開始,go module將是Go語言默認的依賴管理工具。到今天Go1.14版本推出之后Go modules 功能已經被正式推薦在生產環境下使用了。

如何使用go module導入本地包,作為初學者大家剛開始接觸package的時候肯定都是先在本地創建一個包,然后本地調用一下,然后就被卡住了,如何使用go module導入本地包。

前提

假設我們現在有moduleDemomypackage兩個包,其中moduleDemo包中會導入packageDemo包並使用它的New方法。

mypackage/packageDemo.go內容如下:

package mypackage

import "fmt"

func New(){
	fmt.Println("mypackage.New")
}

我們現在分兩種情況討論:

在同一個項目下

注意:在一個項目(project)下我們是可以定義多個包(package)的。

目錄結構

現在的情況是,我們在moduledemo/main.go中調用了mypackage這個包。

moduleDemo
├── go.mod
├── main.go
└── mypackage
    └── packageDemo.go

go mod模式

go mod init moduleDemo 

注:init初始化的名字, 在導入包時候是以init 后面的名字為基准開始導包

image-20210930082313883

導入包

這個時候,我們需要在moduledemo/go.mod中按如下定義:

module moduleDemo

go 1.17

然后在moduleDemo/main.go中按如下方式導入mypackage

package main

import (
	"fmt"
	"moduleDemo/mypackage" // 導入同一項目下的mypackage包
)

/*
@author RandySun
@create 2021-09-30-8:47
*/
func main() {
	mypackage.New()
	fmt.Println("main")
}

舉個例子

舉一反三,假設我們現在有文件目錄結構如下:

└── bubble
    ├── dao
    │   └── mysql.go
    ├── go.mod
    └── main.go

其中bubble/go.mod內容如下:

go mod init github.com/randysun/bubble


module github.com/randysun/bubble

go 1.17

image-20210930085702476

bubble/dao/mysql.go內容如下:

package dao

import "fmt"

func New(){
	fmt.Println("dao....")
}

bubble/main.go內容如下:

package main

import (
	"fmt"
	"github.com/randysun/bubble/dao"
)

/*
@author RandySun
@create 2021-09-30-8:56
*/
func main() {
	dao.New()
	fmt.Println("main")
}

image-20210930085843356

不在同一個項目下

目錄結構

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

導入包

這個時候,mypackage也需要進行module初始化,即擁有一個屬於自己的go.mod文件,內容如下:

module mypackage

go 1.17

然后我們在moduledemo/main.go中按如下方式導入:

package main

import (
	"fmt"
	"mypackage"
)

/*
@author RandySun
@create 2021-09-30-8:47
*/
func main() {
	mypackage.New()
	fmt.Println("main")
}

因為這兩個包不在同一個項目路徑下,你想要導入本地包,並且這些包也沒有發布到遠程的github或其他代碼倉庫地址。這個時候我們就需要在go.mod文件中使用replace指令。

在調用方也就是moduledemo/go.mod中按如下方式指定使用相對路徑來尋找mypackage這個包。

module moduleDemo

go 1.17
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

image-20210930090709349

舉個例子

最后我們再舉個例子鞏固下上面的內容。

我們現在有文件目錄結構如下:

├── p1
│   ├── go.mod
│   └── main.go
└── p2
    ├── go.mod
    └── p2.go

p1/main.go中想要導入p2.go中定義的函數。

p2/go.mod內容如下:

module randy.com/randysun/p2

go 1.17

p1/main.go中按如下方式導入

import (
	"fmt"
	"randy.com/randysun/p2"
)
func main() {
	p2.New()
	fmt.Println("main")
}

因為我並沒有把randy.com/randysun/p2這個包上傳到randy.com這個網站,我們只是想導入本地的包,這個時候就需要用到replace這個指令了。

p1/go.mod內容如下:

module github.com/randysun/p1

go 1.17


require "randy.com/randysun/p2" v0.0.0
replace "randy.com/randysun/p2" => "../p2"

此時,我們就可以正常編譯p1這個項目了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM