Go語言學習筆記---包
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。包是函數和資料的集合。用package 保留字定義一個包。檔案名稱不需要與包名一致。包名的約定是使用小寫字元。Go 包可以由多個檔案組成,但是使用相同的package <name> 這一行。
import匯入包
1、相對路徑 例:import “./model” //當前檔案同一目錄的model目錄,但是不建議這種方式來import2、絕對路徑 例:import “shorturl/model” //載入gopath/src/shorturl/model模組3、點操作 例:
package main import . "fmt" func main(){ dd := 101 Printf("%d", dd)//因為上面用的點操作匯入的包,所以現在就不需要前面加包名,即 fmt.Printf() } 輸出結果: 1014、別名操作 例:
package main import f "fmt" func main(){ dd := 101 f.Printf("%d", dd)//因為上面將fmt包起了個別名f,用fmt.Printf()就會報錯 }5、 _操作 例:
import(
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)_操作其實是引入該包,而不直接使用包裡面的函數,而是調用了該包裡面的init函數
定義個even包例:even.go package even // 開始自訂的包 func Even(i int) bool { // 可匯出函數(函數名首字母大寫) return i % 2 == 0 } func odd(i int) bool { // 私人函數(函數名首字母小寫) return i % 2 == 1 }
cd ~vi .bashrc在最後加入 export GOPATH=$HOME/g 儲存退出 GOPATH的路徑可自己定義source .bashrc //使剛配置的GOPATH生效
mkdir -p $GOPATH/src/even將上述的even.go檔案放入$GOPATH/src/even 注意: 檔案夾even的名字要和even.go檔案中package <name>中name的名字相同。even.go檔案名稱可以隨意
包的函數命名方式: 公有函數的名字以大寫字母開頭; 私人函數的名字以小寫字幕開頭。
在myeven.go檔案中使用定義的even包例:myeven.go package main import ( "fmt"
"even"
) func main(){ i := 5
fmt.Printf("Is %d even? %v\n", i , even.Even(i))
}輸出結果:Is 5 even? false
包測試在包放置的目錄下(如
$GOPATH/src/even)建立一個*_test.go檔案
func (t *T) Fail()Fail 標記測試函數失敗,但仍然繼續執行。
func (t *T) FailNow()FailNow 標記測試函數失敗,並且中斷其執行。這將會執行下一個測試。因此,當前檔案的其他所有測試都被跳過。
func (t *T) Log(args ...interface{})Log 用預設格式對其參數進行格式化,與Print() 類似,並且記錄文本到錯誤記錄檔。
func (t *T) Fatal(args ...interface{})Fatal 等價於Log() 後跟隨FailNow()。將這些湊到一起,就可以編寫測試了。首先,選擇名字even_test.go。然後添加下面的內容:
package evenimport "testing"func TestEven(t *testing.T) { if ! Even(2) { t.Log("2 should be even!") t.Fail() }}
注意在第一行使用了package even,測試使用與被測試的包使用相同的名字空間在包目錄中執行 go test 即可
ok even 0.001s
測試執行並且報告ok。成功了!
常用的包標準的Go 程式碼程式庫中包含了大量的包,在$GOROOT/src/pkg目錄中
1、fmt包包fmt 實現了格式化的I/O 函數,這與C 的printf 和scanf 類似。格式化短語派生於C 。一些短語(%-序列)如這樣使用:%v預設格式的值。當列印結構時,加號(%+v)會增加欄位名;%#vGo 樣式的值表達;%T帶有類型的Go 樣式的值表達;返回變數的類型
2、io這個包提供了原始的I/O 操作介面。它主要的任務是對os 包這樣的原始的I/O 進行封裝,增加一些其他相關,使其具有抽象功能用在公用的介面上。
3、bufio這個包實現了緩衝的I/O。它封裝於io.Reader 和io.Writer 對象,建立了另一個對象(Reader 和Writer)在提供緩衝的同時實現了一些文本I/O 的功能。
4、sortsort 包提供了對數組和使用者定義集合的原始的排序功能。
5、strconvstrconv 包提供了將字串轉換成基礎資料型別 (Elementary Data Type),或者從基礎資料型別 (Elementary Data Type)轉換為字串的功能。
6、osos 包提供了與平台無關的作業系統功能介面。其設計是Unix 形式的。
7、syncsync 包提供了基本的同步原語,例如互斥鎖。
8、flagflag 包實現了命令列解析。
9、encoding/jsonencoding/json 包實現了編碼與解碼RFC 4627 [6] 定義的JSON 對象。
10、text/template資料驅動的模板,用於產生文本輸出,例如HTML。將模板關聯到某個資料結構上進行解析。模板內容指向資料結構的元素(通常結構的欄位或者map 的鍵)控制解析並且決定某個值會被顯示。模板掃描結構以便解析,而“遊標” @ 決定了當前位置在結構中的值。
11、net/httpnet/http 實現了HTTP 要求、響應和URL 的解析,並且提供了可擴充的HTTP 服務和基本的HTTP 用戶端。
12、unsafeunsafe 包包含了Go 程式中資料類型上所有不安全的操作。通常無須使用這個。
13、reflectreflect 包實現了運行時反射,允許程式通過抽象類別型操作對象。通常用於處理靜態類型interface{} 的值,並且通過Typeof 解析出其動態類型資訊,通常會返回一個有介面類型Type 的對象。
14、os/execos/exec 包執行外部命令。