package介紹
在go語言中,每一個go檔案都必須宣告package,和java語言一樣。go語言中,通常使用目錄來組織包,包的名稱建議和目錄名稱一致。
package宣告和使用
目錄結構:
p1.go
package p
import "fmt";
func init(){
fmt.Println("初始化函式。。。")
}
複製程式碼
上面的程式碼是目錄p下面的p1.go的程式碼,同時在第一行宣告瞭package,package的名稱和目錄是一樣的。
在上面的程式碼中,只有一個init方法,這個方法是一個初始化函式。這個方法會在main函式執行之前被呼叫。
main.go
package main
import (
_ "./p"
)
func main(){
}
//初始化函式。。。
複製程式碼
上面的程式碼,在執行之後會輸出"初始化函式。。。",這是因為在main.go中匯入了p包,而在main方法執行之前,回首先呼叫p包下的每一個go檔案中定義好的init函式。
注意:在上面的程式碼中,我們在import中匯入p的時候在前面加了_,這是因為在go語言中,匯入沒有使用到的包會報錯,在前面加_表示,go語言需要對p包做初始化操作,也就是呼叫init函式。
包級別的私有變數和公開變數
p1.go
package p
import "fmt";
//這個外界可以訪問
var PVar int = 10
//這個是包私有的,外界不能訪問
var str string = "hello zhongzhong";
//這個外界也可以訪問
func Fn(){
fmt.Println("from p package");
}
func init(){
fmt.Println("初始化函式。。。")
}
複製程式碼
main.go
package main
import (
"fmt"
"./p"
)
func main(){
fmt.Println("p.PVar=",p.PVar)
p.Fn();
}
//初始化函式。。。
//p.PVar= 10
//from p package
複製程式碼
從上面的程式碼執行結果可以看出,在呼叫main函式之前,呼叫p1.go的init函式。在go語言中,如果需要讓別的包可以訪問到自己包裡面的變數,函式,需要將變數,函式的名稱首字母大寫。上面的程式碼中函式Fn和變數PVar都是可以在main包中訪問的,而str不能在main包中訪問,它屬於p包的私有變數,外界不能訪問。
現在我們在p目錄下,新增一個檔案p2.go p2.go
package p
import "fmt"
func init(){
fmt.Println("p2.go的初始化函式開始==")
fmt.Println(str);
fmt.Println("p2.go的初始化函式結束==")
}
複製程式碼
再次執行main.go,輸出結果如下:
//始化函式。。。
//p2.go的初始化函式開始==
//hello zhongzhong
//p2.go的初始化函式結束==
//p.PVar= 10
//from p package
複製程式碼
從上面的結果可以看出,首先執行了p1.go中的init函式,然後是p2.go中的init函式,最後是main.go檔案中的main函式。
在p2.go中的init函式中,我們可以直接訪問到p1.go中的變數str,而不需要任何匯入操作。
總結:
- go語言通過package來宣告包,包的名稱建議和目錄名稱一致
- go語言在呼叫mian函式之前,會呼叫使用到的每一個檔案中的init函式
- package名稱一樣的go程式必須放在同一個目錄下
- go語言中,首字母大寫的變數和函式是公開的,首字母小寫的變數和函式,在包內是公開的,對其他的包不可見