一、Go語(yǔ)言出現(xiàn)之前的編程痛點(diǎn)
(1)為什么會(huì)設(shè)計(jì)Go語(yǔ)言?我們先來(lái)了解一下Go語(yǔ)言的作者和主要核心開發(fā)者們:Rob Pike:曾是貝爾實(shí)驗(yàn)室(Bell Labs)的Unix團(tuán)隊(duì),和Plan 9操作系統(tǒng)計(jì)劃的成員。他與Thompson共事多年,并共創(chuàng)出廣泛使用的UTF-8 字元編碼。Ken Thompson:主要是B語(yǔ)言、C語(yǔ)言的作者,Unix之父。1983年圖靈獎(jiǎng)(Turing Award)和1998年美國(guó)國(guó)家技術(shù)獎(jiǎng)(National Medal of Technology)得主。他與Dennis Ritchie是Unix的原創(chuàng)者。Thompson也發(fā)明了后來(lái)衍生出C語(yǔ)言的B程序語(yǔ)言。Robert Griesemer:在開發(fā)Go之前是Google V8、Chubby和HotSpot JVM的主要貢獻(xiàn)者。設(shè)計(jì)Go語(yǔ)言是為了解決當(dāng)時(shí)Google開發(fā)遇到的以下這些問題:- 大量的C++代碼,同時(shí)又引入了Java和Python;
- 每個(gè)工程師只是用了一個(gè)語(yǔ)言里面的一部分;
- 更新的花費(fèi)越來(lái)越長(zhǎng);
所以,他們當(dāng)時(shí)設(shè)計(jì)Go的目標(biāo)是為了消除各種緩慢和笨重、改進(jìn)各種低效和擴(kuò)展性。Go是由那些開發(fā)大型系統(tǒng)的人設(shè)計(jì)的,同時(shí)也是為了這些人服務(wù)的;它是為了解決工程上的問題,不是為了研究語(yǔ)言設(shè)計(jì);它還是為了讓我們的編程變得更舒適和方便。但是結(jié)合Google當(dāng)時(shí)內(nèi)部的一些現(xiàn)實(shí)情況,比如:很多工程師都是C系的,所以新設(shè)計(jì)的語(yǔ)言一定要易學(xué)習(xí),最好是C-like的語(yǔ)言;因?yàn)橛刑嗟姆植际较到y(tǒng)和太多的開發(fā)者,所以新的語(yǔ)言一定要可以Scale,這包括開發(fā)、工程師、代碼、部署和依賴;20年沒有出新的語(yǔ)言了,所以新設(shè)計(jì)的語(yǔ)言必須是現(xiàn)代化的(例如內(nèi)置GC);等等。他們覺得要實(shí)現(xiàn)這個(gè)目標(biāo)就需要Go成為一個(gè)大家都認(rèn)可的語(yǔ)言。最后根據(jù)實(shí)戰(zhàn)經(jīng)驗(yàn),他們向著目標(biāo)設(shè)計(jì)了Go語(yǔ)言,其主要的特色有:- Interface但是不需要顯示聲明(Duck Type);
- 不用的Import或者變量引起編譯錯(cuò)誤;
- 完整而卓越的標(biāo)準(zhǔn)庫(kù)包。
Go語(yǔ)言發(fā)布之后,很多公司特別是云計(jì)算公司開始用Go重構(gòu)他們的基礎(chǔ)架構(gòu),很多都是直接采用Go進(jìn)行了開發(fā)。這幾年火到爆的Docker、Kubernetes就是采用Go開發(fā)的。(2)Go主要應(yīng)用的領(lǐng)域。 上面那些基本上就是Go的歷史背景和設(shè)計(jì)初衷,那么目前Go主要應(yīng)用于哪些系統(tǒng)呢? 目前Go主要應(yīng)用在下面這些系統(tǒng):①Web服務(wù)器編程,以前使用C或者C++做的那些事情,用Go來(lái)做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。②容器開發(fā):Docker,使開發(fā)高效且可預(yù)測(cè);Kubernetes,也稱為K8s,是一個(gè)開源系統(tǒng),用于自動(dòng)化容器化應(yīng)用程序的部署、擴(kuò)展和管理。③微服務(wù)、分布式系統(tǒng)、數(shù)據(jù)庫(kù)代理器等,例如gRPC、Etcd等。④Web網(wǎng)絡(luò)編程,這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包足夠強(qiáng)大,基本涵蓋了常用的Web應(yīng)用方法。⑤數(shù)據(jù)庫(kù),前一段時(shí)間Google開發(fā)的Groupcache、Couchbase的部分組件、Tidb、Cockroachdb、Influxdb等。⑥云平臺(tái),目前國(guó)外很多云平臺(tái)在采用Go開發(fā),CloudFoundy的部分組建,前VMare的技術(shù)總監(jiān)自己出來(lái)搞的Apcera云平臺(tái)。國(guó)內(nèi)很多云創(chuàng)業(yè)公司都會(huì)選擇把Go作為首要語(yǔ)言,例如七牛云等。為什么會(huì)選擇Go呢?與其他語(yǔ)言的應(yīng)用相比,它有什么優(yōu)點(diǎn)呢?①簡(jiǎn)單,學(xué)習(xí)曲線平穩(wěn);⑤強(qiáng)大的標(biāo)準(zhǔn)庫(kù);⑦簡(jiǎn)單而強(qiáng)大的并發(fā)處理能力;二、Go語(yǔ)言Web編程的優(yōu)勢(shì)
通過上面的介紹我們知道,Go語(yǔ)言Web開發(fā)領(lǐng)域有得天獨(dú)厚的優(yōu)勢(shì)!Go語(yǔ)言被稱為云計(jì)算時(shí)代的C語(yǔ)言。我們知道,在Web開發(fā)的世界里,敏捷才是王道。誰(shuí)能使用更少的費(fèi)用和資源來(lái)更快地完成網(wǎng)站和網(wǎng)絡(luò)應(yīng)用,誰(shuí)就能獲得更多的競(jìng)爭(zhēng)優(yōu)勢(shì)。此外,對(duì)于編程者而言,不僅希望快速完成Web開發(fā),對(duì)可用性和用戶體驗(yàn)的要求也很高。讓我們看一下Python的特性,以及為什么它能夠成為Web開發(fā)領(lǐng)域的主流。(1)Python vs Go語(yǔ)言:優(yōu)點(diǎn)與缺點(diǎn)Go語(yǔ)言現(xiàn)在被認(rèn)為是Python、Java等傳統(tǒng)語(yǔ)言的替代品,關(guān)于Go語(yǔ)言 Web開發(fā)與Python、Java的討論不勝枚舉。雖然簡(jiǎn)單是Python的主要優(yōu)點(diǎn),但也有一些缺點(diǎn)。許多開發(fā)人員發(fā)現(xiàn),雖然對(duì)于一些簡(jiǎn)單和基本的開發(fā)Python很實(shí)用,但如果要構(gòu)建更復(fù)雜的系統(tǒng)和定制模塊,使用Python可能會(huì)變得很復(fù)雜。此外,經(jīng)常出現(xiàn)令人沮喪的編碼錯(cuò)誤。在HekReNo.com的文章“從Python轉(zhuǎn)到Go語(yǔ)言的五個(gè)原因”中,Tigran Bayburstyan說:“Python是一門偉大而有趣的語(yǔ)言,但有時(shí)你會(huì)遇到異常,因?yàn)槟阍噲D使用一個(gè)變量作為一個(gè)整數(shù),但事實(shí)證明它是一個(gè)字符串?!盙o會(huì)讓你在編譯時(shí)消除這些問題。總而言之,在許多用例中,Go語(yǔ)言 Web開發(fā)已被證明比Python能更快地完成同一類任務(wù)。(2)Python vs Go語(yǔ)言:哪一個(gè)更好?那么,Go語(yǔ)言是否會(huì)在不久的將來(lái)取代Python呢?開發(fā)者社區(qū)正在討論兩種編程語(yǔ)言的優(yōu)缺點(diǎn)。如果您正在尋找用于Web編程、移動(dòng)開發(fā)、微服務(wù)和ERP系統(tǒng)的強(qiáng)大工具,我們相信,您應(yīng)該切換到Go語(yǔ)言的原因是:另一個(gè)有助于Go語(yǔ)言 Web編程出色的簡(jiǎn)單性和易用性的是其清晰的語(yǔ)法,它包含零不必要的組件。Go是建立在實(shí)用的頭腦中的:而不是必須深入研究語(yǔ)言結(jié)構(gòu),開發(fā)者現(xiàn)在可以自由地專注于開發(fā)本身。總結(jié),通過上面的對(duì)比我們發(fā)現(xiàn),Go語(yǔ)言在各方面基本都已經(jīng)超過Python,盡管Python社區(qū)仍然超過Gophers,但Go倡導(dǎo)者的數(shù)量每天都在增加,相信Go語(yǔ)言接近并超過Python、Java是大勢(shì)所趨。三、Go語(yǔ)言Web開發(fā)常用框架
Go語(yǔ)言被稱為云計(jì)算時(shí)代的C語(yǔ)言,它以其獨(dú)特的優(yōu)勢(shì)逐漸被越來(lái)越多的公司所關(guān)注和使用。為了充分利用Go語(yǔ)言的Web開發(fā)優(yōu)勢(shì),有必要熟悉一下Go語(yǔ)言的Web框架。(1)Beego (http://beego.me/)(2)Gin(https://gin-gonic.github.io/gin/)(3)Revel(http://revel.github.io/)(4)Martini (http://martini.codegangsta.io)(5)Goji(https://goji.io/)一個(gè)技術(shù)能不能發(fā)展起來(lái),關(guān)鍵還要看三點(diǎn)。- 有沒有一個(gè)比較好的社區(qū)。像 C、C++、Java、Python 和 JavaScript 的生態(tài)圈都是非常豐富和火爆的。尤其是有很多商業(yè)機(jī)構(gòu)參與的社區(qū)那就更為人氣爆棚了,比如 Linux 的社區(qū)。
- 有沒有一個(gè)工業(yè)化的標(biāo)準(zhǔn)。像 C、C++、Java 都是有標(biāo)準(zhǔn)化組織的。尤其是 Java,其在架構(gòu)上還搞出了像 J2EE 這樣的企業(yè)級(jí)標(biāo)準(zhǔn)。
- 有沒有一個(gè)或多個(gè)殺手級(jí)應(yīng)用。C、C++ 和 Java 的殺手級(jí)應(yīng)用不用多說了,就算是對(duì)于 PHP 這樣還不能算是一個(gè)好的編程語(yǔ)言來(lái)說,因?yàn)槭?Linux 時(shí)代的第一個(gè)殺手級(jí)解決方案 LAMP 中的關(guān)鍵技術(shù),所以,也發(fā)展起來(lái)了。
上述的這三點(diǎn)是非常關(guān)鍵的,新的技術(shù)只需要占到其中一到兩點(diǎn)就已經(jīng)很不錯(cuò)了,何況有的技術(shù),比如 Java,是三點(diǎn)全占到了,所以,Java 的發(fā)展是如此好。當(dāng)然,除了上面這三點(diǎn)重要的,還有一些其它的影響因素,比如:- 學(xué)習(xí)曲線是否低,上手是否快。這點(diǎn)非常重要,C++ 在這點(diǎn)上越做越不好了。
- 有沒有一個(gè)不錯(cuò)的提高開發(fā)效率的開發(fā)框架。如:Java 的 Spring 框架,C++ 的 STL 等。
- 是否有一個(gè)或多個(gè)巨型的技術(shù)公司作為后盾。如:Java 和 Linux 后面的 IBM、Sun……
- 有沒有解決軟件開發(fā)中的痛點(diǎn)。如:Java 解決了 C 和 C++ 的內(nèi)存管理問題。
用這些標(biāo)尺來(lái)量一下 Go 語(yǔ)言,Go 語(yǔ)言的優(yōu)勢(shì)如下:- Go 語(yǔ)言解決了并發(fā)編程和寫底層應(yīng)用開發(fā)效率的痛點(diǎn);
- Go 語(yǔ)言有 Google 這個(gè)世界一流的技術(shù)公司在后面;
- Go 語(yǔ)言的殺手級(jí)應(yīng)用是 Docker,而 Docker 的生態(tài)圈在這幾年完全爆棚了。
所以,Go 語(yǔ)言的未來(lái)是不可限量的。當(dāng)然,我個(gè)人覺得,Go 可能會(huì)吞食很多 C、C++、Java 的項(xiàng)目。不過,Go 語(yǔ)言所蠶食的主要項(xiàng)目應(yīng)該是中間層的項(xiàng)目,也就是Web開發(fā)相關(guān)的項(xiàng)目,既不是非常底層也不會(huì)是業(yè)務(wù)層。也就是說,Go 語(yǔ)言不會(huì)吞食底層到 C 和 C++ 那個(gè)級(jí)別的,也不會(huì)吞食到高層如 Java 業(yè)務(wù)層的項(xiàng)目。Go 語(yǔ)言能吞食的一定是 PaaS 上的項(xiàng)目,比如一些消息緩存中間件、服務(wù)發(fā)現(xiàn)、服務(wù)代理、控制系統(tǒng)、Agent、日志收集等等,沒有復(fù)雜的業(yè)務(wù)場(chǎng)景,也到不了特別底層(如操作系統(tǒng))的中間平臺(tái)層的軟件項(xiàng)目或工具。而 C 和 C++ 會(huì)被打到更底層,Java 會(huì)被打到更上層的業(yè)務(wù)層。Go語(yǔ)言的應(yīng)用范圍一直在擴(kuò)大,云計(jì)算,微服務(wù),區(qū)塊鏈,哪里都有用Go寫的重量級(jí)項(xiàng)目。Docker/Kubernetes生態(tài)圈,幾百/千萬(wàn)行代碼,基本統(tǒng)治了云原生應(yīng)用市場(chǎng)。同時(shí)Go語(yǔ)言未來(lái)會(huì)統(tǒng)治Web開發(fā),成為Web開發(fā)領(lǐng)域的領(lǐng)頭羊。▊《Go Web編程實(shí)戰(zhàn)派——從入門到精通》- 一線技術(shù),突出實(shí)戰(zhàn)!
- 零基礎(chǔ)入門,循序漸進(jìn),實(shí)現(xiàn)快速?gòu)牟锁B向?qū)崙?zhàn)派高手邁進(jìn)!
- 由易到難,重難點(diǎn)標(biāo)注并重點(diǎn)解析;
- 實(shí)戰(zhàn)方案,可直接二次開發(fā)進(jìn)行實(shí)戰(zhàn)部署;
本書采用當(dāng)前Go最新版本編寫,以極客思維、深入Go語(yǔ)言底層進(jìn)行探究,幫助讀者了解背后原理。全書言簡(jiǎn)意賅,以幫助讀者提升開發(fā)效率為導(dǎo)向,同時(shí)盡可能幫助讀者縮短閱讀本書的時(shí)間。
本書拒絕純理論,直接實(shí)戰(zhàn)!絕大部分實(shí)例代碼都是來(lái)自于最新的企業(yè)實(shí)戰(zhàn)項(xiàng)目,所有的示例代碼,拿來(lái)即可運(yùn)行。