欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

開(kāi)始讀 Go 源碼了

原文鏈接: 開(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)該怎么讀呢?我想到了一些方法:

  • 看官方標(biāo)準(zhǔn)庫(kù)文檔。
  • 看網(wǎng)上其他人的技術(shù)文章。
  • 寫一些例子來(lái)練習(xí)如何使用。
  • 如果可以的話,自己實(shí)現(xiàn)標(biāo)準(zhǔn)庫(kù)的功能。
  • 將自己的閱讀心得總結(jié)輸出。

可以通過(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ù)屬于工具類,比如 bufiobytes、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)目:

  • https://github.com/yongxinz/id-maker

往期文章:

  • 開(kāi)源項(xiàng)目|Go 開(kāi)發(fā)的一款分布式唯一 ID 生成系統(tǒng)
  • 測(cè)試小姐姐問(wèn)我 gRPC 怎么用,我直接把這篇文章甩給了她
  • gRPC,爆贊

文章題目:開(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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司