特性:1、包名一般是小寫(xiě),用一個(gè)簡(jiǎn)短且有意義的名稱;2、包名一般要和所在的目錄同名,也可不同名,包名中不能包含“-”等特殊符號(hào);3、包一般使用域名作為目錄名稱,這樣能保證包名的唯一性;4、包名為main的包為應(yīng)用程序的入口包,編譯源碼時(shí)如果沒(méi)有main包時(shí),將無(wú)法編譯輸出可執(zhí)行的文件;5、一個(gè)目錄下的所有源碼文件只能屬于同一個(gè)包,同樣屬于同一個(gè)包的源碼文件不能放在多個(gè)目錄下。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
Go語(yǔ)言是使用包來(lái)組織源代碼的,包(package)是多個(gè) Go 源碼的集合,是一種高級(jí)的代碼復(fù)用方案。Go語(yǔ)言中為我們提供了很多內(nèi)置包,如 fmt、os、io 等。
任何源代碼文件必須屬于某個(gè)包,同時(shí)源碼文件的第一行有效代碼必須是package pacakgeName 語(yǔ)句,通過(guò)該語(yǔ)句聲明自己所在的包。
包的基本概念
Go語(yǔ)言的包借助了目錄樹(shù)的組織形式,一般包的名稱就是其源文件所在目錄的名稱,雖然Go語(yǔ)言沒(méi)有強(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"
。
Go語(yǔ)言包特性
-
包名一般是小寫(xiě)的,使用一個(gè)簡(jiǎn)短且有意義的名稱;
-
包名一般要和所在的目錄同名,也可以與其目錄不同名(但最好不要這樣做),包名中不能包含- 等特殊符號(hào)。
-
包一般使用域名作為目錄名稱,這樣能保證包名的唯一性,比如 GitHub 項(xiàng)目的包一般會(huì)放到
GOPATH/src/github.com/userName/projectName
目錄下。 -
包名為 main 的包為應(yīng)用程序的入口包,編譯不包含 main 包的源碼文件時(shí)不會(huì)得到可執(zhí)行文件。
-
一個(gè)文件夾下的所有源碼文件只能屬于同一個(gè)包,同樣屬于同一個(gè)包的源碼文件不能放在多個(gè)文件夾下。
Go語(yǔ)言包設(shè)計(jì)思想
任何包系統(tǒng)設(shè)計(jì)的目的都是為了簡(jiǎn)化大型程序的設(shè)計(jì)和維護(hù)工作,通過(guò)將一組相關(guān)的特性放進(jìn)一個(gè)獨(dú)立的單元以便于理解和更新,在每個(gè)單元更新的同時(shí)保持和程序中其它單元的相對(duì)獨(dú)立性。這種模塊化的特性允許每個(gè)包可以被其它的不同項(xiàng)目共享和重用,在項(xiàng)目范圍內(nèi)、甚至全球范圍統(tǒng)一的分發(fā)和復(fù)用。
每個(gè)包一般都定義了一個(gè)不同的名字空間用于它內(nèi)部的每個(gè)標(biāo)識(shí)符的訪問(wèn)。每個(gè)名字空間關(guān)聯(lián)到一個(gè)特定的包,讓我們給 類型、函數(shù) 等選擇簡(jiǎn)短明了的名字,這樣可以避免在我們使用它們的時(shí)候減少和其它部分名字的沖突。
當(dāng)我們修改了一個(gè)源文件,我們必須重新編譯該源文件對(duì)應(yīng)的包和所有依賴該包的其他包。即使是從頭構(gòu)建,Go 語(yǔ)言編譯器的編譯速度也明顯快于其它編譯語(yǔ)言。Go 語(yǔ)言的閃電般的編譯速度主要得益于三個(gè)語(yǔ)言特性。
顯式聲明
所有導(dǎo)入的包必須在每個(gè)文件的開(kāi)頭顯式聲明,這樣的話編譯器就沒(méi)有必要讀取和分析整個(gè)源文件來(lái)判斷包的依賴關(guān)系。
禁止循環(huán)依賴
禁止包的環(huán)狀依賴,因?yàn)闆](méi)有循環(huán)依賴,包的依賴關(guān)系形成一個(gè)有向無(wú)環(huán)圖,每個(gè)包可以被獨(dú)立編譯,而且很可能是被并發(fā)編譯。
目標(biāo)文件
編譯后包的目標(biāo)文件不僅僅記錄包本身的導(dǎo)出信息,目標(biāo)文件同時(shí)還記錄了包的依賴關(guān)系。因此,在編譯一個(gè)包的時(shí)候,編譯器只需要讀取每個(gè)直接導(dǎo)入包的目標(biāo)文件,而不需要遍歷所有依賴的的文件。
【