標籤:設計 大寫 平台 查看 printf not 組成 main 功能
1、包是函數和資料的集合。用 package 保留字定義一個包。檔案名稱不需要與包名 一致。包名的約定是使用小寫字元。Go 包可以由多個檔案組成,但是使用相 同的 package <name> 這一行。 讓我們在檔案 even.go 中定義一個叫做 even 的包。package even ← 開始自訂的包func Even(i int) bool { ← 可匯出函數return i % 2 == 0}func odd(i int) bool { ← 私人函數return i % 2 == 1} 名稱以大寫字母起始的是可匯出的,可以在包的外部調用,稍候會討論這個。現在只需要構建這個包。在 $GOPATH 下建立一個目錄,複製 even.go 到這個目錄。% mkdir $GOPATH/src/even ← 建立一個 級目錄% cp even.go $GOPATH/src/even ← 複製包檔案% go build ← 構建它% go install ← 將其安裝到 ~../pkg 接下來在程式 myeven.go 中使用這個包:package mainimport( // 匯入下面的包;"even" // 當地套件 even 在這裡匯入;"fmt" // 調用 even 包中的函數。)func main(){i := 5//訪問一個包中的函數的文法是 <package>.Function ()。fmt.Printf("Is%deven?%v\n",i,even.Even(i))} % go build myeven.go% ./myevenIs 5 even? false 在 Go 中,當函數的首字母大寫的時候,函數會被從包中匯出(在包外部可見,或者說公有的),因此函數名是 Even。如果修改 myeven.go 的第even.Even,使用未匯出的函數 even.odd:fmt.Printf("Is %d even? %v\n", i, even.odd(i))由於使用了私人的函數,會得到一個編譯錯誤:myeven.go:10: cannot refer to unexported name even.odd 概括來說:? 公有函數的名字以大寫字母開頭;? 私人函數的名字以小寫字母開頭。這個規則同樣適用於定義在包中的其他名字(新類型、全域變數)。注意,“大 寫” 的含義並不僅限於 US ASCII,它被擴充到了整個 Unicode 範圍。所以大寫的 希臘語、古埃及語都是可以的。 2、包名包名是好的、短的、簡潔的、好記的。根據規則,包名是小寫一個單詞;不應當有底線或混合大小寫。由於每個人都可能需要錄入這個名字,所以儘可能的簡短。不要提前考慮衝突包名是匯入的預設名稱,可以給包重新命名eg,import bar "bytes" // 重新命名為 bar另一個規則是包名就是代碼的根目錄名;在 src/pkg/compress/gzip 的包,作為 compress/gzip 匯入,但名字是 gzip,不是 compress_gzip 也不是 compressGzip。 3、測試包在 Go 中為包編寫單元測試應當是一種習慣。編寫測試需要包含 testing 包和程式 go test。兩者都有良好的文檔。 4、常用的包標準的 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 的功能。sortsort 包提供了對數組和使用者定義集合的原始的排序功能。strconvstrconv 包提供了將字串轉換成基礎資料型別 (Elementary Data Type),或者從基礎資料型別 (Elementary Data Type)轉 換為字串的功能。osos 包提供了與平台無關的作業系統功能介面。其設計是 Unix 形式的。syncsync 包提供了基本的同步原語,例如互斥鎖。flagflag 包實現了命令列解析。encoding/jsonencoding/json 包實現了編碼與解碼 RFC 4627 [5] 定義的 JSON 對象。text/template資料驅動的模板,用於產生文本輸出,例如 HTML。將模板關聯到某個資料結構上進行解析。模板內容指向資料結構的元素 (通常結構的欄位或者 map 的鍵)控制解析並且決定某個值會被顯示。模板掃描結構以便解析,而 “遊標” @ 決定了當前位置在結構中的值。net/httpnet/http 實現了 HTTP 要求、響應和 URL 的解析,並且提供了可擴充的 HTTP 服務和基本的 HTTP 用戶端。unsafeunsafe 包包含了 Go 程式中資料類型上所有不安全的操作。 通常無須使用這個。reflectreflect 包實現了運行時反射,允許程式通過抽象類別型操作對象。通常用於處理靜態類型 interface{} 的值,並且通過 Typeof 解析出其動態類型資訊,通常會返回一個有介面類型 Type 的對象。os/execos/exec 包執行外部命令。
Go 語言基礎(四) 之 包