Go 問答之如何閱讀 Go 源碼

個人知乎回答,問題是關於如何閱讀 Go 源碼。地址。胡扯了些本身的想法。php


Go 的源碼在安裝包的 src/ 目錄下。怎麼看它的源碼呢?直接看吧!沒人教的狀況下,只能本身擼了。固然,這種內容通常也不會有人教。html

怎麼擼?mysql

Go 源碼中,應該可分爲與語言息息相關的部分,和官方提供的標準庫。與語言實現相關的確定是最難的,不是那麼容易理解。能夠先主要看標準庫,其餘的能夠先大概瞭解下。linux

先把源碼目錄總體掃一遍,大概看看涉及了哪些模塊,而後再挑本身喜歡的部分進行更深一步的學習與研究。建議每一個目錄都簡單寫個 hello world,如此的體悟會更深。若是連 hello world 也寫不出來,這個模塊的源碼暫時就不必研究了,先學好基礎吧。畢竟,包的使用不只與語言相關,還涉及具體場景和實現原理,這都是要學習的。git

對包的使用熟悉理解後,就能夠閱讀源碼了,但此時最好仍是不要太摳細節,求理解涉及設計思想,總體流程。源碼閱讀能夠經過畫 UML 的方式輔助,從縱向和橫向幫助理解。代碼設計時,通常最容易想到的就是按順序方式寫,很快就能搞定。但當項目變大,抽象的模塊會愈來愈多,抽象出接口和具體的實現,實現可能包含其餘類型的組合。搞明白這些關係,對於理解源碼實現會較有幫助。github

若是能順利通過前面兩步,接下來的源碼閱讀就比較簡單了。並且 Go 語言的特色就是簡潔易讀,沒什麼語法糖。固然,若是是一些實現比較複雜的包,你還需知道它們的底層原理,就好比 net/http 包,你得對 http 協議熟悉到必定程度,纔可能從細節研究源碼實現。golang

多是我閒的蛋疼,準備試着先從第一步出發,總體擼一下 Go 的源碼中包含的模塊,沒事的時候就更新一點進去。等把這些大體擼完一遍,感受個人 Golang 之旅 專欄又能夠多出不少寫做素材了。web

個人環境是 Go 1.11。關於每一個模塊,我會把讀過的一些文章放在下面,因爲只是粗略閱讀,並不能保證讀過的每篇文章都是精品。算法

補充:sql

2019年8月8日 凌晨 01:13, 大概花了兩個多星期的零碎時間,簡單擼完了一版。總的感受,仍是有不少地方理解不夠,但願後面能夠按前面說的思路,按包逐步進行源碼解剖。


archive

包含了文件歸檔的相關內容,其中涉及了兩個包,分別是 tar 和 zip。

archive/tar,即歸檔,若是瞭解 Linux 下的 tar 命令,可與之對應理解。若是要在歸檔基礎上進行壓縮,還要藉助 compress 下的相關包。提醒一點,是使用時要注意理解歸檔與壓縮的區別。

相關閱讀:

鳥哥的文件與文件系統的壓縮與打包
archive/tar 實現打包壓縮及解壓

archive/zip,與 zip 格式壓縮文件操做相關的包,使用方法與 tar 很相似。在尋找與 zip 包相關的資料時,瞭解到 zip 的做者年僅 37 歲就逝世了,而全世界全部使用 zip 壓縮的文件開頭部分都有他的名字 "PK",而咱們識別一個文件是不是 zip 正是經過這種方法。

相關閱讀:

archive/zip 實現壓縮與解壓
zip 的百度百科

bufio

實現了緩衝 IO 的功能,經過包裹 io.Reader 或 io.Writer 函數建立新的 Reader 或 Writer 實例,而且這些新建立的實例提供了緩衝的能力。使用方法很是簡單,達到指定緩衝大小,觸發寫或讀操做,如未達到要求,可用 Flush 方法刷新。

相關閱讀:

