Golang包管理

每種編程語言都有自己的導(dǎo)包風(fēng)格绞呈,從而來管理自己編寫的程序虏劲。接下來簡單介紹下go中導(dǎo)包語法和部分機制赊抖。

1. Golang包導(dǎo)入

語法

  • 與其他程序語言不同吊履,go導(dǎo)入依賴是根據(jù)包名來進行導(dǎo)入的,如打印函數(shù)Println()中使用的導(dǎo)包語句為:
import "fmt"

import代表著導(dǎo)包動作或?qū)О袨?br> "fmt"用字符串表示爷贫,表示要導(dǎo)入的包名

多包導(dǎo)入

  • 如果涉及到導(dǎo)入多個包的行為時认然,可以使用:
import "fmt"
import "os"
  • 導(dǎo)入多包名時,可能會重復(fù)出現(xiàn)上示代碼塊中同樣的import動作漫萄,go中可以簡化重復(fù)的關(guān)鍵字卷员,并用( )中填充所需要導(dǎo)入的多個包名,如:
import (
  "fmt"
  "os"
)

導(dǎo)包順序

  • 在導(dǎo)入包的過程中腾务,我們可以決定導(dǎo)入包的分組順序毕骡,且可以用空行來凸顯導(dǎo)包模塊的意義
  • 在gofmt中,默認將go語言自帶的包置于import模塊上方,而其他包如第三方則github等則置于import模塊的下方未巫,如:
import (
    "fmt"
    "os"

    "golang.org/x/net/ipv4"
)


2. 包循環(huán)依賴問題

錯誤提示

import cycle not allowed

問題原因

  • 簡單示意圖:


    循環(huán)導(dǎo)包問題
  • 以A/B兩個包舉栗窿撬,如果packageA導(dǎo)入了packageB,而packageB某go文件的 import 中又出現(xiàn)導(dǎo)入packageA的語句時橱赠,就會報錯尤仍。
  • 多包導(dǎo)入時,import邏輯出現(xiàn)環(huán)形結(jié)構(gòu)狭姨,則會出現(xiàn)包循環(huán)依賴問題

解決辦法

循環(huán)導(dǎo)包問題是go以包作為單元進行導(dǎo)入的弊端宰啦,業(yè)務(wù)中盡量規(guī)劃好層級關(guān)系,不要出現(xiàn)同層不同包的調(diào)用關(guān)系
(1) 將A/B放于同一個包下饼拍,同包之間不需要import赡模,故不會出現(xiàn)循環(huán)導(dǎo)包問題
弊端:同包情況下,容易導(dǎo)致所有業(yè)務(wù)邏輯代碼出現(xiàn)在同一個包下师抄,包關(guān)系分割不開
(2) 將A/B向上抽出一個關(guān)系層漓柑,將A/B的import和處理邏輯都放在上層
弊端:A/B在同級關(guān)系中又向上抽離出一層,層級關(guān)系過多



3. 包聲明問題

聲明和使用

go導(dǎo)入包時叨吮,默認是用import包的最后包目錄名作為使用名辆布,如下述代碼:

import (
    "fmt"

    "github.com/go-sql-driver/mysql"
)

導(dǎo)入github.com/go-sql-driver/mysql后,我們可以用mysql.XXX( )來使用調(diào)用mysql包中的變量茶鉴、函數(shù)或方法

別名

在項目搭建過程中锋玲,難免會遇到同包名的沖突情況,而go是嚴格禁止出現(xiàn)相同包名的情況涵叮。因此惭蹂,我們可以向import的同名包聲明下別名,如

import (
    "github.com/go-sql-driver/mysql"
    rename "github.com/myTest/mysql" // 此包純屬虛構(gòu)

)

在使用過程中割粮,我們便可直接利用rename.XXX( )來調(diào)用myTest/mysql中的函數(shù)

匿名

go中如果導(dǎo)入了包但是沒有使用盾碗,則會編譯報錯:

Unused import
可以使用匿名的方式進行導(dǎo)包,如:

import (
    _ "context"
)

