1. 程式人生 > >【Go】筆記三 | 庫原始碼檔案

【Go】筆記三 | 庫原始碼檔案

庫原始碼檔案不能被直接執行,它僅用於存放程式實體。只要遵從 Go 語言規範,這些程式實體就可以被其他程式碼使用。

首發地址:庫原始碼檔案

核心知識

  • 程式碼包宣告
  • 程式碼包引用
  • 模組級私有internal

程式實體是什麼?

在 Go 語言中,它是變數、常量、函式、結構體和介面的統稱。

程式碼包宣告的基本規則

  1. 第一條規則,同目錄下的原始碼檔案的程式碼包宣告語句要一致。也就是說,它們要同屬於一個程式碼包。這對於所有原始碼檔案都是適用的。
  2. 第二條規則,原始碼檔案宣告的程式碼包的名稱可以與其所在的目錄的名稱不同。在針對程式碼包進行構建時,生成的結果檔案的主名稱與其父目錄的名稱一致。

什麼樣的程式實體才可以被當前包外的程式碼引用?

名稱的首字母為大寫的程式實體才可以被當前包外的程式碼引用,否則它就只能被當前包內的其他程式碼引用。

對於程式實體,還可以使用怎樣的訪問許可權規則?

通過建立internal程式碼包讓一些程式實體僅僅能被當前模組中的其他程式碼引用。

這被稱為 Go 程式實體的第三種訪問許可權:模組級私有

具體規則是,internal程式碼包中宣告的公開程式實體僅能被該程式碼包的直接父包及其子包中的程式碼引用

當然,引用前需要先匯入這個interna包。

對於其他程式碼包,匯入該interna包都是非法的,無法通過編譯。

額外知識

如果需要匯入兩個程式碼包,而這兩個程式碼包的匯入路徑的最後一級是相同的,比如:dep/lib/flag和flag,那麼會產生衝突嗎?

import後路徑最後一級相同,不一定會衝突。

分為兩種情況:

  1. 如果資料夾下檔案宣告的包名相同,則肯定衝突,會報錯redeclared。
  2. 如果資料夾下檔案宣告的包名不同,也不會衝突。

如果會產生衝突,那麼怎樣解決這種衝突,有幾種方式?

  1. 給包設定別名,呼叫的時候來區分開不同的package,比如:import(b “bbbb”)
  2. 匯入的點操作,import(. “bbbb”)。這樣就可以直接呼叫bbbb下面的函式而不用再bbbb.funcname的方式呼叫。
  3. 如果只是想引入某包並沒有在程式碼中實際呼叫則可以這麼處理來避免衝突:import(_ “bbbb”)
  4. 像第一問一樣採取不同的包名宣告,畢竟包名不一定要和資料夾名一樣

小結

  • 同一個資料夾下,包的宣告語句需要相同,代表同一個包。
  • 包名不需要和其所在的資料夾名相同。
  • 首字母大小寫來代表可見性,大寫public/小寫private
  • 使用internal程式碼包模組級私有