Introduction to bufio package in Golang
In-depth introduction to bufio.Scanner in Golang
bufio - 緩存 IO

builtin

Go 語言中的內置類型、函數、變量、常量的聲明。暫時看來,沒啥可深刻閱讀的,應該結合 Go 的內部實現進行閱讀。

bytes

主要是關於 byte slice 操做的一些函數。因爲 []byte 也可用於表示 string,故其中的函數、方法與 strings 很相似,好比 Join、Split、Trim、 Contains 等。

相關閱讀:

Go 語言學習 - bytes 包
Go Walkthrough: bytes+ + strings

cmd

Go 命令工具集的實現代碼,如 go、gofmt、godoc、pprof 等,應該主要是和 Go 語言實現相關性較大,比較底層。每一個命令都夠研究一段時間了,特別是 go 命令,而且前提是你的計算機底層原理的功底要足夠優秀。

網上搜索下,關於它的資料比較少。

相關閱讀:

Go 官網之 Command go

compress

以前提到 archive 包中是歸檔相關操做,而相對的 compress 包主要與壓縮相關。主要實現了幾種主流的壓縮格式,如 bzip二、flate、gzip、lzw、zlib。

compress/bzip2,常見的 .bz2 結尾的壓縮文件格式基本可用這個包操做,要與 tar 結合使用。

compress/gzip,常見的 .gz 結尾的壓縮文件格式基本可用這個包操做,要與 tar 結合使用。

compress/flate,flate 應該主要是 zip 用的壓縮算法,若是閱讀了前面的 archive/zip 的源碼,就會發現其中導了這個包。

compress/zlib, compress/lzw 基本與上面同理,應該都是某種壓縮算法實現。由於我對壓縮算法沒什麼太深的研究,暫時瞭解個大概就行了,但願沒有介紹錯誤。

相關閱讀:

Go 官網之 compress

container

咱們知道,Go 內置的數據結構不多,只有數組、切片和映射。除此之外,其實還有部分的結構放在了 container 包中,heap 堆、list 雙端隊列,ring 迴環隊列。

它們的使用很是簡單,基本就是增刪改查。

相關閱讀:

container 容器數據類型:heap、list 和 ring

context

讀這個包以前,得首先熟悉 Go 的併發代碼如何編寫,瞭解 Done channel 如何實現向全部 goroutine 發送廣播信號。Go 的併發單元稱爲 goroutine,可是不一樣 goroutine 之間並無父子兄弟關係,爲了更好地併發控制,context 包就誕生了。它能夠實如今不一樣 goroutine 間安全地傳遞數據以及超時管理等。

相關閱讀:

Go 譯文之經過 context 實現併發控制
深度解密 Go 語言之 Context

crypto

加密相關,涉及內容有點多,包含了各類經常使用的加密算法實現,好比對稱加密啊 AES、DES 等,公私鑰加密 rsa、dsa 等,散列算法 sha一、sha256 等,隨機數 rand 也有,不知道和 math 的隨機有什麼區別。沒有找到一篇綜合性介紹的文章,畢竟比較複雜了,若是要看它們的源碼,得先要大概瞭解下每一個加密算法的原理,纔好逐一突破。

相關閱讀:

Go 官網之 crypto

database

封裝了一套用於數據庫操做的通用接口,實現了數據庫鏈接管理,支持鏈接池功能。真正使用時,咱們須要引入相應的驅動,才能實現指定類型數據庫的操做。

一個簡單的例子。

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/test")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
}
複製代碼

github.com/go-sql-driver/mysql 即是提供的 MySQL 驅動。具體的查詢執行都是經過調用驅動實現的 db 接口中的方法。

相關閱讀:

database/sql-SQL/SQL-Like 數據庫操做接口
關於Golang中database/sql包的學習筆記

debug

和調試相關,具體內容比較複雜,我也不是很懂。內部有幾個包,如 dwarf、elf、gosym、macho、pe、plan9obj。

