溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

golang中導(dǎo)入包的方式有哪些

發(fā)布時間:2020-06-24 14:17:25 來源:億速云 閱讀:435 作者:元一 欄目:編程語言

golang中導(dǎo)入包的方式有哪些?針對這個問題,這篇文章給出了相對應(yīng)的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。

Go語言是使用包來組織源代碼的,包(package)是多個 Go 源碼的集合,是一種高級的代碼復(fù)用方案。Go語言中為我們提供了很多內(nèi)置包,如 fmt、os、io 等。
任何源代碼文件必須屬于某個包,同時源碼文件的第一行有效代碼必須是package pacakgeName 語句,通過該語句聲明自己所在的包。

Go語言的包借助了目錄樹的組織形式,一般包的名稱就是其源文件所在目錄的名稱,雖然Go語言沒有強(qiáng)制要求包名必須和其所在的目錄名同名,但還是建議包名和所在目錄同名,這樣結(jié)構(gòu)更清晰。
包可以定義在很深的目錄中,包名的定義是不包括目錄路徑的,但是包在引用時一般使用全路徑引用。比如在GOPATH/src/a/b/ 下定義一個包 c。在包 c 的源碼中只需聲明為package c,而不是聲明為package a/b/c,但是在導(dǎo)入 c 包時,需要帶上路徑,例如import "a/b/c"。

導(dǎo)入包:

標(biāo)準(zhǔn)包使用的是給定的短路徑,如"fmt"、"net/http"

自己的包,需要在工作目錄(GOPATH)下指定一個目錄,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" ,這樣使用的時候,可以直接使用別名

  • 使用點(diǎn)號導(dǎo)入:import . "test/lib",作用是使用的時候直接省略包名

使用下劃線導(dǎo)入:improt _ "test/lib",該操作其實(shí)只是引入該包。當(dāng)導(dǎo)入一個包時,它所有的init()函數(shù)就會被執(zhí)行,但有些時候并非真的需要使用這些包,僅僅是希望它的init()函數(shù)被執(zhí)行而已。這個時候就可以使用_操作引用該包。即使用_操作引用包是無法通過包名來調(diào)用包中的導(dǎo)出函數(shù),而是只是為了簡單的調(diào)用其init函數(shù)()。

往往這些init函數(shù)里面是注冊自己包里面的引擎,讓外部可以方便的使用,例如實(shí)現(xiàn)database/sql的包,在init函數(shù)里面都是調(diào)用了sql.Register(name string, driver driver.Driver)注冊自己,然后外部就可以使用了。

相對路徑導(dǎo)入import"./model"//當(dāng)前文件同一目錄的model目錄,但是不建議這種方式import

包的導(dǎo)入過程說明:      

  程序的初始化和執(zhí)行都起始于main包。如果main包還導(dǎo)入了其它的包,那么就會在編譯時將它們依次導(dǎo)入。有時一個包會被多個包同時導(dǎo)入,那么它只會被導(dǎo)入一次(例如很多包可能都會用到fmt包,但它只會被導(dǎo)入一次,因為沒有必要導(dǎo)入多次)。

當(dāng)一個包被導(dǎo)入時,如果該包還導(dǎo)入了其它的包,那么會先將其它包導(dǎo)入進(jìn)來,然后再對這些包中的包級常量和變量進(jìn)行初始化,接著執(zhí)行init函數(shù)(如果有的話),依次類推。等所有被導(dǎo)入的包都加載完畢了,就會開始對main包中的包級常量和變量進(jìn)行初始化,然后執(zhí)行main包中的init函數(shù)(如果存在的話),最后執(zhí)行main函數(shù)。下圖詳細(xì)地解釋了整個執(zhí)行過程:

golang中導(dǎo)入包的方式有哪些

注意:

import導(dǎo)入Go包有幾種方式,用途不同。 代碼統(tǒng)一存儲在工作目錄下,工作目錄里邊會有很多個包,不同包按目錄組織,包下面由多個代碼文件組成。導(dǎo)入包時按包的唯一路徑進(jìn)行導(dǎo)入,導(dǎo)入的包默認(rèn)是必須要使用,如果不使用則編譯失敗,需要移除,減少不必要代碼的引入,當(dāng)然還有其他使用場景。默認(rèn)情況下,我們使用文件名做為包名,方便理解。不同包組織不同的功能實(shí)現(xiàn),方便理解。

Go語言中import后面路徑中最后的一個元素到底是包名還是路徑名?

  • import后面的最后一個元素應(yīng)該是路徑,就是目錄,并非包名。但是很多時候,這個路徑名字和包名字相同

  • import m "lib/math"  m指代的是lib/math路徑下唯一的那個包 ,編譯器在這個路徑下如果發(fā)現(xiàn)了兩個包,是不允許的,編譯報錯。

編譯時使用的是包源碼還是.a?

一個非main包在編譯后會生成一個.a文件(在臨時目錄下生成,除非使用go install安裝到$GOROOT$GOPATH下,否則你看不到.a),用于后續(xù)可執(zhí)行程序鏈接使用。比如Go標(biāo)準(zhǔn)庫中的包對應(yīng)的源碼部分路徑在:$GOROOT/src,而標(biāo)準(zhǔn)庫中包編譯后的.a文件路徑在$GOROOT/pkg/darwin_amd64下。一個奇怪的問題在我腦袋中升騰起來,編譯時,編譯器到底用的是.a還是源碼?

  • 在使用第三方包的時候,當(dāng)源碼和.a均已安裝的情況下,編譯器鏈接的是源碼。而所謂的使用第三方包源碼,實(shí)際上是鏈接了以該最新源碼編譯的臨時目錄下的.a文件而已。

  • Go標(biāo)準(zhǔn)庫中的包也是這樣么?對于標(biāo)準(zhǔn)庫,比如fmt而言,編譯時,到底使用的時$GOROOT/src下源碼還是$GOROOT/pkg下已經(jīng)編譯好的.a呢?不過與自定義包不同的是,即便你修改了fmt包的源碼(未重新編譯GO安裝包),用戶源碼編譯時,也不會嘗試重新編譯fmt包的,依舊只是在鏈接時鏈接已經(jīng)編譯好的fmt.a

關(guān)于golang中導(dǎo)入包的方式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI