Go語言也稱為 Golang,它出自計算機(jī)科學(xué)領(lǐng)域的三位巨匠Ken Thompson 和 Rob Pike、Robert Griesemer之手,在2009年由 Google 公司正式發(fā)布。Go語言是一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型及具有垃圾回收功能的開源編程語言。它的主要目標(biāo)是“兼具Python等動態(tài)語言的開發(fā)速度和 C/C++等編譯型語言的性能與安全性”。Go語言語法簡單,規(guī)則嚴(yán)謹(jǐn),具有并發(fā)模型、內(nèi)存分配及垃圾回收機(jī)制。此外,Go語言擁有功能完善、質(zhì)量可靠的標(biāo)準(zhǔn)庫,借助這些標(biāo)準(zhǔn)庫,可以快速開發(fā)基礎(chǔ)程序,極大降低學(xué)習(xí)與開發(fā)成本。Go語言擁有完整的工具鏈,編譯、格式化、錯誤檢查功能和幫助文檔及第三方工具包都很完善,可以保證代碼正確穩(wěn)定地運行。正因為Go語言具有如此眾多的特性,它被譽為“21世紀(jì)的編程語言”,成為一種國際化的新語言。
本書由知名IT開發(fā)者周家安編著,圖書通俗易懂、理論全面、實例豐富。涵蓋了如下入門讀者最為關(guān)心的基礎(chǔ)知識:
開發(fā)環(huán)境配置;
語法基礎(chǔ);
代碼包(Package);
內(nèi)置運算符與數(shù)據(jù)類型;
代碼流程控制;
函數(shù)式編程;
接口與結(jié)構(gòu)體;
數(shù)組、切片與映射類型;
常用的字符串與數(shù)學(xué)函數(shù);
反射技術(shù);
管理命令行參數(shù);
I/O與文件操作;
加密與解密;
數(shù)據(jù)壓縮;
網(wǎng)絡(luò)編程;
Go協(xié)程。
經(jīng)過十多年的發(fā)展,Go語言日漸完善,它是一門開源的且支持跨平臺的編程語言。與C、C++語言類似,Go語言也屬于強(qiáng)類型語言,源代碼需要編譯后才能運行,因此擁有較優(yōu)的性能。從小工具到Web服務(wù)器的開發(fā),Go語言都能勝任。
Go語言有以下特點:
(1) 代碼以包(Package)為單元,同一層目錄下只能定義一個包名。
(2) 一個可執(zhí)行程序有且只能有一個命名為main的包,main包中必須存在main函數(shù)。當(dāng)程序運行時,會查找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語言的各個知識點。從語法基礎(chǔ)、數(shù)據(jù)類型到較為復(fù)雜的反射技術(shù)、網(wǎng)絡(luò)編程,均有闡述。每個知識點都配有豐富的代碼示例,方便理解; 每一章的末尾附帶思考題,可幫助讀者回憶所學(xué)內(nèi)容,加深印象。
編者希望通過本書幫助初學(xué)者快速了解Go語言,掌握最基本的編程方法和技術(shù)要點。閱讀本書后,讀者應(yīng)該能夠運用Go語言編寫出一些像樣的程序。
由于編者水平有限,書中難免出現(xiàn)不完善的地方,歡迎廣大讀者及同仁不吝賜教,共同進(jìn)步。
編者
2020年6月
第1章準(zhǔn)備工作
1.1安裝Go語言編譯器
1.2配置環(huán)境變量
1.3驗證Go語言編譯器的工作狀態(tài)
第2章語法基礎(chǔ)
2.1代碼結(jié)構(gòu)
2.2main包與main函數(shù)
2.3Go語句
2.4代碼塊
2.5注釋
2.6使用Go語言編譯器
第3章運算符
3.1操作數(shù)
3.2算術(shù)運算符
3.2.1四則運算符
3.2.2取余運算符
3.2.3如何實現(xiàn)指數(shù)運算
3.2.4自增與自減運算符
3.3比較運算符
3.4邏輯運算符
3.5位運算符
3.5.1按位與
3.5.2按位或
3.5.3取反
3.5.4位移
3.5.5按位異或
3.5.6清除標(biāo)志位
3.6成員運算符
3.7取地址運算符
3.8復(fù)合運算符
3.9運算符的優(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日期與時間
6.3.1Month類型
6.3.2Weekday類型
6.3.3Duration類型
6.3.4Time類型
6.3.5Sleep函數(shù)
6.3.6Timer類型
6.4指針
6.4.1何時使用指針類型
6.4.2new函數(shù)
6.5iota常量
第7章函數(shù)
7.1函數(shù)的定義
7.2調(diào)用函數(shù)
7.3return語句
7.4多個返回值
7.5可變個數(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帶三個子句的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)體的實例化
9.2.3方法
9.3接口
9.3.1接口的定義
9.3.2接口的實現(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)建切片實例
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)建鏈表實例
11.2.3添加和刪除元素
11.2.4移動元素
11.2.5枚舉鏈表元素
11.3環(huán)形鏈表
11.3.1與環(huán)形鏈表有關(guān)的API
11.3.2使用環(huán)形鏈表
11.3.3滾動環(huán)形鏈表
11.3.4鏈接兩個環(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判斷類型是否實現(xiàn)了某個接口
12.3Value與對象的值
12.3.1修改對象的值
12.3.2讀寫結(jié)構(gòu)體實例的字段
12.3.3更新數(shù)組/切片的元素
12.3.4調(diào)用函數(shù)
12.3.5調(diào)用方法
12.3.6讀寫映射類型的元素
12.4動態(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動態(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格式化浮點數(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控制浮點數(shù)的精度
13.2.9參數(shù)索引
13.2.10通過參數(shù)來控制文本的寬度和精度
13.3讀取輸入文本
13.3.1讀取鍵盤輸入的內(nèi)容
13.3.2從文件中讀入文本
13.3.3以特定的格式讀取文本
13.4實現(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冪運算
14.5開平方/立方根
14.6大型數(shù)值
14.6.1大型整數(shù)值之間的運算
14.6.2階乘運算
14.6.3使用大型浮點數(shù)值
14.7隨機(jī)數(shù)
14.7.1生成隨機(jī)浮點數(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實現(xiàn)遞減排序
15.3按字符串的長度排序
15.4Interface接口
第16章輸入與輸出
16.1簡單的內(nèi)存緩沖區(qū)
16.2與輸入/輸出有關(guān)的接口類型
16.2.1實現(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臨時文件
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存儲密鑰
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壓縮多個文件
20.2.3解壓多個文件
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啟動Go協(xié)程
21.2通道
21.2.1實例化通道
21.2.2數(shù)據(jù)緩沖
21.2.3單向通道
21.2.4通道與select語句
21.3互斥鎖
21.4WaitGroup類型
第22章網(wǎng)絡(luò)編程
22.1枚舉本地計算機(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實現(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示例: 一個簡單的CGI程序
22.5.3使用cgi包
22.5.4在子進(jìn)程中獲取Request對象
附錄A常用API與程序包對照表
附錄BGo語言代碼編輯工具使用說明