首頁 >後端開發 >Golang >golang無法導包怎麼辦?

golang無法導包怎麼辦?

coldplay.xixi
coldplay.xixi原創
2020-06-24 13:09:595623瀏覽

golang無法導包怎麼辦?

golang無法導包的解決方法:

#導入套件:

##標準套件使用的是給定的短路徑,如"fmt"、"net/http"

自己的包,需要在工作目錄(GOPATH)下指定一個目錄,improt 導入包,實際上就是基於工作目錄的資料夾目錄

導入套件的多種方式:

  • #直接根據

    $GOPATH/src目錄匯入import "test/lib"(路徑其實是$GOPATH/src/test/lib)

  • 別名導入:

    import alias_name "test/lib" ,這樣使用的時候,可以直接用別名

  • 使用點號導入:

    import . "test/lib",作用是使用的時候直接省略包名

使用下劃線導入:improt _ "test/lib",該操作其實只是引入該包。當導入一個包時,它所有的init()函數就會被執行,但有些時候並非真的需要使用這些包,僅僅是希望它的init()函數被執行而已。這個時候就可以使用_操作來引用該套件。即使用_操作引用包是無法透過包名來呼叫包中的導出函數,而是只是為了簡單的呼叫其init函數()。

往往這些init函數裡面是註冊自己包裡面的引擎,讓外部可以方便的使用,例如實作database/sql的包,在init函數裡面都是呼叫了

sql.Register(name string, driver driver.Driver)註冊自己,然後外部就可以使用了。

相對路徑導入

import"./model"//目前檔案同一目錄的model目錄,但是不建議這種方式import

套件的導入流程說明:      

  程式的初始化與執行都起始於main套件。如果main套件也導入了它的套件,那麼就會在編譯時將它們依序導入。有時一個包會被多個包同時導入,那麼它只會被導入一次(例如很多包可能都會用到fmt包,但它只會被導入一次,因為沒有必要導入多次)。

當一個包被導入時,如果該包還導入了其它的包,那麼會先將其它包導入進來,然後再對這些包中的包級常數和變量進行初始化,接著執行init函數(如果有的話),依次類推。等所有被導入的套件都載入完畢了,就會開始對main套件中的包級常數和變數進行初始化,然後執行main套件中的init函數(如果存在的話),最後執行main函數。下圖詳細地解釋了整個執行過程:

golang無法導包怎麼辦?

注意:

import導入Go套件有幾種方式,用途不同。程式碼統一儲存在工作目錄下,工作目錄裡邊會有很多個包,不同包依目錄組織,包下面由多個程式碼檔案組成。導入包時按包的唯一路徑進行導入,導入的包預設是必須要使用,如果不使用則編譯失敗,需要移除,減少不必要碼的引入,當然還有其他使用場景。預設情況下,我們使用檔案名稱做為包名,方便理解。不同包組織不同的功能實現,方便理解。

編譯時使用的是套件原始碼還是.a?

  一個非main套件在編譯後會產生一個

.a檔案(在臨時目錄下生成,除非使用go install安裝到$GOROOT$GOPATH下,否則你看不到.a),用於後續可執行程式連結使用。例如Go標準庫中的套件對應的原始碼部分路徑在:$GOROOT/src,而標準庫中套件編譯後的.a檔案路徑在$GOROOT/pkg/darwin_amd64下。一個奇怪的問題在我腦袋中升騰起來,編譯時,編譯器到底用的是.a還是原始碼?

  • 在使用第三方套件的時候,當原始碼和.a都已安裝的情況下,編譯器連結的是原始碼。而所謂的使用第三方包源碼,實際上是連結了以該最新原始碼編譯的臨時目錄下的

    .a檔而已。

  • Go標準函式庫中的套件也是這樣麼?對於標準函式庫,例如fmt而言,編譯時,到底使用的時$GOROOT/src下原始碼還是$GOROOT/pkg下已經編譯好的.a呢?不過與自訂套件不同的是,即便你修改了fmt包的源碼(未重新編譯GO安裝包),用戶源碼編譯時,也不會嘗試重新編譯fmt包的,依舊只是在鏈接時鏈接已經編譯好的fmt.a

Go語言中import後面路徑中最後的一個元素到底是套件名稱還是路徑名稱?

  • import後面的最後一個元素應該是路徑,就是目錄,不是套件名稱。但是很多時候,這個路徑名字和套件名字相同

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

 推薦教學:《go語言教學

以上是golang無法導包怎麼辦?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn