打開Go語言之門:入門、實(shí)戰(zhàn)與進(jìn)階
定 價(jià):89 元
- 作者:飛雪無情 著
- 出版時(shí)間:2022/11/1
- ISBN:9787111712459
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP312.8Go
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
通過不斷思考和整理,作者編寫了這本更具系統(tǒng)性也更通俗易懂的Go語言入門和進(jìn)階書籍,以幫助學(xué)習(xí)者少走彎路,比其他人更快一步提升職業(yè)競(jìng)爭(zhēng)力。
本書共包含5個(gè)部分。
第1部分:快速入門Go語言。作者挑選了變量、常量、基礎(chǔ)數(shù)據(jù)類型、函數(shù)和方法、結(jié)構(gòu)體和接口等知識(shí)點(diǎn)進(jìn)行介紹。這部分內(nèi)容相對(duì)簡(jiǎn)潔,但已經(jīng)足夠讓你掌握Go的基本程序結(jié)構(gòu)了。
第2部分:Go語言的高效并發(fā)。這部分主要介紹goroutine、channel、同步原語等知識(shí),讓你對(duì)Go語言層面的并發(fā)支持有更深入的理解,并且可以編寫自己的Go語言并發(fā)程序。這個(gè)部分*后一章專門介紹常用的并發(fā)模式,可以拿來即用,以更好地控制并發(fā)。
第3部分:深入理解Go語言。這部分講解Go 語言底層原理和高級(jí)功能,比如slice的底層是怎樣的、為什么這么高效等。這部分內(nèi)容也是作者特意設(shè)計(jì)的,跟著作者一起研究底層原理,可避免初學(xué)者不求甚解的通病。總之,只有理解了底層原理,你才能更靈活地編寫程序并高效地應(yīng)對(duì)問題。
第4部分:Go語言工程管理。學(xué)習(xí)一門語言,不僅要掌握它本身的知識(shí),還要掌握模塊管理、性能優(yōu)化等周邊技能,因?yàn)檫@些技能可以幫助你更好地進(jìn)行多人協(xié)作,提高開發(fā)效率,寫出更高質(zhì)量的代碼。你可以在這部分學(xué)到如何測(cè)試Go語言代碼以提高代碼質(zhì)量、如何做好性能優(yōu)化、如何使用第三方庫來提高自己項(xiàng)目的開發(fā)效率等。
第5部分:Go語言泛型。這是Go語言在1.18版本中新增的特性,也是大家期待已久的特性。在這一部分作者會(huì)帶你學(xué)習(xí)Go語言泛型的使用,以及如何使用泛型來提高效率和簡(jiǎn)化代碼。
學(xué)習(xí)Go語言,抓住未來的機(jī)遇
你好,我是飛雪無情,在技術(shù)領(lǐng)域從業(yè)近10年,目前在一家互聯(lián)網(wǎng)公司擔(dān)任副總裁,負(fù)責(zé)產(chǎn)品的研發(fā)管理和架構(gòu)設(shè)計(jì)。
2014年,我因?yàn)镈ocker接觸了Go語言,其簡(jiǎn)潔的語法、高效的開發(fā)效率和語言層面上的并發(fā)支持深深地吸引了我。經(jīng)過不斷學(xué)習(xí)和實(shí)踐,我對(duì)Go語言有了更深入的了解,不久后,便帶領(lǐng)團(tuán)隊(duì)轉(zhuǎn)型Go語言開發(fā),提升了團(tuán)隊(duì)開發(fā)效率和系統(tǒng)性能,降低了用人成本。
在帶領(lǐng)團(tuán)隊(duì)轉(zhuǎn)型Go語言的過程中,我不斷地把自己學(xué)習(xí)Go語言的經(jīng)驗(yàn)總結(jié)成文章,以方便大家利用碎片時(shí)間學(xué)習(xí),于是“飛雪無情”公眾號(hào)和知乎號(hào)就誕生了,F(xiàn)在,我已經(jīng)發(fā)布了300多篇相關(guān)文章,在幫助數(shù)萬名讀者朋友有效學(xué)習(xí)Go語言的同時(shí),還有幸拿到了知乎Go語言專題的最高贊。
●為開發(fā)者需求而設(shè)計(jì)的Go語言
K8s、Docker、etcd這類耳熟能詳?shù)墓ぞ呔褪怯肎o語言開發(fā)的,而且很多大公司(如騰訊、字節(jié)跳動(dòng)等)都在把原來的C/C++、Python、PHP技術(shù)棧遷往Go語言。
在我看來,Go語言備受推崇,與其本身的優(yōu)勢(shì)有直接的關(guān)系:
√語法簡(jiǎn)潔,相比其他語言更容易上手,開發(fā)效率更高。
√自帶垃圾回收(GC)功能,不用手動(dòng)申請(qǐng)釋放內(nèi)存,能夠有效避免Bug,提高性能。
√語言層面的并發(fā)支持讓你能夠很容易地開發(fā)出高性能程序。
√提供強(qiáng)大的標(biāo)準(zhǔn)庫,第三方庫也足夠豐富,可以拿來即用,提高開發(fā)效率。
√可通過靜態(tài)編譯直接生成一個(gè)可執(zhí)行文件,運(yùn)行時(shí)不依賴其他庫,部署方便,可伸縮能力強(qiáng)。
√提供跨平臺(tái)支持,很容易編譯出跨各個(gè)系統(tǒng)平臺(tái)直接運(yùn)行的程序。
對(duì)比其他語言,Go的優(yōu)勢(shì)顯著。比如Java雖然具備垃圾回收功能,但它是解釋型語言,需要安裝JVM才能運(yùn)行;C語言雖然不用解釋,可以直接編譯運(yùn)行,但是它不具備垃圾回收功能,需要開發(fā)者自己管理內(nèi)存的申請(qǐng)和釋放,容易出問題。而Go語言具備兩者的優(yōu)勢(shì)。
如今微服務(wù)和云原生已經(jīng)成為一種趨勢(shì),Go作為一門高性能的編譯型語言,最適合承載微服務(wù)的落地實(shí)現(xiàn),且容易生成跨平臺(tái)的可執(zhí)行文件,相比其他編程語言更容易部署在Docker容器中,實(shí)現(xiàn)靈活的自動(dòng)伸縮服務(wù)。
總體來看,Go語言的整體設(shè)計(jì)理念就是以軟件工程為目的,方便開發(fā)者更好地研發(fā)、管理軟件項(xiàng)目,一切都是為開發(fā)者著想。
如果你是有1~3年經(jīng)驗(yàn)的其他語言(如Python、PHP、C/C++)開發(fā)者,學(xué)習(xí)Go語言會(huì)比較容易,因?yàn)榫幊陶Z言的很多概念是相通的。而如果你是有基本計(jì)算機(jī)知識(shí)但無開發(fā)經(jīng)驗(yàn)的小白,也適合盡早學(xué)習(xí)Go語言,吃透它有助于加深你對(duì)編程語言的理解,也讓你更有職業(yè)競(jìng)爭(zhēng)力。
在與Go語言學(xué)習(xí)者進(jìn)行交流和面試的過程中,我發(fā)現(xiàn)了一些典型問題,可概括為如下三點(diǎn)。
第一,學(xué)習(xí)者所學(xué)知識(shí)過于零碎,缺乏系統(tǒng)性,并且不是太深入,導(dǎo)致寫不出高效的程序,也難以在面試中勝出。比如,我在面試時(shí)會(huì)問字符串拼接的效率問題,這個(gè)問題涉及加號(hào)(+)拼接、buffer拼接、builder拼接、并發(fā)安全等知識(shí)點(diǎn),但應(yīng)聘者通常只能答出最淺顯的內(nèi)容,缺乏對(duì)語言邏輯的深層思考。
第二,很多入門者已有其他語言基礎(chǔ),很難轉(zhuǎn)換語言思維模式,尤其是在Go語言設(shè)計(jì)者還做了很多相對(duì)其他語言的改進(jìn)和創(chuàng)新的情況下。作為從Java語言轉(zhuǎn)到Go語言的過來人,我非常理解這種情況,比如對(duì)于錯(cuò)誤的處理,Java語言使用Exception,Go語言則通過函數(shù)返回error,這會(huì)讓人很不習(xí)慣。
第三,沒有開源的、適合練手的項(xiàng)目。
在過去分享Go語言知識(shí)的過程中,我融入了應(yīng)對(duì)上述問題的方法并得到好評(píng),有讀者稱“你的文章給我撥云見日的感覺!”“通過你的文章我終于懂context的用法了!”……這些正向評(píng)價(jià)更堅(jiān)定了我分享內(nèi)容的信心。
于是在不斷地思考、整理后,我希望編寫一本更具系統(tǒng)性也更通俗易懂的Go語言入門和進(jìn)階書籍,以幫助學(xué)習(xí)者少走彎路,比其他人更快一步提升職業(yè)競(jìng)爭(zhēng)力。
●本書的亮點(diǎn)和設(shè)計(jì)思路
√系統(tǒng)性設(shè)計(jì):從基礎(chǔ)知識(shí)、底層原理到實(shí)戰(zhàn),讓你不僅可以學(xué)會(huì)使用這門語言,還能從該語言自身的邏輯、框架層面分析問題,并上手項(xiàng)目。這樣當(dāng)出現(xiàn)問題時(shí),你可以不再盲目地搜索知識(shí)點(diǎn)。
√案例實(shí)操:設(shè)計(jì)了很多便于運(yùn)用知識(shí)點(diǎn)的代碼示例,還特意站在學(xué)習(xí)者的視角,演示了一些容易出Bug的場(chǎng)景,幫你避雷;引入了很多生活化的場(chǎng)景,比如用“槍響后才能賽跑”的例子演示sync.Cond的使用,幫助你加深印象,緩解語言學(xué)習(xí)的枯燥感。
√貼近實(shí)際:本書內(nèi)容來源于眾多學(xué)習(xí)者的反饋。筆者在與他們的不斷交流中,總結(jié)了問題的共性,并有針對(duì)性地將其融入本書。
那么,我是怎么劃分本書內(nèi)容的呢?
作為初學(xué)者,不管你是否有編程經(jīng)驗(yàn),都需要先學(xué)習(xí)Go語言的基本語法。因此,我首先介紹Go語言的基本語法,然后,在此基礎(chǔ)上介紹Go語言的核心特性—并發(fā),這也是Go語言最自豪的功能。其基于協(xié)程的并發(fā)比我們平時(shí)使用的線程并發(fā)更輕量,可以隨意地在一臺(tái)普通的計(jì)算機(jī)上啟動(dòng)成百上千個(gè)協(xié)程,成本卻非常低。
在你掌握了基本知識(shí)后,我會(huì)通過底層分析深入講解原理。我會(huì)結(jié)合源碼,并對(duì)比其他語言的同類知識(shí),帶你理解Go語言的設(shè)計(jì)思路和底層語言邏輯。
此時(shí)你可能還有一些疑惑,比如不知道如何將知識(shí)與實(shí)際工作結(jié)合起來,這就需要后面介紹的Go語言工程管理方面的知識(shí)了。最后,我會(huì)介紹Go語言最新的特性—泛型,以方便你進(jìn)一步理解Go語言、簡(jiǎn)化代碼和提升效率。
所以,我根據(jù)這個(gè)思路將本書劃分成5個(gè)部分:
√第一部分:快速入門Go語言。我挑選了變量、常量、基礎(chǔ)數(shù)據(jù)類型、函數(shù)和方法、結(jié)構(gòu)體和接口等知識(shí)點(diǎn)進(jìn)行介紹。這部分內(nèi)容相對(duì)簡(jiǎn)潔,但已經(jīng)足夠讓你掌握Go語言的基本程序結(jié)構(gòu)了。
√第二部分:Go語言的高效并發(fā)。這部分主要介紹goroutine、channel、同步原語等知識(shí),讓你對(duì)Go語言層面的并發(fā)支持有更深入的理解,并且可以編寫自己的Go語言并發(fā)程序。這部分有一章專門介紹常用的并發(fā)模式,可以拿來即用,以更好地控制并發(fā)。
√第三部分:深入理解Go語言。這部分講解Go語言底層原理和高級(jí)功能,比如slice的底層是怎樣的、為什么這么高效等。這部分內(nèi)容是我特意為初學(xué)者設(shè)計(jì)的,因?yàn)槲以诔鯇W(xué)編程時(shí)也是只學(xué)習(xí)如何使用,而不想研究底層原理,導(dǎo)致在工作中遇到障礙后又不得不回頭惡補(bǔ)這部分知識(shí)?傊,只有理解了底層原理,你才能更靈活地編寫程序并高效地應(yīng)對(duì)問題。
√第四部分:Go語言工程管理。學(xué)習(xí)一門語言,不僅要掌握它本身的知識(shí),還要掌握模塊管理、性能優(yōu)化等周邊技能,因?yàn)檫@些技能可以幫助你更好地進(jìn)行多人協(xié)作,提高開發(fā)效率,寫出更高質(zhì)量的代碼。你可以在這部分學(xué)到如何測(cè)試Go語言代碼以提高代碼質(zhì)量、如何做好性能優(yōu)化、如何使用第三方庫來提高自己項(xiàng)目的開發(fā)效率等。
√第五部分:Go語言泛型。這是Go語言在1.18版本中新增的特性,也是大家期待已久的特性。在這部分中,我會(huì)帶你學(xué)習(xí)Go語言泛型的使用,以及如何使用泛型來提高效率和簡(jiǎn)化代碼。
作者寄語
我一直不厭其煩地跟團(tuán)隊(duì)小伙伴說,Go語言是一門現(xiàn)代編程語言,相比其他編程語言,它有更好的用戶體驗(yàn),因?yàn)樗哪康木褪亲屛覀兏鼘W⒂谧约簶I(yè)務(wù)的實(shí)現(xiàn),提高開發(fā)效率。與此同時(shí),當(dāng)下的云原生是一種趨勢(shì),Go語言非常適合部署在這種環(huán)境中,越早學(xué)習(xí)越有競(jìng)爭(zhēng)力。
此外,我在上文中也反復(fù)強(qiáng)調(diào)了學(xué)習(xí)底層原理的重要性。編程語言有很多共通之處(比如概念、關(guān)鍵字、特性語法等),吃透后再學(xué)習(xí)其他編程語言會(huì)簡(jiǎn)單很多,原因就在于你理解了語言本身。所以在學(xué)習(xí)Go語言的過程中,我希望你多想多練,深入理解,融會(huì)貫通。
現(xiàn)在,跟我一起踏上Go語言學(xué)習(xí)之旅吧!
飛雪無情
Go語言早期的布道者、“Go語言實(shí)戰(zhàn)筆 記”作者,通過“飛雪無情”公眾號(hào)與數(shù)萬名讀者交流Go語言技術(shù),擅長用通俗的語言將底層機(jī)制講得淺顯易懂。 深耕技術(shù)領(lǐng)域近十年,前隨手記技術(shù)VP、 Go Meetup講師、TGO鯤鵬會(huì)成員,目前在一家互聯(lián)網(wǎng)公司擔(dān)任副總裁,負(fù)責(zé)產(chǎn)品的研發(fā)管理和架構(gòu)設(shè)計(jì)。
前言 學(xué)習(xí)Go語言,抓住未來的機(jī)遇
●第一部分 快速入門Go語言
第1章 基礎(chǔ)入門:Hello, Go語言 2
1.1 Hello,World 2
1.2 程序結(jié)構(gòu)分析 3
1.3 搭建Go語言開發(fā)環(huán)境 4
1.3.1 在Windows下安裝 4
1.3.2 在Linux下安裝 4
1.3.3 在macOS下安裝 4
1.3.4 安裝測(cè)試 4
1.3.5 環(huán)境變量設(shè)置 5
1.4 項(xiàng)目結(jié)構(gòu) 5
1.5 編譯發(fā)布 6
1.6 跨平臺(tái)編譯 6
1.7 Go編輯器推薦 7
1.8 小結(jié) 8
第2章 數(shù)據(jù)類型:Go語言的基石 9
2.1 一個(gè)簡(jiǎn)單示例 9
2.2 基礎(chǔ)類型 11
2.2.1 整型 11
2.2.2 浮點(diǎn)型 11
2.2.3 布爾型 12
2.2.4 字符串 12
2.2.5 零值 12
2.3 變量 13
2.3.1 變量簡(jiǎn)短聲明 13
2.3.2 指針 13
2.3.3 賦值 13
2.4 常量 14
2.4.1 常量的定義 14
2.4.2 iota 14
2.5 字符串的使用 15
2.5.1 字符串和數(shù)字互轉(zhuǎn) 15
2.5.2 strings包 16
2.6 小結(jié) 16
第3章
控制結(jié)構(gòu):if、for、switch那些事兒 17
3.1 if條件語句 17
3.2 switch選擇語句 19
3.3 for循環(huán)語句 20
3.4 小結(jié) 22
第4章
集合類型:如何正確使用array、slice和map 23
4.1 數(shù)組 24
4.1.1 數(shù)組聲明 24
4.1.2 數(shù)組循環(huán) 25
4.2 切片 25
4.2.1 基于數(shù)組生成切片 26
4.2.2 切片的修改 26
4.2.3 切片的聲明 27
4.2.4 append函數(shù) 27
4.2.5 切片元素循環(huán) 28
4.3 映射 28
4.3.1 創(chuàng)建和初始化map 28
4.3.2 獲取和刪除map 29
4.3.3 遍歷map 29
4.3.4 獲取map的大小 30
4.4 string和[]byte 30
4.5 小結(jié) 31
第5章
函數(shù)和方法:如何區(qū)分函數(shù)和方法 32
5.1 函數(shù) 33
5.1.1 函數(shù)初探 33
5.1.2 函數(shù)聲明 33
5.1.3 多值返回 34
5.1.4 返回值命名 35
5.1.5 可變參數(shù) 36
5.1.6 包級(jí)函數(shù) 37
5.1.7 匿名函數(shù)和閉包 37
5.2 方法 39
5.2.1 不同于函數(shù)的方法 39
5.2.2 值和指針類型接收者 39
5.3 小結(jié) 40
第6章
struct和interface:隱式的接口實(shí)現(xiàn) 42
6.1 結(jié)構(gòu)體 43
6.1.1 結(jié)構(gòu)體的定義 43
6.1.2 聲明和使用 44
6.1.3 結(jié)構(gòu)體的字段 44
6.2 接口 45
6.2.1 接口的定義 45
6.2.2 接口的實(shí)現(xiàn) 46
6.2.3 值和指針類型接收者 47
6.3 工廠函數(shù) 48
6.4 繼承和組合 49
6.5 類型斷言 50
6.6 小結(jié) 52
第7章
錯(cuò)誤處理:如何更優(yōu)雅地處理程序異常和錯(cuò)誤 53
7.1 錯(cuò)誤 54
7.1.1 error接口 54
7.1.2 error工廠函數(shù) 55
7.1.3 自定義error 55
7.1.4 error斷言 56
7.2 錯(cuò)誤嵌套 56
7.2.1 Error Wrapping功能 56
7.2.2 errors.Unwrap函數(shù) 57
7.2.3 errors.Is函數(shù) 57
7.2.4 errors.As函數(shù) 58
7.3 defer函數(shù) 58
7.4 panic函數(shù) 59
7.5 recover函數(shù) 60
7.6 小結(jié) 60
●第二部分 Go語言的高效并發(fā)
第8章
goroutine和channel:并發(fā)的基礎(chǔ) 62
8.1 什么是并發(fā) 63
8.2 進(jìn)程和線程 63
8.2.1 進(jìn)程 63
8.2.2 線程 64
8.3 協(xié)程 64
8.4 管道 65
8.4.1 聲明一個(gè)管道 65
8.4.2 無緩沖管道 66
8.4.3 有緩沖管道 66
8.4.4 關(guān)閉管道 67
8.4.5 單向管道 67
8.5 select+channel示例 68
8.6 小結(jié) 69
第9章
同步原語:讓你對(duì)并發(fā)控制得心應(yīng)手 70
9.1 資源競(jìng)爭(zhēng) 70
9.2 同步原語 71
9.2.1 sync.Mutex 71
9.2.2 sync.RWMutex 72
9.2.3 sync.WaitGroup 73
9.2.4 sync.Once 75
9.2.5 sync.Cond 76
9.3 小結(jié) 77
第10章
Context:多協(xié)程并發(fā)控制神器 79
10.1 協(xié)程如何退出 79
10.2 Context的使用示例 81
10.3 Context詳解 82
10.4 Context樹 83
10.5 使用Context取消多個(gè)協(xié)程 84
10.6 Context傳值 85
10.7 Context使用原則 85
10.8 小結(jié) 86
第11章
并發(fā)模式:拿來即用的經(jīng)驗(yàn)總結(jié) 87
11.1 for select循環(huán)模式 87
11.2 select timeout模式 88
11.3 流水線模式 89
11.4 扇出和扇入模式 92
11.5 Future模式 94
11.6 小結(jié) 96
第12章
并發(fā)技巧:高效并發(fā)安全的字節(jié)池 97
12.1 字節(jié)切片 97
12.2 高效字節(jié)池 98
12.3 使用BytePoolCap 99
12.4
BytePoolCap與sync.Pool的
對(duì)比 99
12.5 小結(jié) 101
●第三部分 深入理解Go語言
第13章
指針詳解:什么情況下應(yīng)該使用指針 104
13.1 什么是指針 104
13.2 指針的聲明和定義 105
13.3 指針的操作 107
13.4 指針參數(shù) 107
13.5 指針接收者 108
13.6 什么情況下使用指針 108
13.7 小結(jié) 109
第14章
參數(shù)傳遞:值、引用以及指針的區(qū)別 110
14.1 修改參數(shù) 111
14.2 值類型 112
14.3 指針類型 113
14.4 引用類型 114
14.4.1 map 114
14.4.2 chan 116
14.5 類型的零值 116
14.6 小結(jié) 117
第15章
內(nèi)存分配:new和make該如何選擇 118
15.1 變量 118
15.1.1 變量的聲明 119
15.1.2 變量的賦值 119
15.2 new函數(shù) 120
15.3 變量初始化 121
15.3.1 指針變量初始化 122
15.