dwarf,可用於訪問可執行文件中的 DWARF 信息。具體什麼是 DWARF 信息呢?官網有個 PDF,具體介紹了什麼是 DWARF,有興趣能夠看看。它主要是爲 UNIX 下的調試器提供必要的調試信息,例如 PC 地址對應的文件名行號等信息,以方便源碼級調試。

相關閱讀:

dwarf-2.0.0 調試信息格式 DWARF, 說不定你也須要它哦

elf,用於訪問 elf 類型文件。elf,便可執行與可鏈接格式,常被稱爲 ELF 格式,有三種類型:

  • 可重定位的對象文件(Relocatable file),由彙編器彙編生成的 .o 文件
  • 可執行性的對象文件(Executable file),可執行應用程序
  • 可被共享的對象文件(Shared object file),動態庫文件,也即 .so 文件

相關閱讀:

readelf elf文件格式分析 The 101 of ELF files on Linux: Understanding and Analysis

gosym,用於訪問 Go 編譯器生成的二進制文件之中的 Go 符號和行信息等,暫時還沒怎麼看。在 medium 發現個系列文章,介紹了 Go 中 debug 調試器的實現原理,相關閱讀部分是系列的第二篇文章。

相關閱讀:

Making debugger in Golang (part II)

macho,用於訪問 Mach-O object 格式文件。要閱讀這段源碼,一樣須要先了解什麼是 Mach-O,它是 Mach object 文件格式的縮寫,用於可執行文件、目標代碼、內核轉儲的文件格式。

相關閱讀:

維基百科-Mach-O
Go package - debug/macho

pe,實現了訪問 PE 格式文件,PE 是 Windows 系統可移植的可執行文件格式。

相關閱讀:

WIKI - Portable Executable
Go package - debug/pe

plan9obj,用於訪問 plan9 object 格式文件。

暫未找到關於 plan9object 的介紹文章。咱們主要學習的話,主要應該是集中在 elf 和 gosym 兩個格式。

相關閱讀:

Go package - debug/plan9obj

encoding

主要關於咱們經常使用到的各類數據格式的轉化操做,或也可稱爲編解碼,好比 JSON、XML、CSV、BASE64 等,主要的模塊有:

encoding/json,json 處理相關的模板,通用方式,咱們能夠將解析結果放到 map[string]interface{} 解析,也能夠建立通用結構體,按 struct 方式進行。

encoding/xml,基本和 encoding/json 相似。但由於 XML 比 json 要複雜不少,還涉及一些高級用法,好比與元素屬性相關等操做。

encoding/csv,csv 數據格式解析。

encoding/binary,可用於處理最底層的二進制數據流,按大小端實現 []byte 和整型數據之間的轉化。

其餘諸如 hex、gob、base6四、base3二、gob、pem、ascii84 等數據格式的操做都是相似的,有興趣能夠都嘗試一下。

相關閱讀:

Golang 下的 encoding 相關模塊的使用 Go 標準庫文檔翻譯之 encoding/xml Golang 中 byte 轉 int 涉及到大小端問題嗎 使用 Go 語言標準庫對 CSV 文件進行讀寫 Go Walkthrough: encoding package

errors

Go 的錯誤處理主要代碼就是它。很遺憾的是,打開源碼後發現,就幾行代碼哦。主要是由於 Go 的錯誤類型只是一個接口而已,它的源碼很是簡單。

package errors

// New returns an error that formats as the given text.
func New(text string) error {
	return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}
複製代碼

Go 默認只提供了最簡單的實現,就上面這幾行代碼。真的是 awesome、amazing,哈哈。但正是由於簡單,擴展出本身的 error 變得很簡單。好比,有些開發者認爲 Go 的錯誤處理太簡單,開發了一些包含 call stack trace 的 error 包。

相關閱讀:

github.com/pkg/errors
error-handling-and-go
What I Don’t Like About Error Handling in Go

expvar

主要是用於 Go 程序運行時的指標記錄,如 HTTP 服務在加入 expvar 後,咱們能夠經過 /debug/vars 返回這些指標,返回的數據是 JSON 格式的。

它的源碼很少,也就大約 300 行代碼,重點在它使用方法。

相關閱讀:

標準庫 EXPVAR 實戰 Monitoring apps with expvars and Go

flag

用於命令行參數解析的包,好比相似命令參數 grep -v grep,具體操做的時候要獲取 -v 後的參數值。很經常使用的功能,若是純粹本身實現是比較繁瑣的。

相關閱讀:

flag-命令行參數解析

fmt

從包名就能夠知道,fmt 主要和格式化相關,關於什麼的格式化呢?主要是字符串的格式化,它的用法和 C 中 printf 都很相似。固然,除了實現 C 的用法,還提供了一些 Go 特有的實現。

相關閱讀:

Go Walkthrough: fmt

go

彷佛是核心工具使用的包。

hash

hash 包主要定義了不一樣的 hash 算法的統一接口。而具體的 hash 算法實現有的直接 hash 的下層,好比 crc3二、crc64,即 32 位循環冗餘校驗算法和 64 位循環冗餘校驗算法。而 md5 hash 算法在 crypto/md5 下,一樣實現了 hash 的相關接口。

相關閱讀:

常見哈希函數 FNV 和 MD5

html

Go 標準庫裏的 html 包功能很是簡單,大概了看下,主要是關於 html 文本的處理,例如該如何對 html 代碼作轉義。若是想支持 html 的解析,go 官方 github 下還提供了一個 net 倉庫,其中有個 html 的工具包。而 goquery 也是基於它實現的。

標準庫的 html 目錄下還有 template,html 的模板渲染工具,經過與 net/http 相結合,再加上一個數據庫 orm 包,簡單的 web 開發就能夠開始了。

相關閱讀:

Easy way to render HTML in Go
Go 語言解析 html

image

Go 2D 圖像處理庫,支持建立 2D 處理的方法函數,圖片建立、像素、顏色設置,而後進行繪製。主要支持 png、jpeg、gif 圖片格式。

相關閱讀:

golang中image包用法
golang 中 image/draw 包用法
Golang 繪圖技術

index

目錄爲 index,其中只有一個包 index/suffixarray,稱爲後綴數組。具體算法沒仔細研究,大體是將子字符串查詢的時間複雜度下降到了 log_n

使用很是簡單,官網已經提供了一個例子。

// create index for some data
index := suffixarray.New(data)

// lookup byte slice s
offsets1 := index.Lookup(s, -1) // the list of all indices where s occurs in data
offsets2 := index.Lookup(s, 3)  // the list of at most 3 indices where s occurs in data
複製代碼

相關閱讀:

Go package - index/suffixarray suffix array 後綴數組算法心得

internal

內部實現,比較複雜。

io

Go 的標準庫中,爲 io 原語提供了基本的接口和實現,幫助字節流的讀取。接口主要就是 io.Reader 和 io.Writer。io 包提供了一些經常使用資源的接口實現,好比內存、文件和網絡鏈接等資源進行操做。

閱讀 io 包的源碼,會發現不少接口都是基於具體的能力定義,最簡單的有 Reader(讀)、Writer(寫)、Closer(關閉)、Seeker(偏移),一個接口一個方法,很是靈活。組合的接口還有 ReaderWriter(讀寫)、ReadeCloser(讀與關)、WriteCloser(讀寫關) 和 ReadWriteCloser(讀寫關)等。總體理解,咱們將會對 Go 接口是基因而鴨子模型的說法更有體會,

相關閱讀:

Go 中 io 包的使用方法
基本的 IO 接口
Streaming IO in Go

log

Go 的日誌包,經過記錄日誌能夠方便咱們進行問題調試。log 包的核心源碼並很少,總共也就三百多行,其中註釋就佔了差很少一百行。主要是由於它提供的功能不多,只有基礎的日誌格式化,還有 Print、Panic、Fatal 三種日誌打印函數。連錯誤級別沒提供。若是要使用的話,還須要藉助一些第三方的包。相關閱讀中提供了一個 "Go 日誌庫集合" 的文章,具體我也沒有深刻研究。

相關閱讀:

Go log 日誌
Go 日誌庫集合

math

主要是關於數學計算方面的函數,一些數學常量,好比 PI(圓周率)、E(天然對數)等,就在其中,還有如四捨五入方面的函數 Round、Floor、Ceil、最大值 Max、最小值 Min,複雜的數學運算,好比冪運算、對數、三角函數確定也有的,其餘諸如隨機數之類的函數也在其中。打開 math 源碼文件夾,發現裏面有大量的彙編代碼,數學相對片底層,對性能要求會比較高,有必要用匯編實現。

math 包,直接看官方文檔就行了,通常看了就能夠用,沒什麼業務場景、具體原理須要瞭解,畢竟你們都學過數學。若是要看彙編實現,那就複雜了。有興趣能夠研究一下。

相關閱讀:

Go 官網 math

mime

要了解 mime 包的使用,得先了解什麼是 MIME,全稱 Multipurpose Internet Mail Extension,即多用途互聯網郵箱擴展類型。最初設計的目標是爲了在發送郵件時,附加多媒體內容。後來,MIME 在 HTML 中也獲得了支持。

其中主要有四個函數,AddExtensionType、TypeByExtension、FormatMediaType 和 ParseMediaType。先後兩組函數彷佛都是針對 MediaType 的互操做。

相關閱讀:

Go 標準庫學習 mime
Go package - mime

net

網絡相關,涉及內容比較多,有種吃不消的感受。

底層的實現 socket 就在 net 包下,主要是一些底層協議的實現,好比無鏈接的 ip、udp、unix(DGRAM),和有鏈接的 tcp、unix(STREAM) 均可以在 net 包找到。

應用層協議,http 協議實如今 net/http 包含客戶端服務端,rpc 在 net/rpc,郵件相關的 net/mail、net/smtp 等。net/url 是與 url 處理相關的函數,好比 url 字符串解析,編碼等。

相關閱讀:

golang net 包學習筆記 Go 官方庫 RPC 開發指南 Go 爬蟲必備之 HTTP 請求 QuickStart Sending HTML emails using templates in Golang

os

os 包主要實現與操做系統相關的函數,而且是與平臺無關的。它的設計是 UNIX 風格的,而且採用 Go 錯誤處理風格。發生錯誤將返回的 error 類型變量。好比 Open、Stat 等操做相關的函數。

os 包的目標是統一不一樣操做系統的函數。若是你們讀過那本 UNIX 環境高級編程,你會發現 os 包中的函數與 Unix 的系統調用函數都很類似。

除了 os 包,該目錄下還有幾個包,分別是 os/exec、os/signal 和 os/user,以下:

os/exec,幫助咱們實現了方便執行外部命令的能力。

os/signal,Unix-Like 的系統信號處理相關函數,Linux 支持 64 中系統信號。

os/user,與系統用戶相關的庫,可用於獲取登陸用戶、所在組等信息。

相關閱讀:

[譯]使用 os/exec 執行命令 Go package - os

path

path 包實現了路徑處理(經過 / 分隔)相關的一些經常使用函數,經常使用於如文件路徑、url 的 path。不適合 Windows 的 \ 和磁盤路徑處理。

主要包含的函數有 Base、Clean、Dir、Ext、IsAbs、Join 等函數。如 Base 可用於獲取路徑的最後一個元素,Dir 獲取路徑目錄,Ext 獲取文件擴展、IsAbs 判斷是否爲絕對路徑,Join 進行路徑鏈接等。

相關閱讀:

Go package - path

plugin

plugin 包是 Go 1.8 出現的包,爲 Go 增長了動態庫加載的能力,當前只支持 Linux 和 MacOS。但這個包的應用並非很方便,生成和使用庫文件的環境有必定的要求。

相關閱讀:

