golang 之 import 和 package 的使用
golang 使用包 package 來管理定義模組,可以使用 import 關鍵字來匯入使用。
- 如果匯入的是 go 自帶的包,則會去安裝目錄 $GOROOT/src 按包路徑載入,如 fmt 包
- 如果是我們 go get 安裝或自定義的包,則會去 $GOPATH/src 下載入
package 的定義
go import 的包是由 包路徑/包名 組合而成的,例如匯入我們自定義的 baz 包,包路徑為 $GOPATH/src/foo/bar/baz,baz 包的原始碼都存放在此目錄下。
我們需要規範的將 baz 包中原始碼的 package 定義為 baz,就定義好一個可 import 載入的的包了。
hello 模組
//$GOPATH/src/foo/bar/baz/hello.go package baz import ( "fmt" ) // 模組初始化函式 import 包時被呼叫 func init() { fmt.Println("hello module init function") } func Hello() { return "hello" }
world 模組
//$GOPATH/src/foo/bar/baz/world.go package baz import ( "fmt" ) // 模組初始化函式 import 包時被呼叫 func init() { fmt.Println("world module init function") } func World() string { return "world" }
package main import ( "fmt" "foo/bar/baz" //引入我們自定義的包 ) func main() { fmt.Println(baz.Hello(), baz.World()) }
import的使用
普通操作
import ( "fmt" "log" "foo/bar/baz" )
普通匯入就是按照載入機制,將要使用的包匯入進來,然後使用 packageName.MethodName 的方式呼叫包內的方法即可。注意如果要包方法在其他包中可以呼叫,包方法需要首字母大寫,例如:fmt.Println() fmt.Printf()。
別名操作
package main import ( "fmt" myBaz "foo/bar/baz" ) func main() { fmt.Println(myBaz.Hello(), myBaz.World()) }
如果兩個包的包名存在衝突,或者包名太長需要簡寫時,我們可以使用別名匯入來解決。
點操作
package main import ( "fmt" . "foo/bar/baz" ) func main() { fmt.Println(Hello(), World()) // 直接使用包內的方法即可 不需要顯式使用包名 }
. 匯入可以讓包內的方法註冊到當前包的上下文中,直接呼叫方法名即可,不需要再加包字首。
下劃線操作
package main import ( "fmt" _ "foo/bar/baz" ) func main() { fmt.Println(baz.Hello(), baz.World()) // 錯誤 _ 並沒有匯入包 只是引入並執行包模組的 init方法 }
_ 是包引用操作,只會執行包下各模組中的 init 方法,並不會真正的匯入包,所以不可以呼叫包內的其他方法。
相信對很多 phper 來說遵循 PSR4 的 Namespace 會將與路徑緊密相關名稱空間也作為類名的一部分,而 golang 則只將模組目錄資料夾名作為包名,前面的路徑只是用來匯入而和包名無關,還是有一點點需要注意的。