新聞中心
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
golang中導(dǎo)入包的方式有哪些?針對(duì)這個(gè)問題,這篇文章給出了相對(duì)應(yīng)的分析和解答,希望能幫助更多想解決這個(gè)問題的朋友找到更加簡(jiǎn)單易行的辦法。
Go語言是使用包來組織源代碼的,包(package)是多個(gè) Go 源碼的集合,是一種高級(jí)的代碼復(fù)用方案。Go語言中為我們提供了很多內(nèi)置包,如 fmt、os、io 等。
任何源代碼文件必須屬于某個(gè)包,同時(shí)源碼文件的第一行有效代碼必須是package pacakgeName 語句,通過該語句聲明自己所在的包。
Go語言的包借助了目錄樹的組織形式,一般包的名稱就是其源文件所在目錄的名稱,雖然Go語言沒有強(qiáng)制要求包名必須和其所在的目錄名同名,但還是建議包名和所在目錄同名,這樣結(jié)構(gòu)更清晰。
包可以定義在很深的目錄中,包名的定義是不包括目錄路徑的,但是包在引用時(shí)一般使用全路徑引用。比如在GOPATH/src/a/b/ 下定義一個(gè)包 c。在包 c 的源碼中只需聲明為package c,而不是聲明為package a/b/c,但是在導(dǎo)入 c 包時(shí),需要帶上路徑,例如import "a/b/c"。
導(dǎo)入包:
標(biāo)準(zhǔn)包使用的是給定的短路徑,如"fmt"、"net/http"
自己的包,需要在工作目錄(GOPATH)下指定一個(gè)目錄,improt 導(dǎo)入包,實(shí)際上就是基于工作目錄的文件夾目錄
導(dǎo)入包的多種方式:
直接根據(jù)
$GOPATH/src
目錄導(dǎo)入import "test/lib"
(路徑其實(shí)是$GOPATH/src/test/lib)
別名導(dǎo)入:
import alias_name "test/lib"
,這樣使用的時(shí)候,可以直接使用別名使用點(diǎn)號(hào)導(dǎo)入:
import . "test/lib"
,作用是使用的時(shí)候直接省略包名
使用下劃線導(dǎo)入:improt _ "test/lib",該操作其實(shí)只是引入該包。當(dāng)導(dǎo)入一個(gè)包時(shí),它所有的init()函數(shù)就會(huì)被執(zhí)行,但有些時(shí)候并非真的需要使用這些包,僅僅是希望它的init()函數(shù)被執(zhí)行而已。這個(gè)時(shí)候就可以使用_操作引用該包。即使用_操作引用包是無法通過包名來調(diào)用包中的導(dǎo)出函數(shù),而是只是為了簡(jiǎn)單的調(diào)用其init函數(shù)()。
往往這些init函數(shù)里面是注冊(cè)自己包里面的引擎,讓外部可以方便的使用,例如實(shí)現(xiàn)database/sql的包,在init函數(shù)里面都是調(diào)用了sql.Register(name string, driver driver.Driver)
注冊(cè)自己,然后外部就可以使用了。
相對(duì)路徑導(dǎo)入import"./model"http://
當(dāng)前文件同一目錄的model目錄,但是不建議這種方式import
包的導(dǎo)入過程說明:
程序的初始化和執(zhí)行都起始于main包。如果main包還導(dǎo)入了其它的包,那么就會(huì)在編譯時(shí)將它們依次導(dǎo)入。有時(shí)一個(gè)包會(huì)被多個(gè)包同時(shí)導(dǎo)入,那么它只會(huì)被導(dǎo)入一次(例如很多包可能都會(huì)用到fmt包,但它只會(huì)被導(dǎo)入一次,因?yàn)闆]有必要導(dǎo)入多次)。
當(dāng)一個(gè)包被導(dǎo)入時(shí),如果該包還導(dǎo)入了其它的包,那么會(huì)先將其它包導(dǎo)入進(jìn)來,然后再對(duì)這些包中的包級(jí)常量和變量進(jìn)行初始化,接著執(zhí)行init函數(shù)(如果有的話),依次類推。等所有被導(dǎo)入的包都加載完畢了,就會(huì)開始對(duì)main包中的包級(jí)常量和變量進(jìn)行初始化,然后執(zhí)行main包中的init函數(shù)(如果存在的話),最后執(zhí)行main函數(shù)。下圖詳細(xì)地解釋了整個(gè)執(zhí)行過程:
注意:
import導(dǎo)入Go包有幾種方式,用途不同。 代碼統(tǒng)一存儲(chǔ)在工作目錄下,工作目錄里邊會(huì)有很多個(gè)包,不同包按目錄組織,包下面由多個(gè)代碼文件組成。導(dǎo)入包時(shí)按包的唯一路徑進(jìn)行導(dǎo)入,導(dǎo)入的包默認(rèn)是必須要使用,如果不使用則編譯失敗,需要移除,減少不必要代碼的引入,當(dāng)然還有其他使用場(chǎng)景。默認(rèn)情況下,我們使用文件名做為包名,方便理解。不同包組織不同的功能實(shí)現(xiàn),方便理解。
Go語言中import后面路徑中最后的一個(gè)元素到底是包名還是路徑名?
import后面的最后一個(gè)元素應(yīng)該是路徑,就是目錄,并非包名。但是很多時(shí)候,這個(gè)路徑名字和包名字相同
import m "lib/math" m指代的是lib/math路徑下唯一的那個(gè)包 ,編譯器在這個(gè)路徑下如果發(fā)現(xiàn)了兩個(gè)包,是不允許的,編譯報(bào)錯(cuò)。
編譯時(shí)使用的是包源碼還是.a?
一個(gè)非main包在編譯后會(huì)生成一個(gè).a
文件(在臨時(shí)目錄下生成,除非使用go install安裝到$GOROOT
或$GOPATH
下,否則你看不到.a),用于后續(xù)可執(zhí)行程序鏈接使用。比如Go標(biāo)準(zhǔn)庫中的包對(duì)應(yīng)的源碼部分路徑在:$GOROOT/src
,而標(biāo)準(zhǔn)庫中包編譯后的.a文件路徑在$GOROOT/pkg/darwin_amd64
下。一個(gè)奇怪的問題在我腦袋中升騰起來,編譯時(shí),編譯器到底用的是.a還是源碼?
在使用第三方包的時(shí)候,當(dāng)源碼和.a均已安裝的情況下,編譯器鏈接的是源碼。而所謂的使用第三方包源碼,實(shí)際上是鏈接了以該最新源碼編譯的臨時(shí)目錄下的
.a
文件而已。Go標(biāo)準(zhǔn)庫中的包也是這樣么?對(duì)于標(biāo)準(zhǔn)庫,比如fmt而言,編譯時(shí),到底使用的時(shí)$GOROOT/src下源碼還是$GOROOT/pkg下已經(jīng)編譯好的.a呢?不過與自定義包不同的是,即便你修改了fmt包的源碼(未重新編譯GO安裝包),用戶源碼編譯時(shí),也不會(huì)嘗試重新編譯fmt包的,依舊只是在鏈接時(shí)鏈接已經(jīng)編譯好的fmt.a
關(guān)于golang中導(dǎo)入包的方式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
新聞標(biāo)題:golang中導(dǎo)入包的方式有哪些-創(chuàng)新互聯(lián)
瀏覽路徑:http://fisionsoft.com.cn/article/ddhipd.html