使用go module導(dǎo)入本地包的方法教程詳解
go module 是Go1.11版本之后官方推出的版本管理工具,并且從 Go1.13 版本開始, go module 將是Go語言默認(rèn)的依賴管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已經(jīng)被正式推薦在生產(chǎn)環(huán)境下使用了。
這幾天已經(jīng)有很多教程講解如何使用 go module ,以及如何使用 go module 導(dǎo)入gitlab私有倉庫,我這里就不再啰嗦了。但是最近我發(fā)現(xiàn)很多小伙伴在群里問如何使用 go module 導(dǎo)入本地包,作為初學(xué)者大家剛開始接觸package的時(shí)候肯定都是先在本地創(chuàng)建一個(gè)包,然后本地調(diào)用一下,然后就被卡住了。。。
這里就詳細(xì)介紹下如何使用 go module 導(dǎo)入本地包。
前提
假設(shè)我們現(xiàn)在有 moduledemo 和 mypackage 兩個(gè)包,其中 moduledemo 包中會(huì)導(dǎo)入 mypackage 包并使用它的 New 方法。
mypackage/mypackage.go 內(nèi)容如下:
package mypackage import "fmt" func New(){ fmt.Println("mypackage.New") }
我們現(xiàn)在分兩種情況討論:
在同一個(gè)項(xiàng)目下
注意:在一個(gè)項(xiàng)目(project)下我們是可以定義多個(gè)包(package)的。
目錄結(jié)構(gòu)
現(xiàn)在的情況是,我們?cè)?nbsp;moduledemo/main.go 中調(diào)用了 mypackage 這個(gè)包。
moduledemo ├── go.mod ├── main.go └── mypackage └── mypackage.go
導(dǎo)入包
這個(gè)時(shí)候,我們需要在 moduledemo/go.mod 中按如下定義:
module moduledemo
go 1.14
然后在 moduledemo/main.go 中按如下方式導(dǎo)入 mypackage
package main import ( "fmt" "moduledemo/mypackage" // 導(dǎo)入同一項(xiàng)目下的mypackage包 ) func main() { mypackage.New() fmt.Println("main") }
舉個(gè)例子
舉一反三,假設(shè)我們現(xiàn)在有文件目錄結(jié)構(gòu)如下:
└── bubble
├── dao
│ └── mysql.go
├── go.mod
└── main.go
其中 bubble/go.mod 內(nèi)容如下:
module github.com/q1mi/bubble go 1.14
bubble/dao/mysql.go 內(nèi)容如下:
package dao import "fmt" func New(){ fmt.Println("mypackage.New") }
bubble/main.go 內(nèi)容如下:
package main import ( "fmt" "github.com/q1mi/bubble/dao" ) func main() { dao.New() fmt.Println("main") }
不在同一個(gè)項(xiàng)目下
目錄結(jié)構(gòu)
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
導(dǎo)入包
這個(gè)時(shí)候, mypackage 也需要進(jìn)行module初始化,即擁有一個(gè)屬于自己的 go.mod 文件,內(nèi)容如下:
module mypackage
go 1.14
然后我們?cè)?nbsp;moduledemo/main.go 中按如下方式導(dǎo)入:
import ( "fmt" "mypackage" ) func main() { mypackage.New() fmt.Println("main") }
因?yàn)檫@兩個(gè)包不在同一個(gè)項(xiàng)目路徑下,你想要導(dǎo)入本地包,并且這些包也沒有發(fā)布到遠(yuǎn)程的github或其他代碼倉庫地址。這個(gè)時(shí)候我們就需要在 go.mod 文件中使用 replace 指令。
在調(diào)用方也就是 packagedemo/go.mod 中按如下方式指定使用相對(duì)路徑來尋找 mypackage 這個(gè)包。
module moduledemo go 1.14 require "mypackage" v0.0.0 replace "mypackage" => "../mypackage"
舉個(gè)例子
最后我們?cè)倥e個(gè)例子鞏固下上面的內(nèi)容。
我們現(xiàn)在有文件目錄結(jié)構(gòu)如下:
├── p1
│ ├── go.mod
│ └── main.go
└── p2
├── go.mod
└── p2.go
p1/main.go 中想要導(dǎo)入 p2.go 中定義的函數(shù)。
p2/go.mod 內(nèi)容如下:
module liwenzhou.com/q1mi/p2
go 1.14
p1/main.go 中按如下方式導(dǎo)入
import ( "fmt" "liwenzhou.com/q1mi/p2" ) func main() { p2.New() fmt.Println("main") }
因?yàn)槲也]有把 liwenzhou.com/q1mi/p2 這個(gè)包上傳到 liwenzhou.com 這個(gè)網(wǎng)站,我們只是想導(dǎo)入本地的包,這個(gè)時(shí)候就需要用到 replace 這個(gè)指令了。
p1/go.mod 內(nèi)容如下:
module github.com/q1mi/p1
go 1.14
require "liwenzhou.com/q1mi/p2" v0.0.0
replace "liwenzhou.com/q1mi/p2" => "../p2"
此時(shí),我們就可以正常編譯 p1 這個(gè)項(xiàng)目了。
說再多也沒用,自己動(dòng)手試試吧。
總結(jié)
到此這篇關(guān)于使用go module導(dǎo)入本地包的方法教程詳解的文章就介紹到這了,更多相關(guān)go module 導(dǎo)入本地包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言學(xué)習(xí)筆記之錯(cuò)誤和異常詳解
Go語言采用返回值的形式來返回錯(cuò)誤,這一機(jī)制既可以讓開發(fā)者真正理解錯(cuò)誤處理的含義,也可以大大降低程序的復(fù)雜度,下面這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)筆記之錯(cuò)誤和異常的相關(guān)資料,需要的朋友可以參考下2022-07-07Go語言k8s?kubernetes使用leader?election實(shí)現(xiàn)選舉
這篇文章主要為大家介紹了Go語言?k8s?kubernetes?使用leader?election選舉,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Go語言使用net/http實(shí)現(xiàn)簡單登錄驗(yàn)證和文件上傳功能
這篇文章主要介紹了Go語言使用net/http實(shí)現(xiàn)簡單登錄驗(yàn)證和文件上傳功能,使用net/http模塊編寫了一個(gè)簡單的登錄驗(yàn)證和文件上傳的功能,在此做個(gè)簡單記錄,需要的朋友可以參考下2023-07-07golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn)
本文主要介紹了golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04超實(shí)用的Golang通道指南之輕松實(shí)現(xiàn)并發(fā)編程
Golang?中的通道是一種高效、安全、靈活的并發(fā)機(jī)制,用于在并發(fā)環(huán)境下實(shí)現(xiàn)數(shù)據(jù)的同步和傳遞。本文主要介紹了如何利用通道輕松實(shí)現(xiàn)并發(fā)編程,需要的可以參考一下2023-04-04使用Go語言構(gòu)建高效的二叉搜索樹聯(lián)系簿
樹是一種重要的數(shù)據(jù)結(jié)構(gòu),而二叉搜索樹(BST)則是樹的一種常見形式,在本文中,我們將學(xué)習(xí)如何構(gòu)建一個(gè)高效的二叉搜索樹聯(lián)系簿,感興趣的可以了解下2024-01-01Go語言實(shí)現(xiàn)的簡單網(wǎng)絡(luò)端口掃描方法
這篇文章主要介紹了Go語言實(shí)現(xiàn)的簡單網(wǎng)絡(luò)端口掃描方法,實(shí)例分析了Go語言網(wǎng)絡(luò)程序的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02