這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1、包簡述
GO本身沒有項目的概念,只有包,包括可執行包和不可執行包,而不管什麼包,都應該包含在 $GOPATH/src 目錄下,GO命令和編譯器會在 $GOPATH/src 目錄下搜尋相應的包。比如 import "logging" 則會在所有設定的 $GOPATH/src 下去尋找相應包,而不僅僅是當前項目中。
2、包聲明
在每一個代碼檔案中,都需要使用 package 命令來聲明包名,所以在GO語言中,代碼檔案屬於哪個包與檔案目錄結構沒有必然聯絡,但習慣上我們會設定成跟目錄結構相同。帶來的問題就是當想修改檔案夾名的時候,會想去修改該檔案夾中所有代碼中的聲明的包名。
注意,命令源碼檔案,即 main 函數所在的包,必須聲明為 main 包。
3、包匯入
通過 import 命令來匯入包,尋找的範圍就是簡述裡說的 $GOPATH/src 定義的路徑。代碼中使用某外包的函數時,需要使用 "最後一個包名.函數名" 的方式,所以如果匯入如下情況時,在使用上就會出現問題:
import ( "json" "my/json")
那我們需要給包名起個不同的別名,如:
import ( . "json" myjson "my/json")
這樣就可以使用 myjson.function() 來調用 my/json 中的函數,而別名為 . 時,表示可以不使用包名首碼直接使用包中的函數,如 json 包裡有一個 to_json() ,則可以直接使用。
注意,從這裡也可以看出來,同一個包中的不同代碼檔案,其函數名是不能重複的。
4、包初始化
GO語言編譯非常嚴格,如果引入一個包,卻沒有使用它,就會編譯報錯。但在開發調試過程中,這樣就會顯得非常麻煩,我們可以在匯入包前加上 _ ,就可以使編譯通過。其實,該方法的真正作用是初始化該包,執行該包中的 init() 方法。比如我們封裝了一個DB操作,我們可以把串連資料庫的操作放在 init 函數中,然後在啟動服務的代碼檔案中通過 _ 的方法引入該包,就可以自動執行其 init 函數,且通過編譯了。
注意,如果包中的多個代碼檔案都有 init 函數,則都會執行,但執行順序是不可預期的。