本書(shū)采用“理論+實(shí)例”的編寫(xiě)形式,通過(guò)大量的實(shí)例,并結(jié)合作者多年的一線開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn),全面介紹了Go語(yǔ)言的語(yǔ)法及使用方法。全書(shū)秉承方便學(xué)習(xí)、易于理解、便于查詢的理念編寫(xiě)而成,無(wú)論是想系統(tǒng)學(xué)習(xí)Go語(yǔ)言基礎(chǔ)知識(shí)的初學(xué)者,還是想進(jìn)階提高的有經(jīng)驗(yàn)開(kāi)發(fā)人員,都能通過(guò)本書(shū)迅速掌握Go語(yǔ)言的各種基礎(chǔ)語(yǔ)法和開(kāi)發(fā)技巧。本書(shū)作者曾經(jīng)與慕課網(wǎng)合作錄制過(guò)相關(guān)視頻課程,有豐富的視頻制作經(jīng)驗(yàn),所以特意為本書(shū)重點(diǎn)內(nèi)容精心錄制了配套教學(xué)視頻,這將極大地提升讀者的學(xué)習(xí)效率,取得比同類圖書(shū)更好的學(xué)習(xí)效果。另外,本書(shū)還免費(fèi)提供了書(shū)中涉及的實(shí)例源代碼,以方便讀者學(xué)習(xí)。
本書(shū)分為13章,主要介紹了Go語(yǔ)言的特性與環(huán)境搭建、基本語(yǔ)法與使用、容器(存儲(chǔ)和組織數(shù)據(jù)的方式)、流程控制、函數(shù)、結(jié)構(gòu)體、接口、包、并發(fā)、反射、編譯與工具、Go程序開(kāi)發(fā)技巧;最后的實(shí)戰(zhàn)演練部分剖析了作者的開(kāi)源網(wǎng)絡(luò)庫(kù)cellnet的架構(gòu)及設(shè)計(jì)思想,并且實(shí)現(xiàn)了Socket聊天功能。本書(shū)對(duì)于Go語(yǔ)言的并發(fā)特色功能有全面、深入的講解,需要讀者重點(diǎn)學(xué)習(xí)。
本書(shū)結(jié)構(gòu)清晰,內(nèi)容通俗易懂,案例豐富,實(shí)用性強(qiáng),特別適合Go語(yǔ)言初學(xué)者和進(jìn)階讀者閱讀。另外,本書(shū)也適合作為相關(guān)培訓(xùn)學(xué)校和各大院校的教材或教學(xué)參考書(shū)。
適讀人群 :Go語(yǔ)言入門(mén)讀者、Go語(yǔ)言進(jìn)階讀者、編程愛(ài)好者等 資深程序員、慕課網(wǎng)特邀講師分享多年的Go語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn)
詳解Go語(yǔ)法及開(kāi)發(fā)技巧,深度剖析開(kāi)源網(wǎng)絡(luò)庫(kù)cellnet的設(shè)計(jì)和架構(gòu)思想
100分鐘配套教學(xué)視頻、72個(gè)開(kāi)發(fā)實(shí)例精講
用淺顯易懂的語(yǔ)言講解,不讓讀者有云山霧罩的感覺(jué)
用大量實(shí)例帶領(lǐng)讀者學(xué)習(xí),讓讀者在實(shí)際動(dòng)手中提高編程水平
給出了大量的“避坑”技巧,讓讀者在實(shí)際開(kāi)發(fā)中少走彎路
實(shí)例來(lái)自于作者多年的口述教學(xué)和技術(shù)分享會(huì),廣受業(yè)界好評(píng)
每個(gè)實(shí)例程序都精心設(shè)計(jì),讓Go語(yǔ)言學(xué)習(xí)者大呼過(guò)癮
本書(shū)內(nèi)容速覽:
初識(shí)Go語(yǔ)言
Go語(yǔ)言基本語(yǔ)法與使用
容器:存儲(chǔ)和組織數(shù)據(jù)的方式
流程控制
函數(shù)(function)
結(jié)構(gòu)體(struct)
接口(interface)
包(package)
并發(fā)
反射
編譯與工具
“避坑”與技巧
實(shí)戰(zhàn)演練——剖析cellnet網(wǎng)絡(luò)庫(kù)設(shè)計(jì)并實(shí)現(xiàn)Socket聊天功能
前言 現(xiàn)今,多核CPU已經(jīng)成為服務(wù)器的標(biāo)配。但是對(duì)多核的運(yùn)算能力挖掘一直由程序員人工設(shè)計(jì)算法及框架來(lái)完成。這個(gè)過(guò)程需要開(kāi)發(fā)人員具有一定的并發(fā)設(shè)計(jì)及框架設(shè)計(jì)能力。雖然一些編程語(yǔ)言的框架在不斷地提高多核資源使用效率,如Java的Netty等,但仍然需要開(kāi)發(fā)人員花費(fèi)大量的時(shí)間和精力搞懂這些框架的運(yùn)行原理后才能熟練掌握。
Go語(yǔ)言在多核并發(fā)上擁有原生的設(shè)計(jì)優(yōu)勢(shì)。Go語(yǔ)言從2009年11月開(kāi)源,2012年發(fā)布Go 1.0穩(wěn)定版本以來(lái),已經(jīng)擁有活躍的社區(qū)和全球眾多開(kāi)發(fā)者,并且與蘋(píng)果公司的Swift一樣,成為當(dāng)前非常流行的開(kāi)發(fā)語(yǔ)言之一。很多公司,特別是中國(guó)的互聯(lián)網(wǎng)公司,即將或者已經(jīng)完成了使用Go語(yǔ)言改造舊系統(tǒng)的過(guò)程。經(jīng)過(guò)Go語(yǔ)言重構(gòu)的系統(tǒng)能使用更少的硬件資源而有更高的并發(fā)和I/O吞吐表現(xiàn)。
Go語(yǔ)言簡(jiǎn)單易學(xué),學(xué)習(xí)曲線平緩,不需要像C/C++語(yǔ)言動(dòng)輒需要兩到三年的學(xué)習(xí)期。Go語(yǔ)言被稱為“互聯(lián)網(wǎng)時(shí)代的C語(yǔ)言”;ヂ(lián)網(wǎng)的短、頻、快特性在Go語(yǔ)言中體現(xiàn)得淋漓盡致。一個(gè)熟練的開(kāi)發(fā)者只需要短短的一周時(shí)間就可以從學(xué)習(xí)階段轉(zhuǎn)到開(kāi)發(fā)階段,并完成一個(gè)高并發(fā)的服務(wù)器開(kāi)發(fā)。
面對(duì)Go語(yǔ)言的普及和學(xué)習(xí)熱潮,本書(shū)使用淺顯易懂的語(yǔ)言,介紹了GO語(yǔ)言從基礎(chǔ)的語(yǔ)法知識(shí)到并發(fā)和接口等新特性知識(shí),從而帶領(lǐng)讀者迅速熟悉這門(mén)新時(shí)代的編程語(yǔ)言。
本書(shū)特色 1. 提供同步配套的教學(xué)視頻 為了讓讀者更好地學(xué)習(xí)本書(shū),作者為書(shū)中的重點(diǎn)內(nèi)容錄制了配套教學(xué)視頻,借助這些視頻,讀者可以更輕松地學(xué)習(xí)。
作者曾經(jīng)為慕課網(wǎng)的專業(yè)視頻制作提供指導(dǎo),并在慕課網(wǎng)做過(guò)多期Go語(yǔ)言、Unity 3D游戲引擎和Cocos游戲引擎等網(wǎng)絡(luò)教學(xué)培訓(xùn),受到眾多開(kāi)發(fā)者的青睞及好評(píng)。希望讀者能夠通過(guò)作者錄制的視頻輕松地學(xué)習(xí)Go語(yǔ)言。
2. 來(lái)自一線的開(kāi)發(fā)經(jīng)驗(yàn)及實(shí)戰(zhàn)例子 本書(shū)中的大多數(shù)例子及代碼都來(lái)自于作者多年的口述教學(xué)和技術(shù)分享會(huì)等實(shí)踐,受到了眾多開(kāi)發(fā)者的一致好評(píng)。同時(shí),作者本人也是一名開(kāi)源愛(ài)好者,編寫(xiě)了業(yè)內(nèi)著名的cellnet網(wǎng)絡(luò)庫(kù)。本書(shū)將為讀者介紹cellnet的架構(gòu)和設(shè)計(jì)思想,以幫助讀者剖析cellnet內(nèi)部的運(yùn)行機(jī)制,從而讓讀者能方便地使用cellnet快速實(shí)現(xiàn)業(yè)務(wù)邏輯。
3. 淺顯易懂的語(yǔ)言、觸類旁通的講解、循序漸進(jìn)的知識(shí)體系 本書(shū)在內(nèi)容編排上盡量做到通俗易懂;在講解一些常見(jiàn)編程語(yǔ)言特性時(shí),將Go語(yǔ)言和其他多種語(yǔ)言的特性進(jìn)行對(duì)比,讓掌握多種編程語(yǔ)言的開(kāi)發(fā)者能迅速理解Go語(yǔ)言的特性。無(wú)論是初學(xué)者,還是久經(jīng)“沙場(chǎng)”的老程序員,都能通過(guò)本書(shū)快速學(xué)習(xí)Go語(yǔ)言的精華。
4. 內(nèi)容全面,實(shí)用性強(qiáng) 本書(shū)詳細(xì)介紹了作者精心挑選的多個(gè)實(shí)用性很強(qiáng)的例子,如JSON串行化、有限狀態(tài)機(jī)(FSM)、TCP粘包處理、Echo服務(wù)器和事件系統(tǒng)等。讀者既可以從例子中學(xué)習(xí)并理解Go語(yǔ)言的知識(shí)點(diǎn),還可以將這些例子應(yīng)用于實(shí)際開(kāi)發(fā)中。
本書(shū)內(nèi)容 第1章 初識(shí)Go語(yǔ)言 本章主要介紹了以下內(nèi)容:
。1)Go語(yǔ)言的特性; (2)使用Go語(yǔ)言的開(kāi)源項(xiàng)目; 。3)安裝Go語(yǔ)言開(kāi)發(fā)包和搭建其開(kāi)發(fā)環(huán)境。
第2章 Go語(yǔ)言基本語(yǔ)法與使用 本章主要介紹了Go語(yǔ)言的基本語(yǔ)法,如變量、各種常見(jiàn)數(shù)據(jù)類型及常量,此外還介紹了Go 1.9版本中新添加的特性,即類型別名。
第3章 容器:存儲(chǔ)和組織數(shù)據(jù)的方式 本章介紹了Go語(yǔ)言編程算法中常用的容器,如數(shù)組、切片、映射,以及列表的創(chuàng)建、設(shè)置、獲取、查詢和遍歷等操作。
第4章 流程控制 本章主要介紹了常見(jiàn)的條件判斷、循環(huán)和分支語(yǔ)句,包括以下內(nèi)容:
。1)條件判斷(if); (2)條件循環(huán)(for); 。3)鍵值循環(huán)(for range); 。4)分支選擇(switch); 。5)跳轉(zhuǎn)語(yǔ)句(goto); (6)跳出循環(huán)(break)和繼續(xù)循環(huán)(continue)。
第5章 函數(shù)(function) 本章首先介紹了Go語(yǔ)言中較為基礎(chǔ)的函數(shù)聲明格式及命名返回值特性;然后介紹了Go語(yǔ)言中較為靈活的特性,即函數(shù)變量和匿名函數(shù);還介紹了一個(gè)展示操作與數(shù)據(jù)分離的示例:字符串的鏈?zhǔn)教幚,從而引出函?shù)閉包概念;之后介紹了Go語(yǔ)言中最具特色的如下幾個(gè)功能:
。1)延遲執(zhí)行語(yǔ)句(defer)——將語(yǔ)句延遲到函數(shù)退出時(shí)執(zhí)行; 。2)宕機(jī)(panic)——終止程序運(yùn)行; (3)宕機(jī)恢復(fù)(recover)——讓程序從宕機(jī)中恢復(fù)。
第6章 結(jié)構(gòu)體(struct) 本章介紹了Go語(yǔ)言中最重要的概念:結(jié)構(gòu)體。首先講解了結(jié)構(gòu)體多種靈活的實(shí)例化和成員初始化方法;接著使用面向?qū)ο蠛兔嫦蜻^(guò)程等思想,逐步介紹了Go語(yǔ)言中的方法及新的概念接收器;然后使用游戲中經(jīng)典的位置移動(dòng)例子,展現(xiàn)了結(jié)構(gòu)體的實(shí)際使用方法;最后,使用大量例子介紹了結(jié)構(gòu)體內(nèi)嵌和類型內(nèi)嵌內(nèi)容,并在JSON數(shù)據(jù)的分離實(shí)例中體驗(yàn)Go語(yǔ)言的內(nèi)嵌結(jié)構(gòu)體的強(qiáng)大功能。
本章中的經(jīng)典例子:使用事件系統(tǒng)實(shí)現(xiàn)事件的響應(yīng)和處理——展現(xiàn)Go語(yǔ)言的方法與函數(shù)的統(tǒng)一調(diào)用過(guò)程。
第7章 接口(interface) 本章介紹了Go語(yǔ)言接口的如下幾個(gè)知識(shí)點(diǎn):
(1)聲明接口; (2)實(shí)現(xiàn)接口的條件; (3)接口的嵌套組合; (4)接口的轉(zhuǎn)換; (5)接口類型斷言和類型分支——判斷接口的類型; (6)空接口。
本章中涉及的例子有:便于擴(kuò)展輸出方式的日志系統(tǒng);使用接口進(jìn)行數(shù)據(jù)的排序;使用空接口實(shí)現(xiàn)可以保存任意值的字典及實(shí)現(xiàn)有限狀態(tài)機(jī)(FSM)等。
第8章 包(package) 本章首先介紹了構(gòu)建工程的基礎(chǔ)概念GOPATH,接著介紹了包(package)的創(chuàng)建和導(dǎo)入過(guò)程與方法,以及能控制訪問(wèn)權(quán)限的導(dǎo)出包內(nèi)標(biāo)識(shí)符的方法。
本章給出了一個(gè)典型的工廠模式自動(dòng)注冊(cè)示例,介紹了多個(gè)包的定義和使用方法。
第9章 并發(fā) 本章講解了Go語(yǔ)言中并發(fā)的兩個(gè)重要概念:輕量級(jí)線程(goroutine)和通道(channel)。首先介紹了goroutine的創(chuàng)建方法及一些和并發(fā)相關(guān)的概念,便于讀者理解goroutine和線程的區(qū)別與聯(lián)系;然后介紹了通道的聲明、創(chuàng)建和使用方法,使用3個(gè)示例,即模擬遠(yuǎn)程過(guò)程調(diào)用(RPC)、使用通道響應(yīng)計(jì)時(shí)器事件和Telnet回音服務(wù)器,來(lái)展示通道的實(shí)際使用方法;最后介紹了在并發(fā)環(huán)境下的同步處理方法,如使用互斥鎖和等待組等,以及使用競(jìng)態(tài)檢測(cè)提前發(fā)現(xiàn)并發(fā)問(wèn)題。
第10章 反射 本章按照反射的類別分為兩部分:反射類型對(duì)象(reflect.Type)和反射值對(duì)象(reflect.Value)。首先介紹了反射類型的獲取及遍歷方法,同時(shí)介紹了反射類型對(duì)象獲取結(jié)構(gòu)體標(biāo)簽的方法;接著介紹了反射值對(duì)象獲取及修改值和遍歷值等;最后通過(guò)使用反射將結(jié)構(gòu)體串行化為JSON格式字符串的示例,介紹了反射在實(shí)際中的運(yùn)用。
第11章 編譯與工具 本章介紹了Go語(yǔ)言中常用的編譯及工具指令,例如:
。1)go build/go install——編譯及安裝源碼; 。2)go get——遠(yuǎn)程獲取并安裝源碼; 。3)go test——單元測(cè)試和基準(zhǔn)測(cè)試框架; (4)go pprof——性能分析工具。
第12章 “避坑”與技巧 本章首先介紹了作者多年使用Go語(yǔ)言的開(kāi)發(fā)經(jīng)驗(yàn)和技巧總結(jié),以及一些使用Go語(yǔ)言中可能發(fā)生的錯(cuò)誤及優(yōu)化建議,例如合理使用并發(fā)、在性能與靈活性中做出取舍后再使用反射等;接著介紹了Go語(yǔ)言中一個(gè)不為人知的特性——map的多鍵索引,利用該特性可以方便地對(duì)數(shù)據(jù)進(jìn)行多個(gè)條件的索引;最后介紹了使用Go語(yǔ)言的Socket處理TCP粘包問(wèn)題。
第13章 實(shí)戰(zhàn)演練——剖析cellnet網(wǎng)絡(luò)庫(kù)設(shè)計(jì)并實(shí)現(xiàn)Socket聊天功能 本章介紹了cellnet網(wǎng)絡(luò)庫(kù)的基本特性、流程、架構(gòu)及如下幾個(gè)關(guān)鍵概念:
(1)連接管理; 。2)會(huì)話收發(fā)數(shù)據(jù)流程; 。3)事件隊(duì)列; (4)消息編碼; (5)消息元信息; (6)接收和發(fā)送封包。
本章使用cellnet網(wǎng)絡(luò)庫(kù)實(shí)現(xiàn)了帶有聊天功能的客戶端和服務(wù)器。
本書(shū)讀者對(duì)象* Go語(yǔ)言初學(xué)者;* Go語(yǔ)言進(jìn)階讀者;* 編程初學(xué)者;* 后端程序初學(xué)者;* 前端轉(zhuǎn)后端的開(kāi)發(fā)人員;* 熟悉C/C++、Java和C#語(yǔ)言,想了解和學(xué)習(xí)Go語(yǔ)言的編程愛(ài)好者;* 想用Go語(yǔ)言快速學(xué)習(xí)編寫(xiě)服務(wù)器端程序的開(kāi)發(fā)者;* 相關(guān)培訓(xùn)學(xué)員;* 各大院校的學(xué)生。
關(guān)于作者 本書(shū)由徐波編寫(xiě),郭聰和張銳參與審核和校對(duì)。感謝我的妻子和家人在我寫(xiě)書(shū)期間的大力支持。
另外,在本書(shū)編寫(xiě)期間,得到了吳宏偉先生的耐心指導(dǎo),他一絲不茍、細(xì)致入微地對(duì)書(shū)稿進(jìn)行了審核和校對(duì),這讓本書(shū)的條理更加清晰,語(yǔ)言更加通俗易懂。在此表示深深的感謝!
雖然我們對(duì)書(shū)中所述內(nèi)容都盡量核實(shí),并多次進(jìn)行了文字校對(duì),但因時(shí)間所限,加之水平所限,書(shū)中的疏漏和錯(cuò)誤在所難免,敬請(qǐng)廣大讀者批評(píng)指正。
徐波
徐波 資深全棧游戲開(kāi)發(fā)者,慕課網(wǎng)特邀講師,開(kāi)源愛(ài)好者,Gopher之一。游戲行業(yè)從業(yè)十余年。曾就職于著名的網(wǎng)絡(luò)游戲公司Possibility Space,與暴雪星際爭(zhēng)霸程序Gage Galinger和美術(shù)界知名原畫(huà)師朱峰(變形金剛電影版紅蜘蛛設(shè)計(jì)者)一起開(kāi)發(fā)了大型3D暗黑系魔幻網(wǎng)游Warrior Epic。業(yè)界*早實(shí)現(xiàn)了微端Download On Demand技術(shù)。2009年開(kāi)設(shè)戰(zhàn)魂小筑博客。2012年開(kāi)始使用Go語(yǔ)言,并在GitHub上發(fā)布了cellnet網(wǎng)絡(luò)庫(kù)及tabtoy導(dǎo)表工具,深受業(yè)界贊譽(yù)。作為慕課網(wǎng)特邀講師,制作了多個(gè)技術(shù)視頻,講授Go語(yǔ)言、Cocos和Unity等課程,廣受學(xué)員好評(píng)。
配套學(xué)習(xí)資源
前言
第1章 初識(shí)Go語(yǔ)言1
1.1 Go語(yǔ)言特性1
1.2 使用Go語(yǔ)言的項(xiàng)目9
1.3 怎樣安裝Go語(yǔ)言開(kāi)發(fā)包10
1.3.1 Windows版安裝11
1.3.2 Linux版安裝13
1.4 搭建開(kāi)發(fā)環(huán)境14
1.4.1 集成開(kāi)發(fā)環(huán)境——Jetbrains GoLand14
1.4.2 方便定義功能的編輯器——Visual Studio Code15
第2章 Go語(yǔ)言基本語(yǔ)法與使用19
2.1 變量19
2.1.1 聲明變量19
2.1.2 初始化變量20
2.1.3 多個(gè)變量同時(shí)賦值23
2.1.4 匿名變量——沒(méi)有名字的變量24
2.2 數(shù)據(jù)類型24
2.2.1 整型25
2.2.2 浮點(diǎn)型25
2.2.3 示例:輸出正弦函數(shù)(Sin)圖像26
2.2.4 布爾型28
2.2.5 字符串29
2.2.6 字符31
2.2.7 切片——能動(dòng)態(tài)分配的空間32
2.3 轉(zhuǎn)換不同的數(shù)據(jù)類型33
2.4 指針34
2.4.1 認(rèn)識(shí)指針地址和指針類型35
2.4.2 從指針獲取指針指向的值36
2.4.3 使用指針修改值37
2.4.4 示例:使用指針變量獲取命令行的輸入信息39
2.4.5 創(chuàng)建指針的另一種方法——new()函數(shù)40
2.5 變量生命期——變量能夠使用的代碼范圍40
2.5.1 什么是棧41
2.5.2 什么是堆42
2.5.3 變量逃逸(Escape Analysis)——自動(dòng)決定變量分配方式,提高運(yùn)行效率43
2.6 字符串應(yīng)用46
2.6.1 計(jì)算字符串長(zhǎng)度46
2.6.2 遍歷字符串——獲取每一個(gè)字符串元素47
2.6.3 獲取字符串的某一段字符48
2.6.4 修改字符串49
2.6.5 連接字符串49
2.6.6 格式化50
2.6.7 示例:Base64編碼——電子郵件的基礎(chǔ)編碼格式51
2.6.8 示例:從INI配置文件中查詢需要的值52
2.7 常量——恒定不變的值57
2.7.1 枚舉——一組常量值58
2.7.2 將枚舉值轉(zhuǎn)換為字符串59
2.8 類型別名(Type Alias)60
2.8.1 區(qū)分類型別名與類型定義61
2.8.2 非本地類型不能定義方法62
2.8.3 在結(jié)構(gòu)體成員嵌入時(shí)使用別名63
第3章 容器:存儲(chǔ)和組織數(shù)據(jù)的方式65
3.1 數(shù)組——固定大小的連續(xù)空間65
3.1.1 聲明數(shù)組66
3.1.2 初始化數(shù)組66
3.1.3 遍歷數(shù)組——訪問(wèn)每一個(gè)數(shù)組元素67
3.2 切片(slice)——?jiǎng)討B(tài)分配大小的連續(xù)空間67
3.2.1 從數(shù)組或切片生成新的切片68
3.2.2 聲明切片70
3.2.3 使用make()函數(shù)構(gòu)造切片71
3.2.4 使用append()函數(shù)為切片添加元素71
3.2.5 復(fù)制切片元素到另一個(gè)切片73
3.2.6 從切片中刪除元素74
3.3 映射(map)——建立事物關(guān)聯(lián)的容器76
3.3.1 添加關(guān)聯(lián)到map并訪問(wèn)關(guān)聯(lián)和數(shù)據(jù)76
3.3.2 遍歷map的“鍵值對(duì)”——?訪問(wèn)每一個(gè)map中的關(guān)聯(lián)關(guān)系77
3.3.3 使用delete()函數(shù)從map中刪除鍵值對(duì)79
3.3.4 清空map中的所有元素79
3.3.5 能夠在并發(fā)環(huán)境中使用的map——?sync.Map79
3.4 列表(list)——可以快速增刪的非連續(xù)空間的容器81
3.4.1 初始化列表83
3.4.2 在列表中插入元素83
3.4.3 從列表中刪除元素84
3.4.4 遍歷列表——訪問(wèn)列表的每一個(gè)元素85
第4章 流程控制87
4.1 條件判斷(if)87
4.2 構(gòu)建循環(huán)(for)88
4.2.1 for中的初始語(yǔ)句——開(kāi)始循環(huán)時(shí)執(zhí)行的語(yǔ)句89
4.2.2 for中的條件表達(dá)式——控制是否循環(huán)的開(kāi)關(guān)89
4.2.3 for中的結(jié)束語(yǔ)句——每次循環(huán)結(jié)束時(shí)執(zhí)行的語(yǔ)句90
4.3 示例:九九乘法表90
4.4 鍵值循環(huán)(for range)——直接獲得對(duì)象的索引和數(shù)據(jù)91
4.4.1 遍歷數(shù)組、切片——獲得索引和元素92
4.4.2 遍歷字符串——獲得字符92
4.4.3 遍歷map——獲得map的鍵和值92
4.4.4 遍歷通道(channel)——接收通道數(shù)據(jù)93
4.4.5 在遍歷中選擇希望獲得的變量93
4.5 分支選擇(switch)——擁有多個(gè)條件分支的判斷94
4.5.1 基本寫(xiě)法95
4.5.2 跨越case的fallthrough——兼容C語(yǔ)言的case設(shè)計(jì)96
4.6 跳轉(zhuǎn)到指定代碼標(biāo)簽(goto)96
4.6.1 使用goto退出多層循環(huán)96
4.6.2 使用goto集中處理錯(cuò)誤97
4.6.3 統(tǒng)一錯(cuò)誤處理98
4.7 跳出指定循環(huán)(break)——可以跳出多層循環(huán)99
4.8 繼續(xù)下一次循環(huán)(continue)100
第5章 函數(shù)(function)101
5.1 聲明函數(shù)101
5.1.1 普通函數(shù)的聲明形式101
5.1.2 參數(shù)類型的簡(jiǎn)寫(xiě)102
5.1.3 函數(shù)的返回值102
5.1.4 調(diào)用函數(shù)104
5.1.5 示例:將“秒”解析為時(shí)間單位104
5.1.6 示例:函數(shù)中的參數(shù)傳遞效果測(cè)試105
5.2 函數(shù)變量——把函數(shù)作為值保存到變量中108
5.3 示例:字符串的鏈?zhǔn)教幚怼僮髋c數(shù)據(jù)分離的設(shè)計(jì)技巧109
5.4 匿名函數(shù)——沒(méi)有函數(shù)名字的函數(shù)112
5.4.1 定義一個(gè)匿名函數(shù)112
5.4.2 匿名函數(shù)用作回調(diào)函數(shù)113
5.4.3 使用匿名函數(shù)實(shí)現(xiàn)操作封裝113
5.5 函數(shù)類型實(shí)現(xiàn)接口——把函數(shù)作為接口來(lái)調(diào)用115
5.5.1 結(jié)構(gòu)體實(shí)現(xiàn)接口115
5.5.2 函數(shù)體實(shí)現(xiàn)接口116
5.5.3 HTTP包中的例子117
5.6 閉包(Closure)——引用了外部變量的匿名函數(shù)118
5.6.1 在閉包內(nèi)部修改引用的變量119
5.6.2 示例:閉包的記憶效應(yīng)119
5.6.3 示例:閉包實(shí)現(xiàn)生成器121
5.7 可變參數(shù)——參數(shù)數(shù)量不固定的函數(shù)形式122
5.7.1 fmt包中的例子122
5.7.2 遍歷可變參數(shù)列表——獲取每一個(gè)參數(shù)的值123
5.7.3 獲得可變參數(shù)類型——獲得每一個(gè)參數(shù)的類型124
5.7.4 在多個(gè)可變參數(shù)函數(shù)中傳遞參數(shù)125
5.8 延遲執(zhí)行語(yǔ)句(defer)127
5.8.1 多個(gè)延遲執(zhí)行語(yǔ)句的處理順序127
5.8.2 使用延遲執(zhí)行語(yǔ)句在函數(shù)退出時(shí)釋放資源127
5.9 處理運(yùn)行時(shí)發(fā)生的錯(cuò)誤131
5.9.1 net包中的例子131
5.9.2 錯(cuò)誤接口的定義格式132
5.9.3 自定義一個(gè)錯(cuò)誤132
5.9.4 示例:在解析中使用自定義錯(cuò)誤133
5.10 宕機(jī)(panic)——程序終止運(yùn)行135
5.10.1 手動(dòng)觸發(fā)宕機(jī)135
5.10.2 在運(yùn)行依賴的必備資源缺失時(shí)主動(dòng)觸發(fā)宕機(jī)136
5.10.3 在宕機(jī)時(shí)觸發(fā)延遲執(zhí)行語(yǔ)句136
5.11 宕機(jī)恢復(fù)(recover)——防止程序崩潰137
5.11.1 讓程序在崩潰時(shí)繼續(xù)執(zhí)行137
5.11.2 panic和recover的關(guān)系139
第6章 結(jié)構(gòu)體(struct)141
6.1 定義結(jié)構(gòu)體141
6.2 實(shí)例化結(jié)構(gòu)體——為結(jié)構(gòu)體分配內(nèi)存并初始化142
6.2.1 基本的實(shí)例化形式142
6.2.2 創(chuàng)建指針類型的結(jié)構(gòu)體143
6.2.3 取結(jié)構(gòu)體的地址實(shí)例化143
6.3 初始化結(jié)構(gòu)體的成員變量144
6.3.1 使用“鍵值對(duì)”初始化結(jié)構(gòu)體145
6.3.2 使用多個(gè)值的列表初始化結(jié)構(gòu)體146
6.3.3 初始化匿名結(jié)構(gòu)體147
6.4 構(gòu)造函數(shù)——結(jié)構(gòu)體和類型的一系列初始化操作的函數(shù)封裝148
6.4.1 多種方式創(chuàng)建和初始化結(jié)構(gòu)體——模擬構(gòu)造函數(shù)重載149
6.4.2 帶有父子關(guān)系的結(jié)構(gòu)體的構(gòu)造和初始化——模擬父級(jí)構(gòu)造調(diào)用149
6.5 方法150
6.5.1 為結(jié)構(gòu)體添加方法151
6.5.2 接收器——方法作用的目標(biāo)152
6.5.3 示例:二維矢量模擬玩家移動(dòng)155
6.5.4 為類型添加方法160
6.5.5 示例:使用事件系統(tǒng)實(shí)現(xiàn)事件的響應(yīng)和處理165
6.6 類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌170
6.6.1 聲明結(jié)構(gòu)體內(nèi)嵌170
6.6.2 結(jié)構(gòu)內(nèi)嵌特性172
6.6.3 使用組合思想描述對(duì)象特性173
6.6.4 初始化結(jié)構(gòu)體內(nèi)嵌174
6.6.5 初始化內(nèi)嵌匿名結(jié)構(gòu)體175
6.6.6 成員名字沖突177
6.7 示例:使用匿名結(jié)構(gòu)體分離JSON數(shù)據(jù)178
第7章 接口(interface)181
7.1 聲明接口181
7.1.1 接口聲明的格式181
7.1.2 開(kāi)發(fā)中常見(jiàn)的接口及寫(xiě)法182
7.2 實(shí)現(xiàn)接口的條件182
7.2.1 接口被實(shí)現(xiàn)的條件一:接口的方法與實(shí)現(xiàn)接口的類型方法格式一致182
7.2.2 條件二:接口中所有方法均被實(shí)現(xiàn)185
7.3 理解類型與接口的關(guān)系186
7.3.1 一個(gè)類型可以實(shí)現(xiàn)多個(gè)接口186
7.3.2 多個(gè)類型可以實(shí)現(xiàn)相同的接口187
7.4 示例:便于擴(kuò)展輸出方式的日志系統(tǒng)189
7.5 示例:使用接口進(jìn)行數(shù)據(jù)的排序195
7.5.1 使用sort.Interface接口進(jìn)行排序195
7.5.2 常見(jiàn)類型的便捷排序197
7.5.3 對(duì)結(jié)構(gòu)體數(shù)據(jù)進(jìn)行排序199
7.6 接口的嵌套組合——將多個(gè)接口放在一個(gè)接口內(nèi)202
7.7 在接口和類型間轉(zhuǎn)換205
7.7.1 類型斷言的格式205
7.7.2 將接口轉(zhuǎn)換為其他接口205
7.7.3 將接口轉(zhuǎn)換為其他類型208
7.8 空接口類型(interface{})——能保存所有值的類型208
7.8.1 將值保存到空接口209
7.8.2 從空接口獲取值209
7.8.3 空接口的值比較210
7.9 示例:使用空接口實(shí)現(xiàn)可以保存任意值的字典211
7.10 類型分支——批量判斷空接口中變量的類型214
7.10.1 類型斷言的書(shū)寫(xiě)格式214
7.10.2 使用類型分支判斷基本類型215
7.10.3 使用類型分支判斷接口類型215
7.11 示例:實(shí)現(xiàn)有限狀態(tài)機(jī)(FSM)217
第8章 包(package)227
8.1 工作目錄(GOPATH)227
8.1.1 使用命令行查看GOPATH信息227
8.1.2 使用GOPATH的工程結(jié)構(gòu)228
8.1.3 設(shè)置和使用GOPATH229
8.1.4 在多項(xiàng)目工程中使用GOPATH230
8.2 創(chuàng)建包package——編寫(xiě)自己的代碼擴(kuò)展231
8.3 導(dǎo)出標(biāo)識(shí)符——讓外部訪問(wèn)包的類型和值231
8.3.1 導(dǎo)出包內(nèi)標(biāo)識(shí)符231
8.3.2 導(dǎo)出結(jié)構(gòu)體及接口成員232
8.4 導(dǎo)入包(import)——在代碼中使用其他的代碼232
8.4.1 默認(rèn)導(dǎo)入的寫(xiě)法233
8.4.2 導(dǎo)入包后自定義引用的包名234
8.4.3 匿名導(dǎo)入包——只導(dǎo)入包但不使用包內(nèi)類型和數(shù)值235
8.4.4 包在程序啟動(dòng)前的初始化入口:init235
8.4.5 理解包導(dǎo)入后的init()函數(shù)初始化順序235
8.5 示例:工廠模式自動(dòng)注冊(cè)——管理多個(gè)包的結(jié)構(gòu)體237
第9章 并發(fā)241
9.1 輕量級(jí)線程(goroutine)——根據(jù)需要隨時(shí)創(chuàng)建的“線程”241
9.1.1 使用普通函數(shù)創(chuàng)建goroutine241
9.1.2 使用匿名函數(shù)創(chuàng)建goroutine244
9.1.3 調(diào)整并發(fā)的運(yùn)行性能(GOMAXPROCS)245
9.1.4 理解并發(fā)和并行245
9.1.5 Go語(yǔ)言的協(xié)作程序(goroutine)和普通的協(xié)作程序(coroutine)246
9.2 通道(channel)——在多個(gè)goroutine間通信的管道246
9.2.1 通道的特性247
9.2.2 聲明通道類型247
9.2.3 創(chuàng)建通道248
9.2.4 使用通道發(fā)送數(shù)據(jù)248
9.2.5 使用通道接收數(shù)據(jù)249
9.2.6 示例:并發(fā)打印252
9.2.7 單向通道——通道中的單行道254
9.2.8 帶緩沖的通道255
9.2.9 通道的多路復(fù)用——同時(shí)處理接收和發(fā)送多個(gè)通道的數(shù)據(jù)257
9.2.10 示例:模擬遠(yuǎn)程過(guò)程調(diào)用(RPC)258
9.2.11 示例:使用通道響應(yīng)計(jì)時(shí)器的事件261
9.2.12 關(guān)閉通道后繼續(xù)使用通道264
9.3 示例:Telnet回音服務(wù)器——TCP服務(wù)器的基本結(jié)構(gòu)266
9.4 同步——保證并發(fā)環(huán)境下數(shù)據(jù)訪問(wèn)的正確性273
9.4.1 競(jìng)態(tài)檢測(cè)——檢測(cè)代碼在并發(fā)環(huán)境下可能出現(xiàn)的問(wèn)題273
9.4.2 互斥鎖(sync.Mutex)——保證同時(shí)只有一個(gè)goroutine可以訪問(wèn)共享資源275
9.4.3 讀寫(xiě)互斥鎖(sync.RWMutex)——在讀比寫(xiě)多的環(huán)境下比互斥鎖更高效277
9.4.4 等待組(sync.WaitGroup)——保證在并發(fā)環(huán)境中完成指定數(shù)量的任務(wù)277
第10章 反射280
10.1 反射的類型對(duì)象(reflect.Type)280
10.1.1 理解反射的類型(Type)與種類(Kind)281
10.1.2 指針與指針指向的元素283
10.1.3 使用反射獲取結(jié)構(gòu)體的成員類型284
10.1.4 結(jié)構(gòu)體標(biāo)簽(Struct Tag)——對(duì)結(jié)構(gòu)體字段的額外信息標(biāo)簽287
10.2 反射的值對(duì)象(reflect.Value)288
10.2.1 使用反射值對(duì)象包裝任意值288
10.2.2 從反射值對(duì)象獲取被包裝的值289
10.2.3 使用反射訪問(wèn)結(jié)構(gòu)體的成員字段的值290
10.2.4 反射對(duì)象的空和有效性判斷292
10.2.5 使用反射值對(duì)象修改變量的值293
10.2.6 通過(guò)類型創(chuàng)建類型的實(shí)例297
10.2.7 使用反射調(diào)用函數(shù)298
10.3 示例:將結(jié)構(gòu)體的數(shù)據(jù)保存為JSON格式的文本數(shù)據(jù)299
第11章 編譯與工具306
11.1 編譯(go build)306
11.1.1 go build 無(wú)參數(shù)編譯306
11.1.2 go build+文件列表307
11.1.3 go build +包308
11.1. 4 go build編譯時(shí)的附加參數(shù)310
11.2 編譯后運(yùn)行(go run)310
11.3 編譯并安裝(go install)311
11.4 一鍵獲取代碼、編譯并安裝(go get)312
11.4.1 遠(yuǎn)程包的路徑格式312
11.4.2 go get + 遠(yuǎn)程包312
11.4.3 go get使用時(shí)的附加參數(shù)313
11.5 測(cè)試(go test)313
11.5.1 單元測(cè)試——測(cè)試和驗(yàn)證代碼的框架313
11.5.2 基準(zhǔn)測(cè)試——獲得代碼內(nèi)存占用和運(yùn)行效率的性能數(shù)據(jù)316
11.6 性能分析(go pprof)——發(fā)現(xiàn)代碼性能問(wèn)題的調(diào)用位置319
11.6.1 安裝第三方圖形化顯式分析數(shù)據(jù)工具(Graphviz)319
11.6.2 安裝第三方性能分析來(lái)分析代碼包319
11.6.3 性能分析代碼319
第12章 “避坑”與技巧323
12.1 合理地使用并發(fā)特性323
12.1.1 了解goroutine的生命期時(shí)再創(chuàng)建goroutine323
12.1.2 避免在不必要的地方使用通道326
12.2 反射:性能和靈活性的雙刃劍330
12.3 接口的nil判斷335
12.4 map的多鍵索引——多個(gè)數(shù)值條件可以同時(shí)查詢336
12.4.1 基于哈希值的多鍵索引及查詢337
12.4.2 利用map特性的多鍵索引及查詢341
12.4.3 總結(jié)342
12.5 優(yōu)雅地處理TCP粘包342
第13章 實(shí)戰(zhàn)演練——剖析cellnet網(wǎng)絡(luò)庫(kù)設(shè)計(jì)并實(shí)現(xiàn)Socket聊天功能354
13.1 了解cellet網(wǎng)絡(luò)庫(kù)特性、流程及架構(gòu)354
13.1.1 cellnet網(wǎng)絡(luò)庫(kù)的特性354
13.1.2 cellnet網(wǎng)絡(luò)庫(kù)的流程及架構(gòu)356
13.2 管理TCP Socket連接356
13.2.1 理解Socket的事件類型357
13.2.2 管理事件回調(diào)359
13.2.3 連接器(Connector)361
13.2.4 會(huì)話管理(SessionManager)363
13.2.5 接受器(Acceptor)366
13.3 組織接收和發(fā)送數(shù)據(jù)流程的Socket會(huì)話(Session)367
13.3.1 在會(huì)話開(kāi)始時(shí)啟動(dòng)goroutine和派發(fā)事件368
13.3.2 會(huì)話中的接收數(shù)據(jù)循環(huán)369
13.3.3 會(huì)話中的發(fā)送數(shù)據(jù)循環(huán)370
13.4 排隊(duì)處理事件的事件隊(duì)列(EventQueue)372
13.4.1 實(shí)現(xiàn)事件隊(duì)列372
13.4.2 使用不同的事件隊(duì)列模式處理數(shù)據(jù)374
13.5 消息編碼(codec)——讓cellnet支持消息的多種編碼格式377
13.6 消息元信息(MessageMeta)——消息ID、消息名稱和消息類型的關(guān)聯(lián)關(guān)系379
13.6.1 理解消息元信息380
13.6.2 注冊(cè)消息元信息380
13.6.3 示例:使用消息元信息381
13.6.4 實(shí)現(xiàn)消息的編碼(EncodeMessage())和解碼(DecodeMessage())函數(shù)382
13.7 接收和發(fā)送封包(packet)383
13.7.1 接收可變長(zhǎng)度封包384
13.7.2 了解封包數(shù)據(jù)讀取器(PacketReader)385
13.7.3 了解封包數(shù)據(jù)寫(xiě)入器(PacketWriter)387
13.7.4 讀取自定義封包及數(shù)據(jù)387
13.7.5 寫(xiě)入自定義封包及數(shù)據(jù)389
13.7.6 響應(yīng)消息處理事件390
13.8 使用cellnet網(wǎng)絡(luò)庫(kù)實(shí)現(xiàn)聊天功能392
13.8.1 定義聊天協(xié)議393
13.8.2 實(shí)現(xiàn)客戶端功能394
13.8.3 實(shí)現(xiàn)服務(wù)器功能396
13.8.4 運(yùn)行聊天服務(wù)器和客戶端398