golang 之 import 和 package 的使用

golang 使用包 package 來管理定義模塊,能夠使用 import 關鍵字來導入使用。php

  • 若是導入的是 go 自帶的包,則會去安裝目錄 $GOROOT/src 按包路徑加載,如 fmt 包
  • 若是是咱們 go get 安裝或自定義的包,則會去 $GOPATH/src 下加載

package 的定義

package 的存放位置是以 $GOPATH/src 做爲根目錄,而後靈活的按照目錄去組織,且包名需與最後一級目錄名一致。golang

例如咱們自定義 baz 包,包模塊的存放位置則爲 $GOPATH/src/foo/bar/baz,baz 包的源碼都存放在此目錄下,foo/bar/baz 則做爲包路徑被 import 載入。函數

咱們須要規範的將 baz 包中源碼的 package 定義爲 baz,就定義好一個可 import 載入的的包了。spa

hello 模塊code

//$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 模塊get

//$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())
}

若是兩個包的包名存在衝突,或者包名太長鬚要簡寫時,咱們能夠使用別名導入來解決。string

點操做

package main

import (
    "fmt"
    . "foo/bar/baz"
)

func main() {
    fmt.Println(Hello(), World()) // 直接使用包內的方法便可 不須要顯式使用包名
}

. 導入能夠讓包內的方法註冊到當前包的上下文中,直接調用方法名便可,不須要再加包前綴。it

下劃線操做

package main

import (
    "fmt"
    _ "foo/bar/baz"
)

func main() {
    fmt.Println(baz.Hello(), baz.World()) // 錯誤 _ 並無導入包 只是引入並執行包模塊的 init  方法
}

_ 是包引用操做,只會執行包下各模塊中的 init 方法,並不會真正的導入包,因此不能夠調用包內的其餘方法。io

相信對不少 phper 來講遵循 PSR4 的 Namespace 會將與路徑緊密相關命名空間也做爲類名的一部分,而 golang 則只將模塊目錄文件夾名做爲包名,前面的路徑只是用來導入而和包名無關,仍是有一點點須要注意的。

相關文章
相關標籤/搜索