go 學習 ---package
1、包簡述
GO本身沒有專案的概念,只有包,包括可執行包和不可執行包,而不管什麼包,都應該包含在 $GOPATH/src 目錄下,GO命令和編譯器會在 $GOPATH/src 目錄下搜尋相應的包。比如 import "logging" 則會在所有設定的 $GOPATH/src 下去尋找相應包,而不僅僅是當前專案中。
2、包宣告
在每一個程式碼檔案中,都需要使用 package 命令來宣告包名,所以在GO語言中,程式碼檔案屬於哪個包與檔案目錄結構沒有必然聯絡,但習慣上我們會設定成跟目錄結構相同。帶來的問題就是當想修改資料夾名的時候,會想去修改該資料夾中所有程式碼中的宣告的包名。
注意,命令原始碼檔案,即 main 函式所在的包,必須宣告為 main 包,main 包中要求有且僅有一個命令原始碼檔案。
3、包匯入
通過 import 命令來匯入包,查詢的範圍就是簡述裡說的 $GOPATH/src 定義的路徑。程式碼中使用某外包的函式時,需要使用 "最後一個包名.函式名" 的方式,所以如果匯入如下情況時,在使用上就會出現問題:
import ( "json" "my/json" )
那我們需要給包名起個不同的別名,如:
import ( . "json" myjson "my/json" )
這樣就可以使用 myjson.function() 來呼叫 my/json 中的函式,而別名為 . 時,表示可以不使用包名字首直接使用包中的函式,如 json 包裡有一個 to_json() ,則可以直接使用。
注意,從這裡也可以看出來,同一個包中的不同程式碼檔案,其函式名是不能重複的。
可以下載一個外掛,自動引入或刪除import:go get golang.org/x/tools/cmd/goimports
4、包初始化
GO語言編譯非常嚴格,如果引入一個包,卻沒有使用它,就會編譯報錯。但在開發除錯過程中,這樣就會顯得非常麻煩,我們可以在將匯入包重新命名為 _,就可以使編譯通過。其實,該做法的意義在於初始化該包,執行該包中的 init() 方法。比如我們封裝了一個DB操作,我們可以把連線資料庫的操作放在 init 函式中,然後在啟動服務的程式碼檔案中通過 _ 的方法引入該包,就可以自動執行其 init 函式,且通過編譯了。
注意,如果包中的多個程式碼檔案都有 init 函式,則都會執行,但執行順序是不可預期的。
5、包訪問許可權
包裡定義的方法,如果首字母是小寫,則表示是包內私有的,如果首字母是大寫,就可以在其它包中被訪問
6、非標準包
golang.org/x/... 目錄下儲存了一些由Go團隊設計、維護,對網路程式設計、國際化檔案處理、移動平臺、影象處理、加密解密、開發者工具提供支援的擴充套件包。未將這些擴充套件包加入到標準庫原因有二,一是部分包仍在開發中,二是對大多數Go語言的開發者而言,擴充套件包提供的功能很少被使用。