如何評價 Go 標準庫中新增的 plugin 包
writing-modular-go-programs-with-plugins
calling-go-functions-from-other-languages
gosh-a-pluggable-command-shell-in-go

reflect

與反射相關的函數函數,經過反射能夠實現運行時動態建立、修改變量,進行函數方法的調用等操做,得到本屬於解釋語言的動態特性。要閱讀反射包源碼,重點在理解變量的兩個組成,即類型和值,反射的核心操做基本都是圍繞它們進行。reflect.ValueOf 與 reflect.TypeOf 是咱們經常使用的兩個方法。

相關閱讀:

Go 譯文之如何使用反射 Go 譯文之如何使用反射(二) Go package - reflect

regexp

Go 的正則包,用於正則處理。基本是每種語言都會提供。其中涉及的方法大體可分爲幾個大類,分別是 Compile 編譯、Match 匹配、Find 搜索、Replace 替換。

正則的源碼實現還真是不想看。感受正則都沒有徹底理清楚,扯源碼有點坑。特別頭大。

相關閱讀:

Go 官網之 regexp Golang-Regex-Tutorial

runtime

runtime 是與 Go 運行時相關的實現,咱們能夠經過它提供的一些函數控制 goroutine。關於 Go 進程的啓動流程、GC、goroutine 調度器等,也是在 runtime 中實現,一樣須要咱們好好閱讀 runtime 代碼瞭解。除此覺得,cgo、builtin 包的實現也是在 runtime。

相關閱讀:

說說 Golang 的runtime golang internals Go package - runtime

sort

定義了排序的接口,一旦某個類型實現了排序的接口,就能夠利用 sort 中的函數實現排序。經過閱讀源碼,我發現默認支持排序的類型包括 int、float6四、string。sort 中還有個 search 文件,其中主要是已排序內容二分查找的實現。

咱們都知道,排序算法不少,好比插入排序、堆排序與快速排序等,sort 包都已經實現了,而且不用咱們決定使用哪一種算法,而是會依據具體的數據決定使用什麼算法,而且一次排序不必定只要了一種算法,而多是多種算法的組合。如何作算法選擇能夠經過閱讀 sort.go 文件中的 quickSort 函數了解。

相關閱讀:

Sort - 排序算法 The 3 ways to sort in Go

strconv

關於字符串與其餘類型轉化的包,名字全稱應該是 string convert,即字符串轉化。好比整型與字符串轉化的 Itoa 與 Atoi,浮點型與字符串的轉化 ParseFloat 與 FormatFloat,布爾型與字符串轉化 ParseBool 與 FormatBool 等等。

相關閱讀:

Golang 中 strconv 的用法 官方文檔 - strconv

strings

針對字符串的操做函數,前面也提過到,由於 []byte 也可用於表示字符串,strings 中的不少函數在 bytes 包也有相似的實現,好比 Join、Split、Trim,大小寫轉化之類的函數等。

相關閱讀:

strings - 字符串操做

sync

Go 推薦以通訊方式(channel)實現併發同步控制,但傳統機制也是支持的,好比鎖機制、條件變量、WaitGroup、原子操做等,而它們都是由 sync 提供的。其中,原子操做在 sync/atomic 包下。

除此以外,sync 中還有個臨時對象池,能夠實現對象複用,而且它是可伸縮且併發安全的。

相關閱讀:

淺談 Golang sync 包的相關使用方法

syscall

系統調用,從名字就能知道,這個包很複雜。系統調用是實現應用層和操做底層的接口,不一樣系統之間的操做經常會有必定的差別,特別是類 Unix 與 Windows 系統之間的差別較大。

若是想要尋找 syscall 的使用案例,咱們能夠看看 net、os、time 這些包的源碼。

若是要看這部分源碼,當前的想法是,咱們能夠只看 Linux 的實現,架構的話,若是想看彙編,能夠只看 x86 架構。

暫時研究很少,不敢妄言。

相關閱讀:

視頻筆記:Go 和 syscall
Go package - syscall

