經(jīng)過(guò)十多年的發(fā)展,Go語(yǔ)言日漸完善,它是一門(mén)開(kāi)源的且支持跨平臺(tái)的編程語(yǔ)言。與C、C++語(yǔ)言類(lèi)似,Go語(yǔ)言也屬于強(qiáng)類(lèi)型語(yǔ)言,源代碼需要編譯后才能運(yùn)行,因此擁有較優(yōu)的性能。從小工具到Web服務(wù)器的開(kāi)發(fā),Go語(yǔ)言都能勝任。
Go語(yǔ)言有以下特點(diǎn):
(1) 代碼以包(Package)為單元,同一層目錄下只能定義一個(gè)包名。
(2) 一個(gè)可執(zhí)行程序有且只能有一個(gè)命名為main的包,main包中必須存在main函數(shù)。當(dāng)程序運(yùn)行時(shí),會(huì)查找main函數(shù),并從該函數(shù)開(kāi)始執(zhí)行; 當(dāng)main函數(shù)執(zhí)行完畢(或跳出該函數(shù))后,可執(zhí)行程序退出。
(3) 代碼語(yǔ)句可以以“;”結(jié)尾,也可以省略。
(4) 左大括號(hào)(“{”)不能另起一行輸入,必須與前面的內(nèi)容同處一行。例如:
func test() {
……
}
(5) if、for等關(guān)鍵字之后不需要小括號(hào)(C、C++等語(yǔ)言需要小括號(hào))。
(6) 字符串常量可以使用“`”來(lái)避免轉(zhuǎn)義,例如:
`some content`
(7) 在函數(shù)(或方法)的調(diào)用語(yǔ)句中使用go關(guān)鍵字可以輕松完成異步編程。例如:
go test()
本書(shū)內(nèi)容涵蓋了Go語(yǔ)言的各個(gè)知識(shí)點(diǎn)。從語(yǔ)法基礎(chǔ)、數(shù)據(jù)類(lèi)型到較為復(fù)雜的反射技術(shù)、網(wǎng)絡(luò)編程,均有闡述。每個(gè)知識(shí)點(diǎn)都配有豐富的代碼示例,方便理解; 每一章的末尾附帶思考題,可幫助讀者回憶所學(xué)內(nèi)容,加深印象。
編者希望通過(guò)本書(shū)幫助初學(xué)者快速了解Go語(yǔ)言,掌握最基本的編程方法和技術(shù)要點(diǎn)。閱讀本書(shū)后,讀者應(yīng)該能夠運(yùn)用Go語(yǔ)言編寫(xiě)出一些像樣的程序。
由于編者水平有限,書(shū)中難免出現(xiàn)不完善的地方,歡迎廣大讀者及同仁不吝賜教,共同進(jìn)步。
編者
2020年6月
第1章準(zhǔn)備工作
1.1安裝Go語(yǔ)言編譯器
1.2配置環(huán)境變量
1.3驗(yàn)證Go語(yǔ)言編譯器的工作狀態(tài)
第2章語(yǔ)法基礎(chǔ)
2.1代碼結(jié)構(gòu)
2.2main包與main函數(shù)
2.3Go語(yǔ)句
2.4代碼塊
2.5注釋
2.6使用Go語(yǔ)言編譯器
第3章運(yùn)算符
3.1操作數(shù)
3.2算術(shù)運(yùn)算符
3.2.1四則運(yùn)算符
3.2.2取余運(yùn)算符
3.2.3如何實(shí)現(xiàn)指數(shù)運(yùn)算
3.2.4自增與自減運(yùn)算符
3.3比較運(yùn)算符
3.4邏輯運(yùn)算符
3.5位運(yùn)算符
3.5.1按位與
3.5.2按位或
3.5.3取反
3.5.4位移
3.5.5按位異或
3.5.6清除標(biāo)志位
3.6成員運(yùn)算符
3.7取地址運(yùn)算符
3.8復(fù)合運(yùn)算符
3.9運(yùn)算符的優(yōu)先級(jí)
第4章程序包管理
4.1package語(yǔ)句
4.2程序包的目錄結(jié)構(gòu)
4.3導(dǎo)入語(yǔ)句
4.4初始化函數(shù)
4.5模塊
4.5.1go.mod文件的基本結(jié)構(gòu)
4.5.2創(chuàng)建go.mod文件
4.5.3編輯go.mod文件
4.5.4使用本地模塊
4.6成員的可訪問(wèn)性
第5章變量與常量
5.1變量的初始化
5.2組合賦值
5.3匿名變量
5.4常量
5.5批量聲明
5.6變量的作用域
5.7變量的默認(rèn)值
第6章基礎(chǔ)類(lèi)型
6.1字符與字符串
6.1.1rune類(lèi)型
6.1.2string類(lèi)型
6.2數(shù)值類(lèi)型
6.2.1示例: 獲取數(shù)值類(lèi)型占用的內(nèi)存大小
6.2.2整數(shù)常量的表示方式
6.2.3科學(xué)記數(shù)法
6.2.4復(fù)數(shù)
6.3日期與時(shí)間
6.3.1Month類(lèi)型
6.3.2Weekday類(lèi)型
6.3.3Duration類(lèi)型
6.3.4Time類(lèi)型
6.3.5Sleep函數(shù)
6.3.6Timer類(lèi)型
6.4指針
6.4.1何時(shí)使用指針類(lèi)型
6.4.2new函數(shù)
6.5iota常量
第7章函數(shù)
7.1函數(shù)的定義
7.2調(diào)用函數(shù)
7.3return語(yǔ)句
7.4多個(gè)返回值
7.5可變個(gè)數(shù)的參數(shù)
7.6匿名函數(shù)
7.7將函數(shù)作為參數(shù)傳遞
第8章流程控制
8.1順序執(zhí)行
8.2if語(yǔ)句
8.3switch語(yǔ)句
8.3.1基于表達(dá)式構(gòu)建的switch語(yǔ)句
8.3.2基于類(lèi)型構(gòu)建的switch語(yǔ)句
8.3.3fallthrough語(yǔ)句
8.4for語(yǔ)句
8.4.1僅帶條件子句的for語(yǔ)句
8.4.2帶三個(gè)子句的for語(yǔ)句
8.4.3枚舉集合元素語(yǔ)句
8.4.4continue與break語(yǔ)句
8.5代碼跳轉(zhuǎn)
8.5.1代碼標(biāo)簽與goto語(yǔ)句
8.5.2break、continue語(yǔ)句與代碼跳轉(zhuǎn)
第9章接口與結(jié)構(gòu)體
9.1自定義類(lèi)型
9.2結(jié)構(gòu)體
9.2.1結(jié)構(gòu)體的定義
9.2.2結(jié)構(gòu)體的實(shí)例化
9.2.3方法
9.3接口
9.3.1接口的定義
9.3.2接口的實(shí)現(xiàn)
9.3.3空接口——interface{}
9.3.4接口與函數(shù)
9.4類(lèi)型嵌套
9.5類(lèi)型斷言
第10章數(shù)組與切片
10.1數(shù)組
10.1.1數(shù)組的初始化
10.1.2訪問(wèn)數(shù)組元素
10.1.3*[n]T與[n]*T的區(qū)別
10.1.4多維數(shù)組
10.2切片
10.2.1創(chuàng)建切片實(shí)例
10.2.2添加和刪除元素
第11章映射與鏈表
11.1映射
11.1.1映射對(duì)象的初始化
11.1.2訪問(wèn)映射對(duì)象的元素
11.1.3檢查key的存在性
11.2雙向鏈表
11.2.1與雙向鏈表有關(guān)的API
11.2.2創(chuàng)建鏈表實(shí)例
11.2.3添加和刪除元素
11.2.4移動(dòng)元素
11.2.5枚舉鏈表元素
11.3環(huán)形鏈表
11.3.1與環(huán)形鏈表有關(guān)的API
11.3.2使用環(huán)形鏈表
11.3.3滾動(dòng)環(huán)形鏈表
11.3.4鏈接兩個(gè)環(huán)形鏈表
第12章反射
12.1關(guān)鍵API
12.2獲取類(lèi)型信息
12.2.1類(lèi)型分辨
12.2.2枚舉結(jié)構(gòu)體類(lèi)型的方法列表
12.2.3枚舉結(jié)構(gòu)體類(lèi)型的字段列表
12.2.4查找嵌套結(jié)構(gòu)體的字段成員
12.2.5獲取函數(shù)的參數(shù)信息
12.2.6獲取通道類(lèi)型的信息
12.2.7判斷類(lèi)型是否實(shí)現(xiàn)了某個(gè)接口
12.3Value與對(duì)象的值
12.3.1修改對(duì)象的值
12.3.2讀寫(xiě)結(jié)構(gòu)體實(shí)例的字段
12.3.3更新數(shù)組/切片的元素
12.3.4調(diào)用函數(shù)
12.3.5調(diào)用方法
12.3.6讀寫(xiě)映射類(lèi)型的元素
12.4動(dòng)態(tài)構(gòu)建類(lèi)型
12.4.1New函數(shù)
12.4.2創(chuàng)建數(shù)組類(lèi)型
12.4.3創(chuàng)建結(jié)構(gòu)體類(lèi)型
12.4.4動(dòng)態(tài)創(chuàng)建和調(diào)用函數(shù)
12.4.5生成通用函數(shù)體
12.5結(jié)構(gòu)體的Tag
第13章字符串處理
13.1打印文本
13.2格式化輸出
13.2.1格式化整數(shù)值
13.2.2格式化浮點(diǎn)數(shù)值
13.2.3格式化字符串
13.2.4格式化布爾類(lèi)型的值
13.2.5%T與%v格式控制符
13.2.6輸出包含前綴的整數(shù)值
13.2.7設(shè)置輸出內(nèi)容的寬度
13.2.8控制浮點(diǎn)數(shù)的精度
13.2.9參數(shù)索引
13.2.10通過(guò)參數(shù)來(lái)控制文本的寬度和精度
13.3讀取輸入文本
13.3.1讀取鍵盤(pán)輸入的內(nèi)容
13.3.2從文件中讀入文本
13.3.3以特定的格式讀取文本
13.4實(shí)現(xiàn)Stringer接口
13.5連接字符串
13.6替換字符串
13.7拆分字符串
13.8查找子字符串
13.8.1查找前綴與后綴
13.8.2查找子字符串的位置
13.9修剪字符串
13.9.1去除前綴和后綴
13.9.2去除字符串首尾的空格
13.9.3修剪指定的字符
13.10重復(fù)字符串
13.11字符串與數(shù)值之間的轉(zhuǎn)換
13.12切換大小寫(xiě)
13.13使用Builder構(gòu)建字符串
第14章常用數(shù)學(xué)函數(shù)
14.1求絕對(duì)值
14.2最大值與最小值
14.3三角函數(shù)與反三角函數(shù)
14.4冪運(yùn)算
14.5開(kāi)平方/立方根
14.6大型數(shù)值
14.6.1大型整數(shù)值之間的運(yùn)算
14.6.2階乘運(yùn)算
14.6.3使用大型浮點(diǎn)數(shù)值
14.7隨機(jī)數(shù)
14.7.1生成隨機(jī)浮點(diǎn)數(shù)
14.7.2生成隨機(jī)整數(shù)
14.7.3設(shè)置隨機(jī)數(shù)種子
14.7.4生成隨機(jī)全排列
14.7.5“洗牌”程序
14.7.6生成隨機(jī)字節(jié)序列
第15章排序
15.1基本排序函數(shù)
15.2實(shí)現(xiàn)遞減排序
15.3按字符串的長(zhǎng)度排序
15.4Interface接口
第16章輸入與輸出
16.1簡(jiǎn)單的內(nèi)存緩沖區(qū)
16.2與輸入/輸出有關(guān)的接口類(lèi)型
16.2.1實(shí)現(xiàn)讀寫(xiě)功能
16.2.2嵌套封裝
16.3Buffer類(lèi)型
16.4Copy函數(shù)
16.5MultiReader函數(shù)和MultiWriter函數(shù)
16.6SectionReader
第17章文件與目錄
17.1文件操作
17.1.1Create函數(shù)與Open函數(shù)
17.1.2重命名文件
17.1.3獲取文件信息
17.1.4OpenFile函數(shù)
17.2創(chuàng)建和刪除目錄
17.3硬鏈接與符號(hào)鏈接
17.3.1硬鏈接
17.3.2符號(hào)鏈接
17.4WriteFile函數(shù)與ReadFile函數(shù)
17.5臨時(shí)文件
17.6更改程序的工作目錄
第18章加密與解密
18.1Base64的編碼與解碼
18.1.1內(nèi)置Base64編碼方案
18.1.2基于流的編碼與解碼
18.1.3自定義字符映射表
18.2DES與AES算法
18.2.1Block接口
18.2.2BlockMode模式
18.2.3基于流的加密與解密
18.3哈希算法
18.3.1hash.Hash接口
18.3.2使用crypto子包中的哈希API
18.3.3HMAC算法
18.4RSA算法
18.4.1生成密鑰
18.4.2加密和解密
18.4.3存儲(chǔ)密鑰
18.5PEM編碼
18.5.1編碼與解碼
18.5.2解碼后的保留數(shù)據(jù)
18.5.3消息頭
第19章命令行參數(shù)
19.1os.Args變量
19.2命令行參數(shù)分析API——flag包
19.2.1命令行參數(shù)與變量的綁定
19.2.2Value接口
第20章數(shù)據(jù)壓縮
20.1標(biāo)準(zhǔn)庫(kù)對(duì)壓縮算法的支持
20.2Gzip壓縮算法
20.2.1Gzip基本用法
20.2.2壓縮多個(gè)文件
20.2.3解壓多個(gè)文件
20.3DEFLATE算法
20.4自定義的索引字典
20.5Zip文檔
20.5.1從Zip文檔中讀取文件
20.5.2在內(nèi)存中讀寫(xiě)Zip文檔
20.5.3注冊(cè)壓縮算法
20.6Tar文檔
第21章協(xié)程
21.1啟動(dòng)Go協(xié)程
21.2通道
21.2.1實(shí)例化通道
21.2.2數(shù)據(jù)緩沖
21.2.3單向通道
21.2.4通道與select語(yǔ)句
21.3互斥鎖
21.4WaitGroup類(lèi)型
第22章網(wǎng)絡(luò)編程
22.1枚舉本地計(jì)算機(jī)上的網(wǎng)絡(luò)接口
22.2Socket通信
22.2.1TCP示例: 文件傳輸
22.2.2UDP示例: 文本傳輸
22.3HTTP客戶端
22.3.1發(fā)送GET與POST請(qǐng)求
22.3.2發(fā)送自定義HTTP頭
22.4HTTP服務(wù)器
22.4.1創(chuàng)建HTTP服務(wù)器
22.4.2實(shí)現(xiàn)Handler接口
22.4.3ServeMux類(lèi)型
22.4.4封裝函數(shù)
22.4.5讀取URL參數(shù)
22.4.6獲取客戶端提交的表單數(shù)據(jù)
22.4.7讀取客戶端上傳的文件
22.5CGI編程
22.5.1準(zhǔn)備工作
22.5.2示例: 一個(gè)簡(jiǎn)單的CGI程序
22.5.3使用cgi包
22.5.4在子進(jìn)程中獲取Request對(duì)象
附錄A常用API與程序包對(duì)照表
附錄BGo語(yǔ)言代碼編輯工具使用說(shuō)明