首先BFE(baidu front end)這個(gè)項(xiàng)目是一個(gè)功能類似于nginx的項(xiàng)目,并不是大家傳統(tǒng)意義上理解的前端(html+css+js)。之所以稱作“frontend”是因?yàn)樗鄬?duì)于整個(gè)應(yīng)用是處于最前面直接處理用戶的http請(qǐng)求的。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、臨翔網(wǎng)站維護(hù)、網(wǎng)站推廣。
一開(kāi)始這個(gè)項(xiàng)目是使用c語(yǔ)言寫的,因?yàn)闃I(yè)界大多數(shù)http服務(wù)器也都是使用c來(lái)開(kāi)發(fā)的(如apache、nginx)這段時(shí)期稱作c-BFE時(shí)期。
但是到后期,這個(gè)項(xiàng)目遇到了一些問(wèn)題:
c語(yǔ)言的開(kāi)發(fā)效率太低了
c語(yǔ)言應(yīng)對(duì)需求變更比較吃力
c語(yǔ)言抽象能力不足
c語(yǔ)言需要手動(dòng)管理內(nèi)存(有些不很優(yōu)秀的組員會(huì)寫出導(dǎo)致內(nèi)存泄漏的代碼)
bug越改越多,穩(wěn)定性和功能是一對(duì)矛盾
c語(yǔ)言程序員不好招
所以問(wèn)題基本上是出在c語(yǔ)言不適應(yīng)了現(xiàn)在互聯(lián)網(wǎng)的快速變更的需求。之后百度決定重寫這個(gè)項(xiàng)目。
那么在開(kāi)發(fā)效率上,golang基本上是滿足了百度的需求。首先BFE組有很多優(yōu)秀的c/c++的程序員了,他們轉(zhuǎn)go幾乎沒(méi)有什么壓力。對(duì)于一些不那么優(yōu)秀的c程序員(比如經(jīng)常漏內(nèi)存的),用golang之后也不會(huì)導(dǎo)致一些低級(jí)錯(cuò)誤了。所以在學(xué)習(xí)成本上,更換golang對(duì)百度影響不大。
另外,golang本身的并發(fā)模型、語(yǔ)言的描述能力、和內(nèi)存管理等功能,也超過(guò)了c語(yǔ)言。所以整體上,開(kāi)發(fā)效率得到了很大的提升。
使用golang遇到的最大的一個(gè)問(wèn)題就是gc帶來(lái)的問(wèn)題。李炳毅老師也重點(diǎn)是講解了baidu如何解決gc帶來(lái)的延遲問(wèn)題。
在golang的1.3版本,百度的實(shí)際測(cè)試下,10k個(gè)對(duì)象大概會(huì)帶來(lái)1ms的延遲。而B(niǎo)FE一般會(huì)維持50萬(wàn)左右的連接數(shù),如果不對(duì)golang的gc做任何優(yōu)化的情況下,100萬(wàn)鏈接大概會(huì)帶來(lái)400ms的延遲。相當(dāng)于一個(gè)http請(qǐng)求還沒(méi)有打到應(yīng)用上,單單在nginx上就耗費(fèi)了400ms。這肯定不能接受。
本質(zhì)上,是作為文件處理的,發(fā)送是“write,print”,接受是“read”。
連接相當(dāng)于打開(kāi)文件。
1. 保留但大幅度簡(jiǎn)化指針
Go語(yǔ)言保留著C中值和指針的區(qū)別,但是對(duì)于指針?lè)爆嵱梅ㄟM(jìn)行了大量的簡(jiǎn)化,引入引用的概念。所以在Go語(yǔ)言中,你幾乎不用擔(dān)心會(huì)因?yàn)橹苯硬僮鲀?nèi)寸而引起各式各樣的錯(cuò)誤。
2. 多參數(shù)返回
還記得在C里面為了回饋多個(gè)參數(shù),不得不開(kāi)辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無(wú)需使用繁瑣的exceptions體系,一個(gè)函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯(cuò)誤信息,清晰明了。
3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)
如果你習(xí)慣了Python中簡(jiǎn)潔的list和dict操作,在Go語(yǔ)言中,你不會(huì)感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會(huì)發(fā)現(xiàn)你又找到了STL的vector 和 map這對(duì)朋友。
4. Interface
Go語(yǔ)言最讓人贊嘆不易的特性,就是interface的設(shè)計(jì)。任何數(shù)據(jù)結(jié)構(gòu),只要實(shí)現(xiàn)了interface所定義的函數(shù),自動(dòng)就implement了這個(gè)interface,沒(méi)有像Java那樣冗長(zhǎng)的class申明,提供了靈活太多的設(shè)計(jì)度和OO抽象度,讓你的代碼也非常干凈。千萬(wàn)不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺(jué)還行,等接口的設(shè)計(jì)越來(lái)越復(fù)雜的時(shí)候,無(wú)數(shù)Bug正在后面等著你。
同時(shí),正因?yàn)槿绱耍珿o語(yǔ)言的interface可以用來(lái)表示任何generic的東西,比如一個(gè)空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因?yàn)檫@些數(shù)據(jù)類型都不需要實(shí)現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語(yǔ)言的type assertion,可以提供一般動(dòng)態(tài)語(yǔ)言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯(cuò)誤。
5. OO
Go語(yǔ)言本質(zhì)上不是面向?qū)ο笳Z(yǔ)言,它還是過(guò)程化的。但是,在Go語(yǔ)言中, 你可以很輕易的做大部分你在別的OO語(yǔ)言中能做的事,用更簡(jiǎn)單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因?yàn)楸举|(zhì)上,OO在Go語(yǔ)言中,就是普通的struct操作。
6. Goroutine
這個(gè)幾乎算是Go語(yǔ)言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級(jí)輕量級(jí)的類似線程的東西,但通過(guò)它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語(yǔ)言里,觸發(fā)一個(gè)routine和erlang spawn一樣簡(jiǎn)單。基本上要掌握Go語(yǔ)言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過(guò)請(qǐng)放心,真的非常簡(jiǎn)單。
7. 更多現(xiàn)代的特性
和C比較,Go語(yǔ)言完全就是一門現(xiàn)代化語(yǔ)言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。
看到這里,你可能會(huì)發(fā)現(xiàn),我用了很多輕易,簡(jiǎn)單,快速之類的形容詞來(lái)形容Go語(yǔ)言的特點(diǎn)。我想說(shuō)的是,一點(diǎn)都不夸張,連Go語(yǔ)言的入門學(xué)習(xí)到提高,都比別的語(yǔ)言門檻低太多太多。在大部分人都有C的背景的時(shí)代,對(duì)于Go語(yǔ)言,從入門到能夠上手做項(xiàng)目,最多不過(guò)半個(gè)月。Go語(yǔ)言給人的感覺(jué)就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。
文章名稱:go語(yǔ)言的抽象能力很差 go語(yǔ)言發(fā)展前景 知乎
文章轉(zhuǎn)載:http://www.yijiale78.com/article16/dodesgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、微信小程序、營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站改版、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)