原文鏈接: 開(kāi)始讀 Go 源碼了
創(chuàng)新互聯(lián)專注于保康企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城網(wǎng)站定制開(kāi)發(fā)。??稻W(wǎng)站建設(shè)公司,為??档鹊貐^(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
學(xué)完 Go 的基礎(chǔ)知識(shí)已經(jīng)有一段時(shí)間了,那么接下來(lái)應(yīng)該學(xué)什么呢?有幾個(gè)方向可以考慮,比如說(shuō) Web 開(kāi)發(fā),網(wǎng)絡(luò)編程等。
在下一階段的學(xué)習(xí)之前,寫了一個(gè)開(kāi)源項(xiàng)目|Go 開(kāi)發(fā)的一款分布式唯一 ID 生成系統(tǒng),如果你對(duì)這個(gè)項(xiàng)目感興趣的話,可以在 GitHub 上拿到源碼。
在寫項(xiàng)目的過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題。實(shí)現(xiàn)功能是沒(méi)問(wèn)題的,但不知道自己寫的代碼是不是符合 Go 的風(fēng)格,是不是夠優(yōu)雅。所以我覺(jué)得相比于繼續(xù)學(xué)習(xí)應(yīng)用開(kāi)發(fā),不如向底層前進(jìn),打好基礎(chǔ),打好寫 Go 代碼的基礎(chǔ)。
所以,我決定開(kāi)始讀 Go 標(biāo)準(zhǔn)庫(kù)源碼,Go 一共有 150+ 標(biāo)準(zhǔn)庫(kù),想要全部讀完的話不是不可能,但絕對(duì)是一項(xiàng)大工程,希望自己能堅(jiān)持下去。
為什么從 Go 標(biāo)準(zhǔn)庫(kù)的源碼開(kāi)始讀呢?因?yàn)樽罱部戳艘恍?Go 底層原理的書(shū),說(shuō)實(shí)話,像 goroutine 調(diào)度,gc 垃圾回收這些內(nèi)容,根本就看不懂。這要是一上來(lái)就讀這部分代碼,恐怕直接就放棄 Go 語(yǔ)言學(xué)習(xí)了。
而標(biāo)準(zhǔn)庫(kù)就不一樣了,有一部分代碼根本不涉及底層原理,實(shí)現(xiàn)也相對(duì)簡(jiǎn)單,同時(shí)又能對(duì) Go 的理念加深理解,作為入門再好不過(guò)了。然后再由簡(jiǎn)入深,循序漸進(jìn),就像打怪升級(jí)一樣,一步一步征服 Go。
說(shuō)了這么多,那到底應(yīng)該怎么讀呢?我想到了一些方法:
可以通過(guò)上面的一種或幾種方法相結(jié)合,然后再不斷閱讀不斷總結(jié),最終找到一個(gè)完全適合自己的方法。
下面是我總結(jié)的一些標(biāo)準(zhǔn)庫(kù)及功能介紹:
archive/tar
和 /zip-compress
:壓縮(解壓縮)文件功能。fmt
-io
-bufio
-path/filepath
-flag
:
fmt
:提供格式化輸入輸出功能。io
:提供基本輸入輸出功能,大多數(shù)是圍繞系統(tǒng)功能的封裝。bufio
:緩沖輸入輸出功能的封裝。path/filepath
:用來(lái)操作在當(dāng)前系統(tǒng)中的目標(biāo)文件名路徑。flag
:提供對(duì)命令行參數(shù)的操作。strings
-strconv
-unicode
-regexp
-bytes
:
strings
:提供對(duì)字符串的操作。strconv
:提供將字符串轉(zhuǎn)換為基礎(chǔ)類型的功能。unicode
:為 unicode 型的字符串提供特殊的功能。regexp
:正則表達(dá)式功能。bytes
:提供對(duì)字符型分片的操作。index/suffixarray
:子字符串快速查詢。math
-math/cmath
-math/big
-math/rand-sort
:
math
:基本的數(shù)學(xué)函數(shù)。math/cmath
:對(duì)復(fù)數(shù)的操作。math/rand
:偽隨機(jī)數(shù)生成。sort
:為數(shù)組排序和自定義集合。math/big
:大數(shù)的實(shí)現(xiàn)和計(jì)算。container
-/list
-/ring
-/heap
:
list
:雙鏈表。ring
:環(huán)形鏈表。heap
:堆。compress/bzip2
-/flate
-/gzip
-/lzw
-zlib
:
compress/bzip2
:實(shí)現(xiàn) bzip2 的解壓。flate
:實(shí)現(xiàn) deflate 的數(shù)據(jù)壓縮格式,如 RFC 1951 所述。gzip
:實(shí)現(xiàn) gzip 壓縮文件的讀寫。lzw
:Lempel Ziv Welch 壓縮數(shù)據(jù)格式實(shí)現(xiàn)。zlib
:實(shí)現(xiàn) zlib 數(shù)據(jù)壓縮格式的讀寫。context
:用來(lái)簡(jiǎn)化對(duì)于處理單個(gè)請(qǐng)求的多個(gè) goroutine 之間與請(qǐng)求域的數(shù)據(jù)、取消信號(hào)、截止時(shí)間等相關(guān)操作。crypto
-crypto/md5
-crypto/sha1
:
crypto
:常用密碼常數(shù)的集合。crypto/md5
:MD5 加密。crypto/sha1
:SHA1 加密。errors
:實(shí)現(xiàn)操作出錯(cuò)的方法。expvar
:為公共變量提供標(biāo)準(zhǔn)化的接口。hash
:所有散列函數(shù)實(shí)現(xiàn)的通用接口。html
:HTML 文本轉(zhuǎn)碼轉(zhuǎn)義功能。sort
:提供用于對(duì)切片和用戶定義的集合進(jìn)行排序的原始函數(shù)。unsafe
:包含了一些打破 Go 語(yǔ)言「類型安全」的命令,一般程序不會(huì)使用,可用在 C/C++ 程序的調(diào)用中。syscall
-os
-os/exec
:
syscall
:提供了操作系統(tǒng)底層調(diào)用的基本接口。os
:提供給我們一個(gè)平臺(tái)無(wú)關(guān)性的操作系統(tǒng)功能接口,采用類 Unix 設(shè)計(jì),隱藏了不同操作系統(tǒng)間差異,讓不同的文件系統(tǒng)和操作系統(tǒng)對(duì)象表現(xiàn)一致。os/exec
:提供了運(yùn)行外部操作系統(tǒng)命令和程序的方式。time
-log
:
time
:日期和時(shí)間的基本操作。log
:記錄程序運(yùn)行時(shí)產(chǎn)生的日志。encoding/json
-encoding/xml
-text/template
:
encoding/json
:讀取并解碼和寫入并編碼 JSON 數(shù)據(jù)。encoding/xml
:簡(jiǎn)單的 XML1.0 解析器。text/template
:生成像 HTML 一樣的數(shù)據(jù)與文本混合的數(shù)據(jù)驅(qū)動(dòng)模板。net
-net/http
:
net
:網(wǎng)絡(luò)數(shù)據(jù)的基本操作。http
:提供了一個(gè)可擴(kuò)展的 HTTP 服務(wù)器和基礎(chǔ)客戶端,解析 HTTP 請(qǐng)求和回復(fù)。runtime
:Go 程序運(yùn)行時(shí)的交互操作,例如垃圾回收和協(xié)程創(chuàng)建。reflect
:實(shí)現(xiàn)通過(guò)程序運(yùn)行時(shí)反射,讓程序操作任意類型的變量。這里僅僅列舉了一部分標(biāo)準(zhǔn)庫(kù),更全面的標(biāo)準(zhǔn)庫(kù)列表大家可以直接看官網(wǎng)。
那么問(wèn)題來(lái)了,這么多庫(kù)從何下手呢?
我這里做一個(gè)簡(jiǎn)單的分類,由于水平有限,只能做一些簡(jiǎn)單的梳理,然后大家可以結(jié)合自己的實(shí)際情況來(lái)做選擇。
有些庫(kù)涉及到非常專業(yè)的知識(shí),投入產(chǎn)出比可能會(huì)比較低。比如 archive
、compress
以及 crypto
,涉及到壓縮算法以及加密算法的知識(shí)。
有些庫(kù)屬于工具類,比如 bufio
、bytes
、strings
、path
、strconv
等,這些庫(kù)不涉及領(lǐng)域知識(shí),閱讀起來(lái)比較容易。
有些庫(kù)屬于與操作系統(tǒng)打交道的,比如 os
,net
、sync
等,學(xué)習(xí)這些庫(kù)需要對(duì)操作系統(tǒng)有明確的認(rèn)識(shí)。
net
下的很多子包與網(wǎng)絡(luò)協(xié)議相關(guān),比如 net/http
,涉及 http
報(bào)文的解析,需要對(duì)網(wǎng)絡(luò)協(xié)議比較了解。
如果想要深入了解語(yǔ)言的底層原理,則需要閱讀 runtime
庫(kù)。
要想快速入門,并且了解語(yǔ)言的設(shè)計(jì)理念,建議閱讀 io
以及 fmt
庫(kù),閱讀后會(huì)對(duì)接口的設(shè)計(jì)理解更深。
我已經(jīng)看了一些源碼,雖然過(guò)程痛苦,但確實(shí)非常有用。前期可能理解起來(lái)比較困難,用的時(shí)間長(zhǎng)一些,但形成固定套路之后,會(huì)越來(lái)越熟悉,用的時(shí)間也會(huì)更少,理解也會(huì)更深刻。
后續(xù)我還會(huì)繼續(xù)總結(jié)輸出,請(qǐng)大家持續(xù)關(guān)注,讓我們學(xué)起來(lái)。
開(kāi)源項(xiàng)目:
往期文章:
文章題目:開(kāi)始讀 Go 源碼了
文章網(wǎng)址:http://chinadenli.net/article42/dsoishc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、App開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、外貿(mào)建站、建站公司、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容