概念:
? ? ? ? 在Go 語言中,包由一個或多個保存在同一目錄的源碼文件組成,包名宇目錄名無關,但是通常大家習慣包名和目錄名保持一致,同一目錄的源碼文件必須使用相同的包名。
? ? ? ? 包的用途類似于其他語言的命名空間,可以限制成員的作用域和訪問權限,無論是否在同一源碼文件的成員,只要在同一個包內,成員均可被訪問,但是只有首字母大寫的成員為導出成員,可以在包外訪問。
????????除了基于首字母大小寫控制訪問權限,在 Go 語言中,還可以使用內部包機制來控制訪問權限,內部包源碼文件存放于包目錄的子目錄,內部包源碼文件的導出成員僅能被其父目錄下的包訪問。
包聲明:
????????在 Go 語言中,每一個源碼文件開頭都必須使用關鍵字 package 進行包聲明(定義包名)。主要目的是限制包內成員的作用域和訪問權限,也是當前包被其他包導入時的標識符。包名是導入路徑的最后一段,所以不同導入路徑的包名可以相同。
包導入:
????????導入路徑:Go 語言中的每一個包都是通過唯一的字符串進行標識,稱為導入路徑。
導入聲明:在 Go 源碼文件中,可以在 package 包聲明后面導入一個或多個包,每一個導入的包可以單獨使用關鍵字 import 指定一個導入路徑,也可以使用圓括號括起來一組導入路徑,使用關鍵字 import 一次導入多個包,通常大家更喜歡使用第二種方式。如果在同一個包中導入兩個相同包名的包,需要至少為其中一個包起別名來避免沖突,別名僅對當前源碼文件有效。有時別名也不止用于避免包名沖突,對于一些較長的包名,為了方便使用,通常也會定義一個短別名。
空白導入:如果導入的包,在源碼中沒有使用該包名,編譯時就會產生錯誤。但在實際項目開發中,有時我們僅需要使用一個包中的變量和執行它的 init 函數,為了避免此類情況導致的編譯錯誤,我們可以在導入路徑前面使用空白標識符 “_”?。
包創建:
????????在創建一個包時,盡量使用簡短的包名,但是要盡可能保持包名的可讀性和無歧義,如果需要用到與 go 關鍵字同名的包名,一般采用其復數形式。