庫原始碼檔案

2021-10-16 09:29:09 字數 2154 閱讀 7210

庫原始碼檔案是不能被直接執行的原始碼檔案,它僅用於存放程式實體,這些程式實體可以被其他**使用(遵從你go語言規範),這裡的其他**是指與被使用的程式實體在同乙個原始碼檔案內,也可以在其他原始碼檔案,甚至其他**中。

程式實體是變數、常量、函式、結構體和介面的統稱。必須先宣告程式實體,然後再去使用,程式實體的名字被統稱為識別符號,識別符號可以是任何unicode編碼可以表示的字母字元、數字以及下劃線"_",但是首字母不能是數字。

1.同目錄下的原始碼檔案的**包宣告語句要一致。如果目錄中有命令原始碼檔案,那麼其他種類的原始碼檔案按也應該宣告屬於main包。

2.原始碼檔案宣告的**包的名稱可以與其所在的目錄的名稱不同。構建的時候,生成的結果檔案的主名稱與其父目錄的名稱一致。

go run的時候,要帶上demo.go和demo_lib.go,這兩個檔案都宣告自己屬於main包,雖然與其所在目錄的名稱不同,但是這些檔案宣告的包名一致。

另外一種執行方法就是在檔案所在目錄下執行,demo.go和demo_lib.go 都放在乙個路徑下

在demo檔案下新建乙個資料夾lib,把demo_lib.go放到lib資料夾中,**包宣告語句由package main 改為了package lib5。把hello函式改為hello,如果首字母大寫,則可以被其他的包訪問;如果首字母小寫,則只能在本包中使用。庫原始碼檔案demo_lib.go所在目錄的相對路徑是test/demo/lib,卻宣告自己是屬於lib5。在這種情況下,該包的匯入路徑是test/demo/lib還是test/demo/lib5?

構建或者安裝**包的時候,提供給go命令的路徑應該是目錄的相對路徑

執行完後,當前工作區(go env檢視gopath的路徑/home/liyingzhi/go)的pkg子目錄下會產生相應的歸檔檔案

1.在以import為前導的**包匯入語句中加入test/demo/lib,試圖匯入這個**包。

2.把對hello函式的呼叫改為對lib.hello函式的呼叫,其中的lib叫做限定符,旨在指明右邊的程式實體所在的**包。

第乙個錯誤提示意思是,我們匯入了test/demo/lib包,但沒有實際使用其中的任何程式實體。這在語言中是不被允許的,在編譯時就會導致失敗。後面所接的「as lib5」,說明雖然匯入了**包test/demo/lib,但是其中的程式實體應該是以lib5.為限定符。所以第二個錯誤提示,go命令找不到lib.這個限位符對應的**包。

根本原因就是我們在原始碼檔案中宣告所屬的**包與其所在目錄的名稱不同。原始碼檔案所在的目錄相對於src目錄的相對路徑就是它的**包匯入路徑,而實際使用其程式實體時給定的限定符要與它宣告所屬的**包名稱對應。

有個方式可以使上述構建成功完成:

1.package lib5修改為package lib

demo_lib.go中那個函式名稱hello的首字母改為大寫,實際上是涉及了go語言中對於程式實體訪問許可權的規則。go語言自然地將程式實體的訪問許可權劃分了包級的私有的和公開的。對於包級私有的程式實體,即使你匯入了它所在的**包也無法引用到它。

go1.5及後續版本中,可以通過建立internal**包讓一些程式實體僅僅能被當前模組中的其他**引用。這被稱為go程式實體的第三章訪問許可權;模組級私有。

具體規則是,internal**包中宣告的公開程式實體僅能被該**包的直接父包及其子包中的**引用。引用前需要先導入這個internal包。對於其他**包,匯入該internal包都是非法的,無法通過編譯。

如何建立庫原始碼檔案

建立乙個資料夾 建立若干個.go 檔案,並宣告他們歸屬於同乙個包 util 是存放date.go time.go 的目錄 但是包不見得就是util 因為宣告的包名可以和資料夾的名字不一致,但是規範的做法最好是一致的 同乙個包下,不能宣告名稱相同的方法,比如date.go 中有乙個print 方法,那...

Go 筆記三 庫原始碼檔案

庫原始碼檔案不能被直接執行,它僅用於存放程式實體。只要遵從 go 語言規範,這些程式實體就可以被其他 使用。在 go 語言中,它是變數 常量 函式 結構體和介面的統稱。第一條規則,同目錄下的原始碼檔案的 包宣告語句要一致。也就是說,它們要同屬於乙個 包。這對於所有原始碼檔案都是適用的。第二條規則,原...

Mac 檔案處理庫,原始碼分析

johnsundell files 這個檔案處理庫,封裝的挺好 本文看一下其源 磁碟上的分為兩種,檔案和資料夾public enum locationkind檔案和資料夾的共性是,他有乙個路徑,操作他們,都要filemanager 將檔案和資料夾的共性,封裝為storage 增刪改查的具體實現,交給...