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(排序接口)
