【Go學習筆記7】go語言中的模組(包)

zhongzhong05發表於2017-12-10

package介紹

在go語言中,每一個go檔案都必須宣告package,和java語言一樣。go語言中,通常使用目錄來組織包,包的名稱建議和目錄名稱一致。

package宣告和使用

目錄結構:

【Go學習筆記7】go語言中的模組(包)

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語言中,首字母大寫的變數和函式是公開的,首字母小寫的變數和函式,在包內是公開的,對其他的包不可見

相關文章