? ? ? ?之前一直用Node.js作為開(kāi)發(fā)語(yǔ)言,用了差不多4年的Node.js,涉及前端和后端,最近看到Golang這個(gè)新興之秀挺火的,于是想探究探究一下這門(mén)語(yǔ)言,對(duì)比了一下他們的Github repo,截止現(xiàn)在Node.js的repo有72.5K星, issue數(shù)量是859個(gè),Golang的repo有75.7K星,issue數(shù)量是5K+個(gè)。從趨勢(shì)來(lái)看,Golang來(lái)勢(shì)洶洶,但是問(wèn)題較多,需要一段時(shí)間才能更加穩(wěn)定。到官網(wǎng)看了一下Golang的簡(jiǎn)單使用方法,毫無(wú)疑問(wèn),都是從hello world開(kāi)始的,編寫(xiě)了一個(gè)go文件之后,使用go build命令可以直接打包成二進(jìn)制的文件,然后直接執(zhí)行這個(gè)二進(jìn)制文件即可運(yùn)行該程序,使用起來(lái)確實(shí)是方便??磥?lái)程序語(yǔ)言都是朝著這個(gè)方向在前進(jìn)的,盡量構(gòu)建的時(shí)候打包成二進(jìn)制文件,讓機(jī)器直接來(lái)執(zhí)行,比如最近比較火的WebAssembly也是采用的這種形式,先將代碼轉(zhuǎn)化為接近于二進(jìn)制的文件,然后再執(zhí)行。而Node.js采用的是解釋器的方式進(jìn)行代碼運(yùn)行的,也就是運(yùn)行到哪里,哪里再開(kāi)始做一些編譯的動(dòng)作,這種解釋器的方法有一個(gè)優(yōu)勢(shì),運(yùn)行起來(lái)很快,但是同樣會(huì)有缺點(diǎn),也就是程序一開(kāi)始并不知道哪里會(huì)有編譯的錯(cuò)誤,要運(yùn)行到錯(cuò)誤的那一行才會(huì)發(fā)現(xiàn),另外就是一些代碼的重復(fù)執(zhí)行編譯,比如for循環(huán),里面的語(yǔ)句是需要循環(huán)一次編譯運(yùn)行一次的;golang的提前編譯就就解決了運(yùn)行時(shí)才發(fā)現(xiàn)錯(cuò)誤的這個(gè)劣勢(shì),還有重復(fù)編譯執(zhí)行某些語(yǔ)句的問(wèn)題,另外就是golang可以在構(gòu)建的階段將文件直接轉(zhuǎn)化為二進(jìn)制文件,運(yùn)行起來(lái)更加高效。
? ? ? ?通過(guò)運(yùn)行g(shù)o官網(wǎng)提供的一些例子,我發(fā)現(xiàn)它和C語(yǔ)言的風(fēng)格很類似,一開(kāi)始來(lái)個(gè)package ,然后import導(dǎo)入包,main函數(shù)為入口函數(shù),很多東西相比C語(yǔ)言,簡(jiǎn)化并優(yōu)秀了很多,比如函數(shù)的聲明、自動(dòng)支持Unicode字符集、提供了100多個(gè)標(biāo)準(zhǔn)包來(lái)執(zhí)行基本的輸入輸出還有文本處理等常規(guī)任務(wù),所以有些人會(huì)把Go成為類C語(yǔ)言或者21世紀(jì)的C語(yǔ)言。它確實(shí)是吸取了C語(yǔ)言的一些特性,比如表達(dá)式語(yǔ)法、控制流語(yǔ)句、基本數(shù)據(jù)類型,同時(shí)它也吸收了Pascal的優(yōu)秀特點(diǎn),比如包導(dǎo)入、聲明的語(yǔ)法,還有就是收到CSP語(yǔ)言的啟發(fā),在CSP中,程序就是一組無(wú)共享狀態(tài)進(jìn)程的并行組合,進(jìn)程間的通信和同步采用通道完成。

? ? ? ?Go的發(fā)明者Rob Pike來(lái)自于Google,Google的軟件項(xiàng)目用戶量多,業(yè)務(wù)復(fù)雜,為了修復(fù)某個(gè)問(wèn)題,一點(diǎn)點(diǎn)將系統(tǒng)的某個(gè)部分變得更加復(fù)雜,在當(dāng)今敏捷開(kāi)發(fā)的模式下,簡(jiǎn)單性往往被忽略,Rob Pike意識(shí)到了這一點(diǎn),發(fā)明了Go語(yǔ)言。由于在設(shè)計(jì)這門(mén)語(yǔ)言的時(shí)候考慮了大量的錯(cuò)誤檢測(cè),于是它可以避免開(kāi)發(fā)者犯下的絕大部分錯(cuò)誤,同時(shí)它也是相比其他語(yǔ)言相對(duì)簡(jiǎn)單的語(yǔ)言。由于沒(méi)有接觸過(guò)太多Go的東西,只是通過(guò)閱讀官網(wǎng)、文檔還有一些前輩的經(jīng)驗(yàn),所以上面講到的一些內(nèi)容比較膚淺,下一節(jié)我開(kāi)始從程序的結(jié)構(gòu)出發(fā),講解一下Go的一些使用方法和特性,來(lái)幫助更多入門(mén)Go的開(kāi)發(fā)者。
參考文獻(xiàn):
1.?幾張圖讓你看懂WebAssembly:http://www.itdecent.cn/p/bff8aa23fe4d
2. golang官網(wǎng):https://golang.org/