經(jīng)過十多年的發(fā)展,Go語言日漸完善,它是一門開源的且支持跨平臺的編程語言。與C、C++語言類似,Go語言也屬于強(qiáng)類型語言,源代碼需要編譯后才能運(yùn)行,因此擁有較優(yōu)的性能。從小工具到Web服務(wù)器的開發(fā),Go語言都能勝任。
Go語言有以下特點(diǎn):
(1) 代碼以包(Package)為單元,同一層目錄下只能定義一個(gè)包名。
(2) 一個(gè)可執(zhí)行程序有且只能有一個(gè)命名為main的包,main包中必須存在main函數(shù)。當(dāng)程序運(yùn)行時(shí),會(huì)查找main函數(shù),并從該函數(shù)開始執(zhí)行; 當(dāng)main函數(shù)執(zhí)行完畢(或跳出該函數(shù))后,可執(zhí)行程序退出。
(3) 代碼語句可以以“;”結(jié)尾,也可以省略。
(4) 左大括號(“{”)不能另起一行輸入,必須與前面的內(nèi)容同處一行。例如:
func test() {
……
}
(5) if、for等關(guān)鍵字之后不需要小括號(C、C++等語言需要小括號)。
(6) 字符串常量可以使用“`”來避免轉(zhuǎn)義,例如:
`some content`
(7) 在函數(shù)(或方法)的調(diào)用語句中使用go關(guān)鍵字可以輕松完成異步編程。例如:
go test()
本書內(nèi)容涵蓋了Go語言的各個(gè)知識點(diǎn)。從語法基礎(chǔ)、數(shù)據(jù)類型到較為復(fù)雜的反射技術(shù)、網(wǎng)絡(luò)編程,均有闡述。每個(gè)知識點(diǎn)都配有豐富的代碼示例,方便理解; 每一章的末尾附帶思考題,可幫助讀者回憶所學(xué)內(nèi)容,加深印象。
編者希望通過本書幫助初學(xué)者快速了解Go語言,掌握最基本的編程方法和技術(shù)要點(diǎn)。閱讀本書后,讀者應(yīng)該能夠運(yùn)用Go語言編寫出一些像樣的程序。
由于編者水平有限,書中難免出現(xiàn)不完善的地方,歡迎廣大讀者及同仁不吝賜教,共同進(jìn)步。
編者
2020年6月
第1章準(zhǔn)備工作
1.1安裝Go語言編譯器
1.2配置環(huán)境變量
1.3驗(yàn)證Go語言編譯器的工作狀態(tài)
第2章語法基礎(chǔ)
2.1代碼結(jié)構(gòu)
2.2main包與main函數(shù)
2.3Go語句
2.4代碼塊
2.5注釋
2.6使用Go語言編譯器
第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)先級
第4章程序包管理
4.1package語句
4.2程序包的目錄結(jié)構(gòu)
4.3導(dǎo)入語句
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成員的可訪問性
第5章變量與常量
5.1變量的初始化
5.2組合賦值
5.3匿名變量
5.4常量
5.5批量聲明
5.6變量的作用域
5.7變量的默認(rèn)值
第6章基礎(chǔ)類型
6.1字符與字符串
6.1.1rune類型
6.1.2string類型
6.2數(shù)值類型
6.2.1示例: 獲取數(shù)值類型占用的內(nèi)存大小
6.2.2整數(shù)常量的表示方式
6.2.3科學(xué)記數(shù)法
6.2.4復(fù)數(shù)
6.3日期與時(shí)間
6.3.1Month類型
6.3.2Weekday類型
6.3.3Duration類型
6.3.4Time類型
6.3.5Sleep函數(shù)
6.3.6Timer類型
6.4指針
6.4.1何時(shí)使用指針類型
6.4.2new函數(shù)
6.5iota常量
第7章函數(shù)
7.1函數(shù)的定義
7.2調(diào)用函數(shù)
7.3return語句
7.4多個(gè)返回值
7.5可變個(gè)數(shù)的參數(shù)
7.6匿名函數(shù)
7.7將函數(shù)作為參數(shù)傳遞
第8章流程控制
8.1順序執(zhí)行
8.2if語句
8.3switch語句
8.3.1基于表達(dá)式構(gòu)建的switch語句
8.3.2基于類型構(gòu)建的switch語句
8.3.3fallthrough語句
8.4for語句
8.4.1僅帶條件子句的for語句
8.4.2帶三個(gè)子句的for語句
8.4.3枚舉集合元素語句
8.4.4continue與break語句
8.5代碼跳轉(zhuǎn)
8.5.1代碼標(biāo)簽與goto語句
8.5.2break、continue語句與代碼跳轉(zhuǎn)
第9章接口與結(jié)構(gòu)體
9.1自定義類型
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類型嵌套
9.5類型斷言
第10章數(shù)組與切片
10.1數(shù)組
10.1.1數(shù)組的初始化
10.1.2訪問數(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映射對象的初始化
11.1.2訪問映射對象的元素
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獲取類型信息
12.2.1類型分辨
12.2.2枚舉結(jié)構(gòu)體類型的方法列表
12.2.3枚舉結(jié)構(gòu)體類型的字段列表
12.2.4查找嵌套結(jié)構(gòu)體的字段成員
12.2.5獲取函數(shù)的參數(shù)信息
12.2.6獲取通道類型的信息
12.2.7判斷類型是否實(shí)現(xiàn)了某個(gè)接口
12.3Value與對象的值
12.3.1修改對象的值
12.3.2讀寫結(jié)構(gòu)體實(shí)例的字段
12.3.3更新數(shù)組/切片的元素
12.3.4調(diào)用函數(shù)
12.3.5調(diào)用方法
12.3.6讀寫映射類型的元素
12.4動(dòng)態(tài)構(gòu)建類型
12.4.1New函數(shù)
12.4.2創(chuàng)建數(shù)組類型
12.4.3創(chuàng)建結(jié)構(gòu)體類型
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格式化布爾類型的值
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通過參數(shù)來控制文本的寬度和精度
13.3讀取輸入文本
13.3.1讀取鍵盤輸入的內(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切換大小寫
13.13使用Builder構(gòu)建字符串
第14章常用數(shù)學(xué)函數(shù)
14.1求絕對值
14.2最大值與最小值
14.3三角函數(shù)與反三角函數(shù)
14.4冪運(yùn)算
14.5開平方/立方根
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按字符串的長度排序
15.4Interface接口
第16章輸入與輸出
16.1簡單的內(nèi)存緩沖區(qū)
16.2與輸入/輸出有關(guān)的接口類型
16.2.1實(shí)現(xiàn)讀寫功能
16.2.2嵌套封裝
16.3Buffer類型
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硬鏈接與符號鏈接
17.3.1硬鏈接
17.3.2符號鏈接
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)庫對壓縮算法的支持
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)存中讀寫Zip文檔
20.5.3注冊壓縮算法
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語句
21.3互斥鎖
21.4WaitGroup類型
第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請求
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類型
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è)簡單的CGI程序
22.5.3使用cgi包
22.5.4在子進(jìn)程中獲取Request對象
附錄A常用API與程序包對照表
附錄BGo語言代碼編輯工具使用說明