Go語言學習筆記(六) [包]

日期:2014年7月30日
 
1、定義:包時函數和數據的集合。使用package關鍵字定義一個包,文件名不需要與包名一致,包名約定使用小寫字符,Go包可以由多個文件組成,但是需要使用相同的package<name>,包中方法的調用方式:<packag>.Fuction()
 
現在新建一個文件even.go,even.go的文件內容如下:
package even
//判斷是否是偶數
func Even(i int) bool {  
 return i % 2 == 0
}
//判斷是否是奇數
func odd(i int) bool {
 return i % 2 == 1
}
 
裏面定義了兩個函數,一個是Even,一個是odd,Even首字母大寫,odd首字母小寫,Even函數可以在包外訪問,而odd函數不可以,這是Go語言的約定——公有函數的名字以大寫字母開頭,私有函數的名字以小寫字母開頭。這種規則同樣適用於定義在包中的新類型、全局變量等,而且"大寫"的含義並不僅限於US ASCII,它被擴展到了所有的大小寫字母表(拉丁文、希臘文、斯拉夫文、亞美尼亞文和埃及古文)。
 
構建even包:
//打印GOPATH路徑,注意GOPATH路徑時在GO語言環境安裝的時候設定的
$ echo $GOPATH  
E:\ProgramFiles\Go\Go\GoImportPkg
//在GOPATH下面新建文件夾/src/even
$ mkdir $GOPATH/src/even
//把even.go文件拷貝到新建的目錄下面
$ cp even.go $GOPATH/src/even
//跳轉到新建的目錄
cd $GOPATH/src/even
//打印當前目錄信息
$ pwd
/e/ProgramFiles/Go/Go/GoImportPkg/src/even
//編譯even.go
go bulid 
//安裝even包
go install
 
執行上述步驟之後,到$GOPATH/pkg目錄下可以找到一個文件even.a,用Sublime打開查看:
213c 6172 6368 3e0a 5f5f 2e53 594d 4445
4620 2020 2020 2020 3020 2020 2020 2020
2020 2020 3020 2020 2020 3020 2020 2020
3634 3420 2020 2020 3133 3620 2020 2020
2020 600a 54e0 0100 0022 222e 4576 656e
0044 e001 0000 676f 2e73 7472 696e 672e
2266 756e 6328 696e 7429 2062 6f6f 6c22
0044 e001 0000 7479 7065 2e66 756e 6328
......
 
使用even包:
package main
 
import (
 "even" //導入我們剛纔自定義的even包
 "fmt" //GO內置包
)
 
func main() {
 i := 5
 fmt.Printf("Is %d even? %v\n", i, even.Even(i)) //打印 Is 5 even? false
 //fmt.Printf("Is %d even? %v\n", i, even.odd(i)) //報錯  提示 cannot refer to unexported name even.odd
}
 
2、包名覆蓋:Go在導入包的時候,可以通過import <othername> packagenaem方式來覆蓋原始的包名,且覆蓋之後只能使用新的名稱來調用包中的函數。
 
3、包的文檔:每個包都應該有包註釋,在 package 前的一個註釋塊。對於多文件包,包註釋只需要 出現在一個文件前,任意一個文件都可以。包註釋應當對包進行介紹,並提供相關於包的整體信息。這會出現在 go doc 生成的關於包的頁面上,並且相關的細節會一併顯示。在包中每個定義(並且導出)的函數應當有一小段文字描述該函數的行爲。
 
4、單元測試
    在Go中爲包編寫單元測試應當是一種習慣。編寫測試需要包含 testing 包和程序 go test。
測試文件也在包目錄中,被命名爲*_test.go,這些測試文件和其它的Go文件都是一樣的,但是go test只會執行測試函數,每個測試函數都有相同的標識,名字均以Test開頭,定義方式爲:func TestXxx(t *testing.T)。編寫測試時,需要告訴 go test 測試是失敗還是成功。測試成功則直接返回。當測試失敗可以用Fail()、FailNow、Log、Fatal等函數標記 。
    示例:
    新建一個even_test.go文件(Go中單元測試文件的名稱都約定爲XXX_test.go),該文件與上述even.go文件在相同的目錄下,內容如下:
    package even
 
    import "testing"
 
    func TestEven(t *testing.T) {
    if !Even(2) {
          t.Log("2 should be even!")
          t.Fail()
         }
    }
 
使用了package even定義包,測試使用與被測試的包使用相同的名字空間,這 不僅僅是爲了方便,也允許了測試未導出的函數和結構(同包下的私有函數是可以直接訪問的)。
 
導入了testing包,定義測試函數TestEven,函數體中編寫了一些測試規則。
 
此時:執行go test
 
說明測試通過。
 
修改even_test.go文件內容,再次執行go test
  package even
 
    import "testing"
 
    func TestEven(t *testing.T) {
    if Even(2) {  //去掉了!
          t.Log("2 should be even!")
          t.Fail()
         }
    }
 
由此可以來驗證包中函數的語法規則是否正確。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章