本文是「vangoleo的Go語(yǔ)言學(xué)習(xí)筆記」系列文章之一盒音。
官網(wǎng): http://www.vangoleo.com/go/hello-golang/
我在2015年第一次接觸Go語(yǔ)言,完成了Hello World馅而,隨后也一直在關(guān)注這門(mén)新語(yǔ)言祥诽。至今,Go語(yǔ)言發(fā)展已經(jīng)過(guò)去十年多了瓮恭,越來(lái)越受到廣大開(kāi)發(fā)者的關(guān)注雄坪,而且隨著云原生、IoT屯蹦、區(qū)塊鏈的流行维哈,Go似乎要成為21世紀(jì)的第一語(yǔ)言绳姨。Docker、Kubernetes阔挠、以太坊等重量級(jí)的項(xiàng)目都是基于Go開(kāi)發(fā)飘庄。
Go語(yǔ)言是Google公司在2009年開(kāi)源的一門(mén)高級(jí)編程語(yǔ)言,它為解決大型系統(tǒng)開(kāi)發(fā)過(guò)程中的實(shí)際問(wèn)題而設(shè)計(jì)购撼,支持并發(fā)跪削、規(guī)范統(tǒng)一、簡(jiǎn)單優(yōu)雅迂求,性能強(qiáng)大碾盐,被很多Go語(yǔ)言傳道者譽(yù)為“云計(jì)算時(shí)代的C語(yǔ)言”。
近期揩局,我在系統(tǒng)地學(xué)習(xí)Go語(yǔ)言毫玖,并整理了一些學(xué)習(xí)筆記。后續(xù)會(huì)和大家進(jìn)行分享谐腰。今天先和大家聊聊Go語(yǔ)言的發(fā)展史和Go語(yǔ)言的特點(diǎn)孕豹。
Go的命名
這是一封由Rob Pike在2007年9月25日,下午3:12發(fā)送給Robert Griesemer和Ken Thompson的有關(guān)編程語(yǔ)言討論主題的郵件十气,郵件正文大意為:
我在開(kāi)車(chē)回家的路上得到了些靈感:
- 給這門(mén)編程語(yǔ)言取名為“go”,它很簡(jiǎn)短春霍,易書(shū)寫(xiě)砸西。
- 工具類可以命名為:goc、 gol址儒、goa芹枷。
- 交互式的調(diào)試工具也可以直接命名為“go”。
- 語(yǔ)言文件后綴名為 .go 等等莲趣。
和很多偉大的公司誕生于車(chē)庫(kù)一樣鸳慈,Go語(yǔ)言的命名也和汽車(chē)有關(guān)。以上就是Go語(yǔ)言名字的來(lái)源喧伞。我個(gè)人是很喜歡Go這個(gè)命名的走芋,看似很隨意的一個(gè)想法,卻很精準(zhǔn)潘鲫。有著Google的純正血統(tǒng)翁逞,又體現(xiàn)了語(yǔ)言簡(jiǎn)單,優(yōu)雅的特點(diǎn)溉仑。而且Go里面開(kāi)啟一個(gè)協(xié)程的關(guān)鍵字就是go挖函。
谷歌工程師的20%時(shí)間
自此之后Robert、Rob和Ken三個(gè)人開(kāi)始在Google內(nèi)部進(jìn)行了研發(fā)浊竟,一直到了2009年怨喘,Go正式開(kāi)源了津畸,Go項(xiàng)目團(tuán)隊(duì)將2009年11月10 日,即該語(yǔ)言正式對(duì)外開(kāi)源的日字作為其官方生日必怜。源代碼最初托管在http://code.google.com
上肉拓,之后幾年才逐步的遷移到 GitHub上。
谷歌的“20%時(shí)間”工作方式棚赔,允許工程師拿出20%的時(shí)間來(lái)研究自己喜歡的項(xiàng)目帝簇。語(yǔ)音服務(wù)Google Now、谷歌新聞Google News靠益、谷歌地圖Google Map上的交通信息等丧肴,全都是20%時(shí)間的產(chǎn)物。
Go語(yǔ)言最開(kāi)始也是20%時(shí)間的產(chǎn)物胧后。
Go語(yǔ)言的三位創(chuàng)始人
郵件中提到的就是Go語(yǔ)言最重要的3位創(chuàng)始人:
讓我們來(lái)認(rèn)識(shí)一下這3位大佬:
- Rob Pike:曾是貝爾實(shí)驗(yàn)室Unix開(kāi)發(fā)團(tuán)隊(duì)成員芋浮,Plan9操作系統(tǒng)開(kāi)發(fā)的主要領(lǐng)導(dǎo)人,Inferno操作系統(tǒng)開(kāi)發(fā)的主要領(lǐng)導(dǎo)人壳快。
- ken tomption:圖靈獎(jiǎng)得主纸巷,C語(yǔ)言前身B語(yǔ)言的作者,Unix的發(fā)明人之一眶痰,操作系統(tǒng)Plan 9的主要作者瘤旨。 共同開(kāi)發(fā)了UTF-8。
- Robert:曾為谷歌的V8 JavaScript引擎和Chubby開(kāi)發(fā)代碼竖伯。
Go語(yǔ)言血統(tǒng)
編程語(yǔ)言的發(fā)展存哲,和物種進(jìn)化類似。每種編程語(yǔ)言都會(huì)從先前的語(yǔ)言吸取精華七婴,再進(jìn)行創(chuàng)新和改進(jìn)祟偷。下圖展示了Go從它的前輩們繼承了哪些優(yōu)點(diǎn),Go正是站在這些巨人的肩膀上打厘,在云時(shí)代修肠,發(fā)揮越來(lái)越大的作用。
Go語(yǔ)言從前輩們繼承的特點(diǎn):
- C語(yǔ)言:Go語(yǔ)言有時(shí)候被描述為“C類似語(yǔ)言”户盯,或者是“21世紀(jì)的C語(yǔ)言”嵌施。Go從C語(yǔ)言繼承了相似的表達(dá)式語(yǔ)法、控制流結(jié)構(gòu)先舷、基礎(chǔ)數(shù)據(jù)類型艰管、調(diào)用參數(shù)傳值、指針等很多思想蒋川,還有C語(yǔ)言一直所看中的編譯后機(jī)器碼的運(yùn)行效率以及和現(xiàn)有操作系統(tǒng)的無(wú)縫適配牲芋。
- Pascal:但是在Go語(yǔ)言的家族樹(shù)中還有其它的祖先。其中一個(gè)有影響力的分支來(lái)自Niklaus Wirth所設(shè)計(jì)的 Pascal)語(yǔ)言。然后Modula-2語(yǔ)言激發(fā)了包的概念缸浦。然后Oberon)語(yǔ)言摒棄了模塊接口文件和模塊實(shí)現(xiàn)文件之間的區(qū)別夕冲。第二代的Oberon-2)語(yǔ)言直接影響了包的導(dǎo)入和聲明的語(yǔ)法,還有Oberon)語(yǔ)言的面向?qū)ο筇匦运峁┑姆椒ǖ穆暶髡Z(yǔ)法等裂逐。
- CSP:Go語(yǔ)言的另一支祖先歹鱼,帶來(lái)了Go語(yǔ)言區(qū)別其他語(yǔ)言的重要特性,靈感來(lái)自于貝爾實(shí)驗(yàn)室的Tony Hoare于1978年發(fā)表的鮮為外界所知的關(guān)于并發(fā)研究的基礎(chǔ)文獻(xiàn)卜高,順序通信進(jìn)程(communicating sequential processes 弥姻,縮寫(xiě)為CSP)。在CSP中掺涛,程序是一組中間沒(méi)有共享狀態(tài)的平行運(yùn)行的處理過(guò)程庭敦,它們之間使用管道進(jìn)行通信和控制同步。不過(guò)Tony Hoare的CSP只是一個(gè)用于描述并發(fā)性基本概念的描述語(yǔ)言薪缆,并不是一個(gè)可以編寫(xiě)可執(zhí)行程序的通用編程語(yǔ)言秧廉。Go語(yǔ)言使用管道在協(xié)程進(jìn)進(jìn)行通信。
重量級(jí)應(yīng)用
如下是列舉的一些Go語(yǔ)言的重量級(jí)應(yīng)用:
Go的優(yōu)點(diǎn)
如果現(xiàn)實(shí)世界需要我能夠在幾天內(nèi)對(duì)一個(gè)生產(chǎn)系統(tǒng)進(jìn)行原型設(shè)計(jì)拣帽、測(cè)試和部署疼电,而且在每秒能處理比原來(lái)多5倍請(qǐng)求,CPU和內(nèi)存的開(kāi)銷還都很小减拭。我想大概只有Go語(yǔ)言可以勝任了蔽豺。
Go語(yǔ)言有如下優(yōu)點(diǎn):
- 單獨(dú)的二進(jìn)制發(fā)布:Go項(xiàng)目編譯會(huì)生成一個(gè)靜態(tài)的可執(zhí)行文件。該文件可獨(dú)立運(yùn)行而不需要其他依賴拧粪。這種方式特別適合于云原生容器環(huán)境茫虽。
- 交叉編譯:在任何操作系統(tǒng)上都可以編譯在其他平臺(tái)上可運(yùn)行的二進(jìn)制文件。比如在Mac系統(tǒng)上可編譯出在Linux和Windows上可運(yùn)行的二進(jìn)制文件既们。
- 垃圾回收:Go語(yǔ)言支持垃圾回收。相比較正什,C++啥纸,Rust等需要開(kāi)發(fā)者自己控制。
- 執(zhí)行性能:Go非常的快婴氮。性能接近于C++斯棒。遠(yuǎn)高于Java,Python主经、Node荣暮。
- 開(kāi)發(fā)效率:Go語(yǔ)言同時(shí)具備靜態(tài)語(yǔ)言的運(yùn)行性能和動(dòng)態(tài)語(yǔ)言的開(kāi)發(fā)效率。
- 簡(jiǎn)單罩驻,高效:Go語(yǔ)言的設(shè)計(jì)哲學(xué)里就包括了簡(jiǎn)單和高效穗酥。一個(gè)典型的反例就是復(fù)雜,臃腫的Java語(yǔ)言。
- 并發(fā)性:語(yǔ)言層面支持并發(fā)砾跃,通過(guò)協(xié)程和通道簡(jiǎn)化并發(fā)開(kāi)發(fā)骏啰,提高并發(fā)性能。
- 豐富的標(biāo)準(zhǔn)庫(kù):Go標(biāo)準(zhǔn)庫(kù)覆蓋了文本抽高,IO判耕,網(wǎng)絡(luò),加密翘骂,Web服務(wù)壁熄,遠(yuǎn)程RPC,模板引擎等功能碳竟。
- 可以調(diào)用C語(yǔ)言:可以調(diào)用C語(yǔ)言函數(shù)草丧,進(jìn)一步優(yōu)化性能,復(fù)用C語(yǔ)言龐大的生態(tài)系統(tǒng)瞭亮。
- 快速編譯時(shí)間:Go的編譯特別快方仿。大家可以參考兩款靜態(tài)博客生成系統(tǒng),Hexo(Node開(kāi)發(fā))和Hugo(Go開(kāi)發(fā))统翩。
- 工程型:Go語(yǔ)言設(shè)計(jì)的目的就是成為一門(mén)工程語(yǔ)言仙蚜,解決實(shí)際的工程問(wèn)題。Go語(yǔ)言定義了開(kāi)發(fā)規(guī)范厂汗,并提供了豐富的工具委粉。使用Go語(yǔ)言可以編寫(xiě)出容易閱讀和理解,容易測(cè)試娶桦、維護(hù)和擴(kuò)展的程序贾节。
Go缺點(diǎn)
- 缺少重量級(jí)框架。如Ruby的Rails衷畦,Python的Django栗涂,Java的Spring。
- 錯(cuò)誤處理:沒(méi)有異常系統(tǒng)祈争。Go官方正在解決該問(wèn)題斤程。
- 軟件包管理:很長(zhǎng)時(shí)間以來(lái),Go官方都沒(méi)有一套軟件包管理體制菩混。直到最近忿墅,Go的1.13版本正式引入了Go Module作為官方的依賴管理工具。
- 不是標(biāo)準(zhǔn)的面向?qū)ο蟮木幊棠P停哼@個(gè)也是Go語(yǔ)言的一個(gè)創(chuàng)新沮峡。如果你是堅(jiān)實(shí)的OOP的擁護(hù)者疚脐,可能會(huì)有些不適應(yīng)。
文化
人們說(shuō)邢疙,每當(dāng)你學(xué)習(xí)一門(mén)新的口語(yǔ)時(shí)棍弄,你也會(huì)沉浸在說(shuō)這種語(yǔ)言的人的某些文化中望薄。因此,您學(xué)習(xí)的語(yǔ)言越多照卦,您可能會(huì)有更多的變化式矫。
編程語(yǔ)言也是如此。無(wú)論您將來(lái)如何應(yīng)用新的編程語(yǔ)言役耕,它總能給你帶來(lái)新的編程視角或某些特別的技術(shù)采转。
無(wú)論是函數(shù)式編程,模式匹配還是原型繼承瞬痘,一旦你學(xué)會(huì)了它們故慈,你就可以隨身攜帶這些編程思想,這擴(kuò)展了你作為軟件開(kāi)發(fā)人員所擁有的問(wèn)題解決工具集框全。它們也改變了你閱讀高質(zhì)量代碼的方式察绷。
而Go在這方面有一項(xiàng)了不起的財(cái)富。Go文化的主要支柱是保持簡(jiǎn)單津辩,腳踏實(shí)地的代碼拆撼,而不會(huì)產(chǎn)生許多冗余的抽象概念,并將可維護(hù)性放在首位喘沿。大部分時(shí)間花費(fèi)在代碼的編寫(xiě)工作上闸度,而不是在修補(bǔ)工具和環(huán)境或者選擇不同的實(shí)現(xiàn)方式上,這也是Go文化的一部分蚜印。
Go文化也可以總結(jié)為:“應(yīng)當(dāng)只用一種方法去做一件事莺禁,并保持簡(jiǎn)單,高效”窄赋。
一點(diǎn)注意事項(xiàng)哟冬。當(dāng)你需要構(gòu)建相對(duì)復(fù)雜的抽象代碼時(shí),Go通常會(huì)妨礙你忆绰。好吧浩峡,我會(huì)說(shuō)這是簡(jiǎn)單的權(quán)衡。
本文由 www.vangoleo.com 發(fā)布