這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
37.筆記go語言——包
包是函數和資料的集合。用package保留字定義一個包。檔案名稱不需要與包名一致。包名的約定是使用小寫字元。Go包可以由多個檔案組成,但是使用相同的package <name>這一行。讓我們在檔案even.go中定義一個叫做even的包。
名稱以大寫字母起始的是可匯出的,可以在包的外部調用.
在Go中,當函數的首字母大寫的時候,函數會被從包中匯出(在包外部可見,或者說公有的)
概括來說:
•公有函數的名字以大寫字母開頭;
•私人函數的名字以小寫字母開頭。
這個規則同樣適用於定義在包中的其他名字(新類型、全域變數)。注意,“大寫”的含義並不僅限於US ASCII,它被擴充到了整個Unicode範圍。所以大寫的希臘語、古埃及語都是可以的。
標識符
像在其他語言中一樣,Go的命名是很重要的。在某些情況下,它們甚至有語義上的作用:例如,在包外是否可見決定於首字母是不是大寫。因此有必要花點時間討論一下Go程式的命名規則。
包名
當包匯入(通過import)時,包名成為了內容的入口。在import "bytes"之後,匯入包的可以調用函數bytes.Buffer。任何使用這個包的人,可以使用同樣的名字訪問到它的內容,因此這樣的包名是好的:短的、簡潔的、好記的。
根據規則,包名是小寫一個單詞;不應當有底線或混合大小寫。由於每個人都可能需要錄入這個名字,所以儘可能的簡短。不要提前考慮衝突。包名是匯入的預設名稱。
在Go中使用混合大小寫MixedCaps或者mixedCaps,而不是底線區分含有多個單詞的名字。
包的文檔
每個包都應該有包注釋,在package前的一個註解區塊。對於多檔案包,包注釋只需要出現在一個檔案前,任意一個檔案都可以。包注釋應當對包進行介紹,並提供相關於包的整體資訊。這會出現在go doc產生的關於包的頁面上,並且相關的細節會一併顯示。
每個定義(並且匯出)的函數應當有一小段文字描述該函數的行為。
測試包
在Go中為包編寫單元測試應當是一種習慣。編寫測試需要包含testing包和程式go test。兩者都有良好的文檔。
在編寫包的時候應當一邊寫代碼,一邊寫(一些)文檔和測試函數。這可以讓你的程式更好,並且它展示了你的努力。
常用的包
標準的Go程式碼程式庫中包含了大量的包,並且在安裝Go的時候多數會伴隨一起安裝。瀏覽$GOROOT/src/pkg目錄並且查看那些包會非常有啟發。
fmt
包fmt實現了格式化的I/O函數,這與C的printf和scanf類似。格式化短語派生於C。一些短語(%-序列)這樣使用:
%v
預設格式的值。當列印結構時,加號(%+v)會增加欄位名;
%#v
Go樣式的值表達;
%T
帶有類型的Go樣式的值表達;
io
這個包提供了原始的I/O操作介面。它主要的任務是對os包這樣的原始的I/O進行封裝,增加一些其他相關,使其具有抽象功能用在公用的介面上。
bufio
這個包實現了緩衝的I/O。它封裝於io.Reader和io.Writer對象,建立了另一個對象(Reader和Writer)在提供緩衝的同時實現了一些文本I/O的功能。
sort
sort包提供了對數組和使用者定義集合的原始的排序功能。
strconv
strconv包提供了將字串轉換成基礎資料型別 (Elementary Data Type),或者從基礎資料型別 (Elementary Data Type)轉換為字串的功能。
os
os包提供了與平台無關的作業系統功能介面。其設計是Unix形式的。
sync
sync包提供了基本的同步原語,例如互斥鎖。
flag
flag包實現了命令列解析。
encoding/json
encoding/json包實現了編碼與解碼RFC 4627 [5]定義的JSON對象。
text/template
資料驅動的模板,用於產生文本輸出,例如HTML。
將模板關聯到某個資料結構上進行解析。模板內容指向資料結構的元素(通常結構的欄位或者map的鍵)控制解析並且決定某個值會被顯示。模板掃描結構以便解析,而“遊標” @決定了當前位置在結構中的值。
net/http
net/http實現了HTTP請求、響應和URL的解析,並且提供了可擴充的HTTP服務和基本的HTTP用戶端。
unsafe
unsafe包包含了Go程式中資料類型上所有不安全的操作。通常無須使用這個。
reflect
reflect包實現了運行時反射,允許程式通過抽象類別型操作對象。通常用於處理靜態類型interface{}的值,並且通過Typeof解析出其動態類型資訊,通常會返回一個有介面類型Type的對象。
os/exec
os/exec包執行外部命令。