日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

golang导入包的几个说明:import

發(fā)布時(shí)間:2024/4/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang导入包的几个说明:import 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

導(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í)候就可以使用_操作引用該包。即使用_操作引用包是無(wú)法通過(guò)包名來(lái)調(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" ?//當(dāng)前文件同一目錄的model目錄,但是不建議這種方式import

包的導(dǎo)入過(guò)程說(shuō)明: ? ? ?

  程序的初始化和執(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)闆](méi)有必要導(dǎo)入多次)。當(dāng)一個(gè)包被導(dǎo)入時(shí),如果該包還導(dǎo)入了其它的包,那么會(huì)先將其它包導(dǎo)入進(jìn)來(lái),然后再對(duì)這些包中的包級(jí)常量和變量進(jìn)行初始化,接著執(zhí)行init函數(shù)(如果有的話),依次類推。等所有被導(dǎo)入的包都加載完畢了,就會(huì)開(kāi)始對(duì)main包中的包級(jí)常量和變量進(jìn)行初始化,然后執(zhí)行main包中的init函數(shù)(如果存在的話),最后執(zhí)行main函數(shù)。下圖詳細(xì)地解釋了整個(gè)執(zhí)行過(guò)程:

?

注意:

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),方便理解。

?

編譯時(shí)使用的是包源碼還是.a?

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

  • 在使用第三方包的時(shí)候,當(dāng)源碼和.a均已安裝的情況下,編譯器鏈接的是源碼。而所謂的使用第三方包源碼,實(shí)際上是鏈接了以該最新源碼編譯的臨時(shí)目錄下的.a文件而已。
  • Go標(biāo)準(zhǔn)庫(kù)中的包也是這樣么?對(duì)于標(biāo)準(zhǔn)庫(kù),比如fmt而言,編譯時(shí),到底使用的時(shí)$GOROOT/src下源碼還是$GOROOT/pkg下已經(jīng)編譯好的.a呢?不過(guò)與自定義包不同的是,即便你修改了fmt包的源碼(未重新編譯GO安裝包),用戶源碼編譯時(shí),也不會(huì)嘗試重新編譯fmt包的,依舊只是在鏈接時(shí)鏈接已經(jīng)編譯好的fmt.a

Go語(yǔ)言中import后面路徑中最后的一個(gè)元素到底是包名還是路徑名?

  • import后面的最后一個(gè)元素應(yīng)該是路徑,就是目錄,并非包名。但是很多時(shí)候,這個(gè)路徑名字和包名字相同
  • import m "lib/math"? m指代的是lib/math路徑下唯一的那個(gè)包 ,編譯器在這個(gè)路徑下如果發(fā)現(xiàn)了兩個(gè)包,是不允許的,編譯報(bào)錯(cuò)

?

1、https://yushuangqi.com/blog/2016/understanding-golang-import-package.html

2、https://blog.csdn.net/zhangzhebjut/article/details/25564457

3、https://tonybai.com/2015/03/09/understanding-import-packages/

轉(zhuǎn)載于:https://www.cnblogs.com/shengulong/p/10230644.html

總結(jié)

以上是生活随笔為你收集整理的golang导入包的几个说明:import的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。