對(duì)于學(xué)習(xí) Go 編程語(yǔ)言的愛(ài)好者來(lái)說(shuō),這本書(shū)無(wú)疑是最適合你的一本書(shū)籍,這里包含了當(dāng)前最全面的學(xué)習(xí)資源。本書(shū)通過(guò)對(duì)官方的在線(xiàn)文檔、名人博客、書(shū)籍、相關(guān)文章以及演講的資料收集和整理,并結(jié)合我自身在軟件工程、編程語(yǔ)言和數(shù)據(jù)庫(kù)開(kāi)發(fā)的授課經(jīng)驗(yàn),將這些零碎的知識(shí)點(diǎn)組織成系統(tǒng)化的概念和技術(shù)分類(lèi)來(lái)進(jìn)行講解。
隨著軟件規(guī)模的不斷擴(kuò)大,諸多的學(xué)者和谷歌的開(kāi)發(fā)者們?cè)诠緝?nèi)部的軟件開(kāi)發(fā)過(guò)程中開(kāi)始經(jīng)歷大量的挫折,在諸多問(wèn)題上都不能給出令人滿(mǎn)意的解決方案,尤其是在使用 C++ 來(lái)開(kāi)發(fā)大型的服務(wù)端軟件時(shí),情況更是不容樂(lè)觀。由于二進(jìn)制文件一般都是非常巨大的,因此需要耗費(fèi)大量的時(shí)間在編譯這些文件上,同時(shí)編程語(yǔ)言的設(shè)計(jì)思想也已經(jīng)非常陳舊,這些情況都充分證明了現(xiàn)有的編程語(yǔ)言已不符合時(shí)下的生產(chǎn)環(huán)境。盡管硬件在過(guò)去的幾十年中有了飛速的發(fā)展,但人們依舊沒(méi)有找到機(jī)會(huì)去改變 C++ 在軟件開(kāi)發(fā)的重要地位,并在實(shí)際開(kāi)發(fā)過(guò)程中忍受著它所帶來(lái)的令人頭疼的一些問(wèn)題。因此學(xué)者們坐下來(lái)總結(jié)出了現(xiàn)在生產(chǎn)環(huán)境與軟件開(kāi)發(fā)之間的主要矛盾,并嘗試設(shè)計(jì)一門(mén)全新的編程語(yǔ)言來(lái)解決這些問(wèn)題。
以下就是他們討論得出的對(duì)編程語(yǔ)言的設(shè)計(jì)要求:
Go 語(yǔ)言就在這樣的環(huán)境下誕生了,它讓人感覺(jué)像是 Python 或 Ruby 這樣的動(dòng)態(tài)語(yǔ)言,但卻又擁有像 C 或者 Java 這類(lèi)語(yǔ)言的高性能和安全性。
Go 語(yǔ)言出現(xiàn)的目的是希望在編程領(lǐng)域創(chuàng)造最實(shí)用的方式來(lái)進(jìn)行軟件開(kāi)發(fā)。它并不是要用奇怪的語(yǔ)法和晦澀難懂的概念來(lái)從根本上推翻已有的編程語(yǔ)言,而是建立并改善了 C、Java、C# 中的許多語(yǔ)法風(fēng)格。它提倡通過(guò)接口來(lái)針對(duì)面向?qū)ο缶幊?,通過(guò) goroutine 和 channel 來(lái)支持并發(fā)和并行編程。
這本書(shū)是為那些想要學(xué)習(xí) Go 這門(mén)全新的,迷人的和充滿(mǎn)希望的編程語(yǔ)言的開(kāi)發(fā)者量身定做的。當(dāng)然,你在學(xué)習(xí) Go 語(yǔ)言之前需要具備一些關(guān)于編程的基礎(chǔ)知識(shí)和經(jīng)驗(yàn),并且擁有合適的學(xué)習(xí)環(huán)境,但你并不需要對(duì) C 或者 Java 或其它類(lèi)似的語(yǔ)言有非常深入的了解。
對(duì)于那些熟悉 C 或者面向?qū)ο缶幊陶Z(yǔ)言的開(kāi)發(fā)者,我們將會(huì)在本書(shū)中用 Go 和一些編程語(yǔ)言的相關(guān)概念進(jìn)行比較(書(shū)中會(huì)使用大家所熟知的縮寫(xiě) “OO” 來(lái)表示面向?qū)ο螅?/p>
本書(shū)將會(huì)從最基礎(chǔ)的概念講起,同時(shí)也會(huì)討論一些類(lèi)似在應(yīng)用 goroutine 和 channel 時(shí)有多少種不同的模式,如何在 Go 語(yǔ)言中使用谷歌 API,如何操作內(nèi)存,如何在 Go 語(yǔ)言中進(jìn)行程序測(cè)試和如何使用模板來(lái)開(kāi)發(fā) Web 應(yīng)用這些高級(jí)概念和技巧。
在本書(shū)的第一部分,我們將會(huì)討論 Go 語(yǔ)言的起源(第 1 章),以及如何安裝 Go 語(yǔ)言(第 2 章)和開(kāi)發(fā)環(huán)境(第 3 章)。
在本書(shū)的第二部分,我們將會(huì)帶領(lǐng)你貫穿 Go 語(yǔ)言的核心思想,譬如簡(jiǎn)單與復(fù)雜類(lèi)型(第 4、7、8 章),控制結(jié)構(gòu)(第 5 章),函數(shù)(第 6 章),結(jié)構(gòu)與方法(第 10 章)和接口(第 11 章)。我們會(huì)對(duì) Go 語(yǔ)言的函數(shù)式和面向?qū)ο缶幊踢M(jìn)行透徹的講解,包括如何使用 Go 語(yǔ)言來(lái)構(gòu)造大型項(xiàng)目(第 9 章)。
在本書(shū)的第三部分,你將會(huì)學(xué)習(xí)到如何處理不同格式的文件(第 12 章)和如何在 Go 語(yǔ)言中巧妙地使用錯(cuò)誤處理機(jī)制(第 13 章)。然后我們會(huì)對(duì) Go 語(yǔ)言中最值得稱(chēng)贊的設(shè)計(jì) goroutine 和 channel 進(jìn)行并發(fā)和多核應(yīng)用的基本技巧的講解(第 14 章)。最后,我們會(huì)討論如何將 Go 語(yǔ)言應(yīng)用到分布式和 Web 應(yīng)用中的相關(guān)網(wǎng)絡(luò)技巧(第 15 章)。
我們會(huì)在本書(shū)的第四部分向你展示許多 Go 語(yǔ)言的開(kāi)發(fā)模式和一些編碼規(guī)范,以及一些非常有用的代碼片段(第 18 章)。在前面章節(jié)完成對(duì)所有的 Go 語(yǔ)言技巧的學(xué)習(xí)之后,你將會(huì)學(xué)習(xí)如何構(gòu)造一個(gè)完整 Go 語(yǔ)言項(xiàng)目(第 19 章),然后我們會(huì)介紹一些關(guān)于 Go 語(yǔ)言在云(Google App Engine)方面的應(yīng)用(第 20 章)。在本書(shū)的最后一章(第 21 章),我們會(huì)討論一些在全世界范圍內(nèi)已經(jīng)將 Go 語(yǔ)言投入實(shí)際開(kāi)發(fā)的公司和組織。本書(shū)將會(huì)在最后給出一些對(duì) Go 語(yǔ)言愛(ài)好者的引用,Go 相關(guān)包和工具的參考,以及章節(jié)練習(xí)的答案和所有參考資源和文獻(xiàn)的清單。
Go 語(yǔ)言有一個(gè)被稱(chēng)之為 “沒(méi)有廢物” 的宗旨,就是將一切沒(méi)有必要的東西都去掉,不能去掉的就無(wú)底線(xiàn)地簡(jiǎn)化,同時(shí)追求最大程度的自動(dòng)化。他完美地詮釋了敏捷編程的 KISS 秘訣:短小精悍!
Go 語(yǔ)言通過(guò)改善或去除在 C、C++ 或 Java 中的一些所謂“開(kāi)放”特性來(lái)讓開(kāi)發(fā)者們的工作更加便利。這里只舉例其中的幾個(gè),比如對(duì)于變量的默認(rèn)初始化,內(nèi)存分配與自動(dòng)回收,以及更簡(jiǎn)潔卻不失健壯的控制結(jié)構(gòu)。同時(shí)我們也會(huì)發(fā)現(xiàn) Go 語(yǔ)言旨在減少不必要的編碼工作,這使得 Go 語(yǔ)言的代碼更加簡(jiǎn)潔,從而比傳統(tǒng)的面向?qū)ο笳Z(yǔ)言更容易閱讀和理解。
與 C++ 或 Java 這些有著龐大體系的語(yǔ)言相比,Go 語(yǔ)言簡(jiǎn)潔到可以將它整個(gè)的裝入你的大腦中,而且比學(xué)習(xí) Scala(Java 的并發(fā)語(yǔ)言)有更低的門(mén)檻,真可謂是 21 世紀(jì)的 C 語(yǔ)言!
作為一門(mén)系統(tǒng)編程語(yǔ)言,你不應(yīng)該為 Go 語(yǔ)言的大多數(shù)代碼示例和練習(xí)都和控制臺(tái)有著密不可分的關(guān)系而感到驚奇,因?yàn)樘峁┢脚_(tái)依賴(lài)性的 GUI(用戶(hù)界面)框架并不是一個(gè)簡(jiǎn)單的任務(wù)。有許多由第三方發(fā)起的 GUI 框架項(xiàng)目正在如火如荼地進(jìn)行中,或許我們會(huì)在不久的將來(lái)看到一些可用的 Go 語(yǔ)言 GUI 框架。不過(guò)現(xiàn)階段的 Go 語(yǔ)言已經(jīng)提供了大量有關(guān) Web 方面的功能,我們可以通過(guò)它強(qiáng)大的 http 和 template 包來(lái)達(dá)到 Web 應(yīng)用的 GUI 實(shí)現(xiàn)。
我們會(huì)經(jīng)常涉及到一些關(guān)于 Go 語(yǔ)言的編碼規(guī)范,了解和使用這些已經(jīng)被廣泛認(rèn)同的規(guī)范應(yīng)該是你學(xué)習(xí)階段最重要的實(shí)踐。我會(huì)在書(shū)中盡量使用已經(jīng)講解的概念或者技巧來(lái)解釋相關(guān)的代碼示例,以避免你在不了解某些高級(jí)概念的情況下而感到迷茫。
我們通過(guò) 227 個(gè)完整的代碼示例和書(shū)中的解釋說(shuō)明來(lái)對(duì)所有涉及到的概念和技巧進(jìn)行徹底的講解,你可以下載這些代碼到你的電腦上運(yùn)行,從而加深對(duì)概念的理解。
本書(shū)會(huì)盡可能地將前后章節(jié)的內(nèi)容聯(lián)系起來(lái),當(dāng)然這也同時(shí)要求你通過(guò)學(xué)習(xí)不同的知識(shí)來(lái)對(duì)一個(gè)問(wèn)題提出盡可能多的解決方案。記住,學(xué)習(xí)一門(mén)新語(yǔ)言的最佳方式就是實(shí)踐,運(yùn)行它的代碼,修改并嘗試更多的方案。因此,你絕對(duì)不可以忽略書(shū)中的 130 個(gè)代碼練習(xí),這將對(duì)你學(xué)習(xí)好 Go 語(yǔ)言有很大的幫助。比如,我們就為斐波那契算法提供了 13 個(gè)不同的版本,而這些版本都使用了不同的概念和技巧。
你可以通過(guò)訪(fǎng)問(wèn)本書(shū)的 官方網(wǎng)站 下載書(shū)中的代碼(譯者注:所有代碼文件已經(jīng)包括在 GitHub 倉(cāng)庫(kù)中),并獲得有關(guān)本書(shū)的勘誤情況和內(nèi)容更新。
為了讓你在成為 Go 語(yǔ)言大師的道路上更加順利,我們會(huì)專(zhuān)注于一些特別的章節(jié)以提供 Go 語(yǔ)言開(kāi)發(fā)模式的最佳實(shí)踐,同時(shí)也會(huì)幫助初學(xué)者逃離一些語(yǔ)言的陷阱。第 18 章可以作為你在開(kāi)發(fā)時(shí)的一個(gè)參考手冊(cè),因?yàn)楫?dāng)中包含了眾多的有價(jià)值的代碼片段以及相關(guān)的解釋說(shuō)明。
最后要說(shuō)明的是,你可以通過(guò)完整的索引來(lái)快速定位你需要閱讀的章節(jié)。書(shū)中所有的代碼都在 Go1.4 版本下測(cè)試通過(guò)。
這里有一段來(lái)自在 C++、Java 和 Python 領(lǐng)域眾所周知的專(zhuān)家 Bruce Eckel 的評(píng)論:
“作為一個(gè)有著 C/C++ 背景的開(kāi)發(fā)者,我在使用 Go 語(yǔ)言時(shí)仿佛呼吸到了新鮮空氣一般,令人心曠神怡。我認(rèn)為使用 Go 語(yǔ)言進(jìn)行系統(tǒng)編程開(kāi)發(fā)比使用 C++ 有著更顯著的優(yōu)勢(shì),因?yàn)樗诮鉀Q一些很難用 C++ 解決的問(wèn)題的同時(shí),讓我的工作變得更加高效。我并不是說(shuō) C++ 的存在是一個(gè)錯(cuò)誤,相反地,我認(rèn)為這是歷史發(fā)展的必然結(jié)果。當(dāng)我深陷在 C 語(yǔ)言這門(mén)略微比匯編語(yǔ)言好一點(diǎn)的泥潭時(shí),我堅(jiān)信任何語(yǔ)言的構(gòu)造都不可能支持大型項(xiàng)目的開(kāi)發(fā)。像垃圾回收或并發(fā)語(yǔ)言支持這類(lèi)東西,在當(dāng)時(shí)都是極其荒謬的主意,根本沒(méi)有人在乎。C++ 向大型項(xiàng)目開(kāi)發(fā)邁出了重要的第一步,帶領(lǐng)我們走進(jìn)這個(gè)廣袤無(wú)垠的世界。很慶幸 Stroustrup 做了讓 C++ 兼容 C 語(yǔ)言以能夠讓其編譯 C 程序這個(gè)正確的決定。我們當(dāng)時(shí)需要 C++ 的出現(xiàn)。”
“之后我們學(xué)到了更多。我們毫無(wú)疑問(wèn)地接受了垃圾回收,異常處理和虛擬機(jī)這些當(dāng)年人們認(rèn)為只有瘋子才會(huì)想的東西。C++ 的復(fù)雜程度(新版的 C++ 甚至更加復(fù)雜)極大的影響了軟件開(kāi)發(fā)的高效性,這使得它再也不再適合這個(gè)時(shí)代。人們不再像過(guò)往那樣認(rèn)同在 C++ 中兼容使用 C 語(yǔ)言的方法,認(rèn)為這些工作只是在浪費(fèi)時(shí)間,犧牲人們的努力。就在此時(shí),Go 語(yǔ)言已經(jīng)成功地解決了 C++ 中那些本打算解決卻未能解決的關(guān)鍵問(wèn)題。”
我非常想要向發(fā)明這門(mén)精湛的語(yǔ)言的 Go 開(kāi)發(fā)團(tuán)隊(duì)表示真摯的感謝,尤其是團(tuán)隊(duì)的領(lǐng)導(dǎo)者 Rob Pike、Russ Cox 和 Andrew Gerrand,他們闡述的例子和說(shuō)明都非常的完美。同時(shí),我還要感謝 Miek Gieben、Frank Muller、Ryanne Dolan 和 Satish V.J. 給予我巨大的幫助,還有那些 golang-nuts 郵件列表里的所有的成員。
歡迎來(lái)到 Go 語(yǔ)言開(kāi)發(fā)的奇妙世界!