像 fmt、os 等這樣具有常用功能的內(nèi)置包在 Go 語言中有 150 個以上,它們被稱為標(biāo)準(zhǔn)庫,大部分(一些底層的除外)內(nèi)置于 Go 本身。完整列表可以在 Go Walker 查看。
在貫穿本書的例子和練習(xí)中,我們都是用標(biāo)準(zhǔn)庫的包??梢酝ㄟ^查閱第 350 頁包中的內(nèi)容快速找到相關(guān)的包的實(shí)例。這里我們只是按功能進(jìn)行分組來介紹這些包的簡單用途,我們不會深入討論他們的內(nèi)部結(jié)構(gòu)。
unsafe: 包含了一些打破 Go 語言“類型安全”的命令,一般的程序中不會被使用,可用在 C/C++ 程序的調(diào)用中。syscall-os-os/exec:
os: 提供給我們一個平臺無關(guān)性的操作系統(tǒng)功能接口,采用類Unix設(shè)計(jì),隱藏了不同操作系統(tǒng)間差異,讓不同的文件系統(tǒng)和操作系統(tǒng)對象表現(xiàn)一致。 os/exec: 提供我們運(yùn)行外部操作系統(tǒng)命令和程序的方式。 syscall: 底層的外部包,提供了操作系統(tǒng)底層調(diào)用的基本接口。通過一個 Go 程序讓Linux重啟來體現(xiàn)它的能力。
示例 9.1 reboot.go:
package main
import (
"syscall"
)
const LINUX_REBOOT_MAGIC1 uintptr = 0xfee1dead
const LINUX_REBOOT_MAGIC2 uintptr = 672274793
const LINUX_REBOOT_CMD_RESTART uintptr = 0x1234567
func main() {
syscall.Syscall(syscall.SYS_REBOOT,
LINUX_REBOOT_MAGIC1,
LINUX_REBOOT_MAGIC2,
LINUX_REBOOT_CMD_RESTART)
}
archive/tar 和 /zip-compress:壓縮(解壓縮)文件功能。fmt-io-bufio-path/filepath-flag:
fmt: 提供了格式化輸入輸出功能。 io: 提供了基本輸入輸出功能,大多數(shù)是圍繞系統(tǒng)功能的封裝。 bufio: 緩沖輸入輸出功能的封裝。 path/filepath: 用來操作在當(dāng)前系統(tǒng)中的目標(biāo)文件名路徑。 flag: 對命令行參數(shù)的操作?! ?/li>
strings-strconv-unicode-regexp-bytes:
strings: 提供對字符串的操作。 strconv: 提供將字符串轉(zhuǎn)換為基礎(chǔ)類型的功能。unicode: 為 unicode 型的字符串提供特殊的功能。regexp: 正則表達(dá)式功能。 bytes: 提供對字符型分片的操作。 index/suffixarray: 子字符串快速查詢。math-math/cmath-math/big-math/rand-sort:
math: 基本的數(shù)學(xué)函數(shù)。 math/cmath: 對復(fù)數(shù)的操作。 math/rand: 偽隨機(jī)數(shù)生成。 sort: 為數(shù)組排序和自定義集合。 math/big: 大數(shù)的實(shí)現(xiàn)和計(jì)算。 container-/list-ring-heap: 實(shí)現(xiàn)對集合的操作。
list: 雙鏈表。ring: 環(huán)形鏈表。下面代碼演示了如何遍歷一個鏈表(當(dāng) l 是 *List):
for e := l.Front(); e != nil; e = e.Next() {
//do something with e.Value
}
time-log:
time: 日期和時間的基本操作。 log: 記錄程序運(yùn)行時產(chǎn)生的日志,我們將在后面的章節(jié)使用它。encoding/json-encoding/xml-text/template:
encoding/json: 讀取并解碼和寫入并編碼 JSON 數(shù)據(jù)。 encoding/xml:簡單的 XML1.0 解析器,有關(guān) JSON 和 XML 的實(shí)例請查閱第 12.9/10 章節(jié)。 text/template:生成像 HTML 一樣的數(shù)據(jù)與文本混合的數(shù)據(jù)驅(qū)動模板(參見第 15.7 節(jié))。 net-net/http-html:(參見第 15 章)
net: 網(wǎng)絡(luò)數(shù)據(jù)的基本操作。 http: 提供了一個可擴(kuò)展的 HTTP 服務(wù)器和基礎(chǔ)客戶端,解析 HTTP 請求和回復(fù)。 html: HTML5 解析器。 runtime: Go 程序運(yùn)行時的交互操作,例如垃圾回收和協(xié)程創(chuàng)建。 reflect: 實(shí)現(xiàn)通過程序運(yùn)行時反射,讓程序操作任意類型的變量。 exp 包中有許多將被編譯為新包的實(shí)驗(yàn)性的包。它們將成為獨(dú)立的包在下次穩(wěn)定版本發(fā)布的時候。如果前一個版本已經(jīng)存在了,它們將被作為過時的包被回收。然而 Go1.0 發(fā)布的時候并不包含過時或者實(shí)驗(yàn)性的包。
練習(xí) 9.1
使用 container/list 包實(shí)現(xiàn)一個雙向鏈表,將 101、102 和 103 放入其中并打印出來。
練習(xí) 9.2
通過使用 unsafe 包中的方法來測試你電腦上一個整型變量占用多少個字節(jié)。