testing

Go 中測試相關的實現,好比單元測試、基準測試等。Go 推薦的測試方式採用表格驅動的測試方式,即非每種狀況都要寫一個單獨的用例,而是經過列舉輸入、指望輸出,而後執行功能並比較指望輸出與實際輸出是否相同。

一個簡單的測試用例。

func TestSum(t *testing.T) {
	var sumTests = []struct {
		a        int
		b        int
		expected int
	}{
		{1, 1, 2},
		{2, 1, 3},
		{3, 2, 5},
		{4, 3, 7},
		{5, 5, 10},
		{6, 8, 14},
		{7, 13, 20},
	}

	for _, tt := range sumTests {
		actual := functions.Add(tt.a, tt.b)
		if actual != tt.expected {
			t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, actual, tt.expected)
		}
	}
}
複製代碼

相關閱讀:

單元測試
基準測試
Go package - testing

text

主要是關於文本分析解析的一些包,但又不一樣於字符串處理,主要涉及詞法分析 scanner、模板引擎 template、tab 處理 tabwriter。

text/scanner,主要是作詞法分析的,若是你們讀過個人專欄翻譯的幾篇關於詞法分析的文章,對它的理解會比較輕鬆。

text/template,用於文本的模板處理,相對於 html/template 的具體應用場景,text/template 更通用。要熟悉使用它,還須要掌握它的一些方法,好比 Action、Argument、Pipeline、Variable、Function。

text/tabwriter,感受沒啥介紹的,好像主要是根據 tab 進行文本對齊的。

相關閱讀:

text/template A look at Go lexer/scanner packages
Go 模板嵌套最佳實踐
Package tabwriter

time

關於日期時間的包,Go 中的 unix timestamp 是 int64,表示的時間範圍相應的也就有所擴大。其餘的諸如睡眠、時區、定時控制等等都支持,Go 中有個逆人性的規則,那就是日期時間的格式化字符,好比傳統語言的格式化字符串 YYYY-MM-DD 在 Go 倒是 2006-01-02 的形式,奇葩不奇葩。

相關閱讀:

Go 標準庫--time 經常使用類型和方法
Go 時間、時區、格式的使用
golang package time 用法詳解

unicode

unicode 編碼相關的一些基本函數,讀源碼會發現,它經過把不一樣分類字符分別到不一樣的 RangeTable 中,實現提供函數判斷字符類型,好比是不是控制字符、是不是字母等。另外兩個包 unicode/utf8 和 unicode/utf16 可用於 unicode (rune) 與 utf8 (byte)、unicode (rune) 與 utf16 (int16) 之間的轉化。

相關閱讀:

go package 之 unicode Unicode 碼點、UTF-8/16編碼

unsafe

Go 語言限制了一些可能致使程序運行出錯的用法,經過編譯器就能夠檢查出這些問題。固然,也有部分問題是沒法在編譯時發現的,Go 給了比較優化的提示。但經過 unsafe 中提供的一些方法,咱們能夠徹底突破這一層限制,從包名就能夠知道,unsafe 中包含了一些不安全的操做,更加偏向於底層。一些比較低級的包會調用它,好比 runtime、os、syscall 等,它們都是和操做系統密切相關的。咱們最好少用 unsafe,由於使用了它就不必定能保證程序的可移植性或將來的兼容性問題。

相關閱讀:

Go 聖經 - 底層編程
Go package - unsafe

vendor

標準庫中依賴的第三方包,固然也都由 Go 官方所開發,默認包括的依賴有:

  • golang_org/x/crypto
  • golang_org/x/net
  • golang_org/x/text

舉個例子,加密相關的 crypto 包中實現就用到了 golang_org/x/crypto/curve25519 中的方法。

除了源碼中自帶的標準庫,官方其實還提供了其餘不少諸如 crypto、net、text 之類的包。具體能夠查看 Go 官方 github 地址


波羅學的微信公衆號
相關文章
相關標籤/搜索