Go 的標准庫
Go語言的標准庫覆蓋網絡、系統、加密、編碼、圖形等各個方面,可以直接使用標准庫的 http 包進行 HTTP 協議的收發處理;網絡庫基於高性能的操作系統通信模型(Linux 的 epoll、Windows 的 IOCP);所有的加密、編碼都內建支持,不需要再從第三方開發者處獲取
Go 語言的編譯器也是標准庫的一部分,通過詞法器掃描源碼,使用語法樹獲得源碼邏輯分支等。Go 語言的周邊工具也是建立在這些標准庫上。在標准庫上可以完成幾乎大部分的需求
Go 語言的標准庫以包的方式提供支持,下表是 Go 語言標准庫中常見的包及其功能
Go語言標准庫包名 | 功 能 |
---|---|
bufio | 帶緩沖的 I/O 操作 |
bytes | 實現字節操作 |
container | 封裝堆、列表和環形列表等容器 |
crypto | 加密算法 |
database | 數據庫驅動和接口 |
debug | 各種調試文件格式訪問及調試功能 |
encoding | 常見算法如 JSON、XML、Base64 等 |
flag | 命令行解析 |
fmt | 格式化操作 |
go | Go 語言的詞法、語法樹、類型等。可通過這個包進行代碼信息提取和修改 |
html | HTML 轉義及模板系統 |
image | 常見圖形格式的訪問及生成 |
io | 實現 I/O 原始訪問接口及訪問封裝 |
math | 數學庫 |
net | 網絡庫,支持 Socket、HTTP、郵件、RPC、SMTP 等 |
os | 操作系統平台不依賴平台操作封裝 |
path | 兼容各操作系統的路徑操作實用函數 |
plugin | Go 1.7 加入的插件系統。支持將代碼編譯為插件,按需加載 |
reflect | 語言反射支持。可以動態獲得代碼中的類型信息,獲取和修改變量的值 |
regexp | 正則表達式封裝 |
runtime | 運行時接口 |
sort | 排序接口 |
strings | 字符串轉換、解析及實用函數 |
time | 時間接口 |
text | 文本模板及 Token 詞法器 |
fmt(格式化操作)
動 詞 | 功 能 |
---|---|
%v | 按值的本來值輸出 |
%+v | 在 %v 基礎上,對結構體字段名和值進行展開 |
%#v | 輸出 Go 語言語法格式的值 |
%T | 輸出 Go 語言語法格式的類型和值 |
%% | 輸出 % 本體 |
%b | 整型以二進制方式顯示 |
%o | 整型以八進制方式顯示 |
%d | 整型以十進制方式顯示 |
%x | 整型以十六進制方式顯示 |
%X | 整型以十六進制、字母大寫方式顯示 |
%U | Unicode 字符 |
%f | 浮點數完整精度輸出;%.2f 2位精度輸出 |
%p | 指針,十六進制方式顯示 |
strings(字符串操作)
package main import ( "fmt" "strings" "strconv" ) func main(){ var strTest string = " http://www.cnblog.com/kaichenkai " // 是否以 http:// 開頭 ret1 := strings.HasPrefix(strTest, "http://") fmt.Println("HasPrefix result:", ret1) // HasPrefix result: false // 是否以 .com 結尾 ret2 := strings.HasSuffix(strTest, ".com") fmt.Println("HasSuffix result:", ret2) // HasSuffix result: false // 返回 k 在字符串中首次出現的位置,沒有則返回 -1 ret3 := strings.Index(strTest, "k") fmt.Println("Index is:", ret3) // Index is: 23 // 返回 k 在字符串中最后出現的位置,沒有則返回 -1 ret4 := strings.LastIndex(strTest, "k") fmt.Println("LastIndex is:", ret4) // LastIndex is: 30 // 將 kai 換成 空格,替換1次,返回操作后的結果字符串 ret5 := strings.Replace(strTest, "kai", " ", 1) fmt.Println("replace complete, strTest is:", ret5) // replace complete, strTest is: http://www.cnblog.com/ chenkai // 統計子字符串 kai 的出現次數 ret6 := strings.Count(strTest, "kai") fmt.Println("Count is:", ret6) // Count is: 2 // 將字符串重復 n 次,返回操作后的結果字符串 ret7 := strings.Repeat(strTest, 2) fmt.Println("Repeat result is:", ret7) // Repeat result is: http://www.cnblog.com/kaichenkai http://www.cnblog.com/kaichenkai // 轉小寫 ret8 := strings.ToLower(strTest) fmt.Println("Lower result is:", ret8) // Lower result is: http://www.cnblog.com/kaichenkai // 轉大寫 ret9 := strings.ToUpper(strTest) fmt.Println("Upper result is:", ret9) // Upper result is: HTTP://WWW.CNBLOG.COM/KAICHENKAI // 去掉收尾空白字符,返回操作后的結果字符串 ret10 := strings.TrimSpace(strTest) fmt.Println("TrimSpace:", ret10) // TrimSpace: http://www.cnblog.com/kaichenkai // 去掉首尾指定字符,返回操作后的結果字符串 ret11 := strings.Trim(strTest, "http://") fmt.Println("Trim:", ret11) // Trim: http://www.cnblog.com/kaichenkai // 去掉左側指定字符,返回操作后的結果字符串 ret12 := strings.TrimLeft(strTest, " http://") fmt.Println("TrimLeft:", ret12) // TrimLeft: www.cnblog.com/kaichenkai // 去掉右側指定字符,返回操作后的結果字符串 ret13 := strings.TrimRight(strTest, "kai ") fmt.Println("TrimRight:", ret13) // TrimRight: http://www.cnblog.com/kaichen // 以空格分割,返回子串的 slice ret14 := strings.Fields(strTest) fmt.Println("Fields:", ret14) // Fields: [http://www.cnblog.com/kaichenkai] // 以 .(點)進行分割,返回子串的 slice ret15 := strings.Split(strTest, ".") fmt.Println("Split:", ret15) // Split: [ http://www cnblog com/kaichenkai ] // 以 $ 將 slice 中的元素進行拼接 ret16 := strings.Join(ret15, "$") fmt.Println("Join:", ret16) // Join: http://www$cnblog$com/kaichenkai // 將整數轉換為字符串 ret17 := strconv.Itoa(1000) fmt.Println("Itoa:", ret17) // Itoa: 1000 // 將字符串轉換為數字,前提是字符串是純數字組成,不然會報錯 ret18, error := strconv.Atoi("100") if error == nil{ fmt.Println("Atoi:", ret18) // Atoi: 100 } }
time(時間接口)
使用之前需要導入 time 包
time 包中的常量
const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
時間的類型為 Duration,而 Duration 實際是一個 int64 的類型,可以轉換;
Duration.String() 可以將 Duration 的值轉為字符串
獲取當前時間
now := time.Now() fmt.Printf("type:%T \n", now) fmt.Printf("value:%v \n", now) 運行結果: type:time.Time value:2019-05-25 17:57:57.9463214 +0800 CST m=+0.003026301
自定義時間
格式:func Parse(layout, value string) (Time, error)
Parse 解析一個格式化的時間字符串並返回它代表的時間。
layout 定義輸入的時間格式,value 的時間格式需與 layout 保持一致
t, error := time.Parse("2006-01-02 15:04:05", "2019-05-25 19:00:00") if error == nil{ fmt.Printf("%T \n", t) fmt.Printf("%v \n", t) } 運行結果: time.Time 2019-05-25 19:00:00 +0000 UTC
獲取time.Time 類型的 年,月,日,時,分,秒
- year := time.Now().Year()
- month := time.Now().Month()
- day := time.Now().Day()
- hour := time.Now().Hour()
- minute := time.Now().Minute()
- second := time.Now().Second()
獲取當前時間戳
// 秒級 timestamp := time.Now().Unix() fmt.Println(timestamp) // 毫秒 milliTimestamp := time.Now().UnixNano() / 1e6 fmt.Println(milliTimestamp) // 納秒 NanoTimestamp := time.Now().UnixNano() fmt.Println(NanoTimestamp) 運行結果: 1558782662 1558782662752 1558782662755344000
Demo:統計程序運行耗時
func stats(){ time.Sleep(time.Second) } func main(){ var startTime int64 = time.Now().UnixNano() / 1e6 stats() var endTime int64 = time.Now().UnixNano() / 1e6 fmt.Println("use time:", endTime - startTime) } 運行結果: 1001
math(數學運算)
sort(排序接口)