場景:用來實現(xiàn)編譯時機制舀瓢,在main函數(shù)中有目的性的加載相應(yīng)的程序包

命名規(guī)則

(1) 言簡意賅廷雅,盡量使用簡短的詞語,且能望文生義京髓,讓包使用者能夠一眼看出包的功能
(2) 盡量避開go自身的包名航缀,如"context", "fmt", "os"等



4. 包使用范圍

??Java語言中,我們常用public朵锣、protected谬盐、default和private等關(guān)鍵字來表示變量和方法的使用范圍甸私,但go中并沒有類似的關(guān)鍵字來表示范圍诚些,而是通過聲明變量和方法名的首字母大小寫來區(qū)分。如:

大寫

fmt.Prinlnt("大寫表示外部包可以使用該方法")

其中fmt的Println( )方法定義為:

func Println(a ...interface{}) (n int, err error) {
    return Fprintln(os.Stdout, a...)
}

上述聲明中表示Println( )方法可以暴露給外部,因此我們在導(dǎo)入fmt包使用的時候并不會出現(xiàn)問題诬烹。

小寫

同在fmt包下砸烦,有些方法以小寫字母開頭,這類方法表示不能夠在導(dǎo)入包的情況下使用绞吁,而只能被同package下的其他方法所調(diào)用幢痘。
如:

func tooLarge(x int) bool {
    const max int = 1e6
    return x > max || x < -max
}

假設(shè)我們從外部調(diào)用,就會看到相應(yīng)的報錯信息:

Unexported function 'tooLarge' usage



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末家破,一起剝皮案震驚了整個濱河市颜说,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汰聋,老刑警劉巖门粪,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烹困,居然都是意外死亡玄妈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門髓梅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拟蜻,“玉大人,你說我怎么就攤上這事枯饿≡凸” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵鸭你,是天一觀的道長屈张。 經(jīng)常有香客問我,道長袱巨,這世上最難降的妖魔是什么阁谆? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮愉老,結(jié)果婚禮上场绿,老公的妹妹穿的比我還像新娘。我一直安慰自己嫉入,他們只是感情好焰盗,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咒林,像睡著了一般熬拒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垫竞,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天澎粟,我揣著相機與錄音蛀序,去河邊找鬼。 笑死活烙,一個胖子當(dāng)著我的面吹牛徐裸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啸盏,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼重贺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了回懦?” 一聲冷哼從身側(cè)響起气笙,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怯晕,沒想到半個月后健民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡贫贝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年秉犹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚晚。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡崇堵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出客燕,到底是詐尸還是另有隱情鸳劳,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布也搓,位于F島的核電站赏廓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏傍妒。R本人自食惡果不足惜幔摸,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颤练。 院中可真熱鬧既忆,春花似錦、人聲如沸嗦玖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宇挫。三九已至苛吱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間器瘪,已是汗流浹背翠储。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工拼缝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彰亥。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像衰齐,于是被迫代替她去往敵國和親任斋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 包管理的重要性不言而喻耻涛。隨著項目的推進废酷,沒有合適的包管理,每一次迭代都將成為開發(fā)者的噩夢抹缕。尤其是對于進行持續(xù)集成的...
    suoga閱讀 4,464評論 4 10
  • &痛點: 使用 go get 命令 自動下載相應(yīng)的包時澈蟆,由于國內(nèi)網(wǎng)絡(luò)原因會出現(xiàn)各種 類似于 golang.org...
    山貓Lynx閱讀 1,260評論 0 0
  • (一)govender的功能 govender 是對Golang的包依賴管理的一個插件,該工具將項目依賴的外部包拷...
    L白水飄萍閱讀 5,606評論 0 1
  • win10系統(tǒng)卓研,未使用代理 使用鏡像前綴 使用包管理服務(wù) 打開goland編輯器關(guān)于mod部分image.png正...
    路人愛早茶閱讀 198評論 0 0
  • 更多精彩文章https://deepzz.com “依賴地獄”是每個程序員在成長之路上都會面臨的情況奏赘,首先我們通過...
    deepzz閱讀 1,755評論 0 1