從1月19號到今天已經12天沒有更新文章了,這個春節顯得格外特殊,突如其來的疫情打亂了咱們的生活和工做。html
特殊時期咱們能夠積極轉發有效信息、減小外出、避免出入擁擠場所、勸導家人朋友重視疫情保護自身、多陪伴父母家人共克時艱。前端
北京窗外的陽光彷佛還不錯,很懷念以前自由自在的感受,由衷但願早一天打敗疫情,你們摘掉口罩走上街頭,露出燦爛臉龐,像往日同樣擁抱自由,擁抱陽光。程序員
言歸正傳,以前計劃寫的TCP/IP協議棧系列文章再次跳票,可是大白準備雙線做戰再開一個Go語言專題,後續會推出系列文章,慢慢來你們也別急, Go is the way to go!golang
說實話,大白水平有限寫個21天玩轉系列確實搞不定,要寫個210天玩轉我以爲比較有戲。所謂兵馬未動糧草先行,圖爲大白以前買的關於Go語言的書,還比較新:web
今天算是第一篇初識Go語言,經過本文你將瞭解到如下內容:算法
作一件事以前先思考爲何要去作這件事情以及作這件事情的收益是什麼,是很重要的。shell
固然在工做中咱們大頭兵不少時候都沒有太多話語權而且信息不對稱,以至於整個事情的穿透力不足,讓人以爲參與感很低,甚至不少時候都是在試錯,不停地試錯才讓人驚慌。數據庫
學習一門新技能也是如此,接受新技藝是爲了提升工做效率,而且爲後續的維護和優化少埋雷少挖坑,清清爽爽地平衡工做和生活。編程
因此面對一門新的語言,咱們有理由且必需要去問爲何,這樣才更有動力。後端
咱們從幾個方面來看Go的應用領域和受追捧程度,這樣更加有說服力。
Go是Google開發的一種靜態強類型、編譯型、併發型,並具備垃圾回收功能的編程語言。
Go語言是谷歌推出來的,團隊實力毋庸置疑,爲了展現Go的威力,谷歌在自家的諸多產品中都使用了Go,儼然是谷歌的親兒子的感受,在2016年Go被TIOBE 選爲2016 年最佳語言。
Go內置了豐富的庫,在語言層面支持併發、簡單易上手、代碼規範化、開發效率高、性能強悍、擁有本身的生態系統、不少經常使用工具軟件的客戶端都對Go有支持、靜態編譯型語言部署簡單、完備的工具鏈等。
特別地,中國在Go語言的推廣和應用過程扮演了很是重要的角色,Go的主要做者Rob Pike對Go中國社區給予很是高的評價:
Go is huge in China.
在互聯網的雲時代咱們耳熟能詳的Docker、Kubernetes正是基於Go語言構建的,所以Go語言是雲計算和雲存儲的重要組成部分。
區塊鏈底層系統的主流開發語言主要包括C++/Python/Go/Rust等,早期的一些區塊鏈項目通常基於C++開發,隨着Go的發展有不少項目基於Go展開,最近的Rust也有一席之地。
Go因爲其開發效率和性能、簡單易用的設計哲學、快速實現的便利和優點在區塊鏈開發中備受關注,區塊鏈2.0的以太坊,區塊鏈3.0的超級帳本都是使用go語言實現的,如圖爲各個語言以及其完成的區塊鏈項目的簡單概況:
國內先行者是七牛雲,隨着Go語言的發展國內幾乎全部叫得上名字的公司都在使用Go進行新業務開發和老業務重構,國內外部分業務案例:
以百度爲例:百度的七層流量轉發平臺BFE(統一接入前端)使用go開發,目前已經接入了百度的大部分業務流量,單日轉發量1w億次、峯值QPS1000w,具備研發效率高、系統安全性好等特色,目前已經開源。
etcd 可靠的分佈式kv數據庫 目前Star29k+
go-cache 單機緩存框架 目前Star3.4k
go-leveldb 使用go實現的leveldb數據庫 目前Star3.5k
ledisdb 基於LevelDB的類Redis數據庫 目前Start3.2k
其中豌豆莢的Codis做爲國內先於官方推出的Redis集羣解決方案也是基於Go開發的:
還有不少優秀的開源項目,能夠參考知乎上的一個問題來查看相關開源項目
有哪些值得學習的 Go 語言開源項目? www.zhihu.com/question/20…
咱們從Go的創造過程、版本更迭、社區生態等角度來看Go語言,相信這樣咱們才能更深刻了解Go的設計思想和使用前景。
谷歌的Rob Pike羅伯.派克,Ken Thompson肯.湯普森和Robert Griesemer羅伯特.格利茨默在2007年開始設計Go語言。
網上說Go設計的源動力是對於一場關於C++11報告的思考,面對C++11複雜的特性大牛們表示出了失望,因而想設計一門新的語言來適應網絡和多核時代,讓開發更快捷更有趣。
如圖從左到右依次爲:Robert Griesemer羅伯特.格利茨默、Rob Pike羅伯.派克、Ken Thompson肯.湯普森
Rob Pike來自加拿大出生於1956年,畢業於多倫多大學和加州理學院,曾經爲貝爾實驗室Unix小組成員,期間參與過plan九、Inferno、編程語言Limbo等項目的開發,他與肯·湯普遜共同開發了UTF-8,目前爲google的工程師,參與編程語言Go與Sawzall的研發工做。
Rob Pike除了是個全能程序員,仍是一位業餘天文學家,發明過珈瑪射線射電望遠鏡,同時他還參加了1980年的奧運會射箭項目並奪得銀牌,他在量子計算和通信領域也作過深刻研究,有多部計算機著做。
筆者在陳皓的博客找到了一些描述,是陳皓翻譯的Rob Pike的演講,摘錄(並少許修改)關鍵部分以下(以Rob Pike的第一人稱描述):
2007年9月我在谷歌作一個龐大的C++項目,可是我負責的這部分在集羣上要編譯45分鐘,同時有個消息說在C++社區的谷歌員工將開一場講座介紹C++11,在那場持續一小時的講座中,我據說了諸如計劃中的35個新特性,有些十分微妙並難以理解,有些十分瘋狂,那時候我問了本身一個問題: C++社區真的以爲C++錯在沒有足夠多的特性嗎?
我嘗試將Newsqueak語言中的一些點子加入到C++中可是失敗了,我實在難以將一組併發操做融入到C++的控制流程中去—,當真融進去的話,它們將變得十分醜陋臃腫,從而難以看到優越性,因此我放棄了這個想法。
可是C++11的講座使我再次思考,將語言和今日的硬件綁在一塊兒彷佛有點目光短淺而且不明智,由於硬件過幾年就有大變。
C++11講座結束以後咱們回到辦公室,我面對Robert,開始問一些尖銳的問題。以後咱們拉攏了Ken,並決定作些什麼。咱們不再想寫C++了,而且咱們想讓併發拿來就用,同時咱們也想解決大系統編程的問題。咱們在白板上寫下一組迫切須要的東西,而且劃出大致的輪廓,忽略了語法細節和語義。
文字較多,畫個圖來講明一下這個過程:
從中能夠看到:大牛們對C++已經有足夠的實踐和思想認識,也深知C++的優點和不足,面對軟硬件的發展大牛們想在C++中增長一些本身想要的特性,可是那麼作讓C++更加難用,在深入理解本身所想要的特性以後決定另起爐竈。
一點思考:在平常工做中也是如此,咱們一味地批評一些軟件和工具是很不理智的,只有深度使用才更有發言權,編程語言和工具類庫都沒有銀彈,只有更合適更好用,業務規模決定架構,因此不少大公司在深入理解本身業務的基礎上會作不少新的東西去知足本身的需求。
Go語言的吉祥物gopher是一種生活在加拿大的小動物,它的中文名叫作囊地鼠,他們最大的特色就是挖洞速度特別快。
Go語言被稱爲是21世紀的C語言,從Go的語法和使用上去看確實繼承了與C語言類似的語法表達、流程控制、基礎數據結構等不少思想和技巧,發揚了C語言簡單直接的編程哲學。
可是Go語言也並不只僅是C語言的增強版,Go博多家所長進行融合創新推廣,在柴樹杉所著的《Go語言高級編程》中給出了Go的基因圖譜,咱們一塊兒來看下:
Go語言的併發特性是由貝爾實驗室的Hoare(這是快排的發明者哦)於1978年發佈的CSP理論演化而來,CSP併發模型在Squeak/NewSqueak和Alef等編程語言中逐步完善並走向實際應用,最終這些設計經驗被消化並吸取到了Go語言中。
中間一支主要包含了Go語言中面向對象和包特性的演化歷程,包和接口以及面向對象等特性則繼承自Pascal語言,包的概念、導入和聲明等語法來自於Modula-2編程語言,面向對象特性的聲明語法等來自於Oberon編程語言,最終Go語言演化出了本身特有的面向對象模型的隱式接口等諸多特性。
Go語言是對C語言最完全的一次揚棄和致敬,不只僅是語法和C語言有着不少差別,最重要的是捨棄了C語言中靈活可是危險的指針運算。C語言中少便是多、簡單直接的暴力編程哲學則被Go發揚光大。
從2007年末大牛們抽出20%時間創造的Go語言通過近12年的發展,Go語言做爲後起之秀,已經發布了10多個重要的版本:
2009年11月10號谷歌開源Go語言,以下是Go團隊的主要成員的開源通告,筆者簡單翻譯一下:
咱們認爲編程應該快速、高效,最重要的是有趣。這就是爲何咱們對開源一種叫作Go新語言而感到興奮。
Go將使用動態語言(如Python)的開發速度與編譯語言(如C或C++)的性能和安全性結合起來。甚至大型二進制文件也能在幾秒鐘內編譯完成,編譯後的代碼運行速度接近C。同時Go是一種支持多處理的系統編程語言,它是面向對象設計的一種全新的輕量級語言,加上一些很酷的特性,如真正的閉包和反射。
By Robert Griesemer, Rob Pike, Ken Thompson, Ian Taylor, Russ Cox, Jini Kim and Adam Langley - The Go Team
2019年11月8日Go Team發佈郵件慶祝Go開源10週年,同時Go吉祥物Gopher的做者Renee French創做了新做:
前文說起了Go語言的生態圈包括雲計算雲存儲、區塊鏈、web服務開發等諸多領域。在國內外不少公司Go都有拳頭產品,尤爲在國內有不少追捧者和推進者,巨大的應用場景和海量的用戶羣體,讓咱們看到了Go的潛力。
一門新語言不該該是咱們學習的負擔而應該咱們解決問題的幫手、有好的工具才能多快好省地建設社會主義嘛!
大白是畢業入坑嵌入式寫C語言出道的,後來到互聯網公司作後端開發寫C++,最近一年寫Python遠多於C++,因此對於語言選擇而言也是有必定感觸的。
C++和C語言對比來講,C++因爲增長了面向對象因此比C複雜,可是隨着C++更多版本的推出愈來愈多的複雜特性確實讓人以爲有些心力不足,相反C語言的語法特性並不複雜,即便這些基礎的東西進行多種組合一樣能夠完成複雜軟件開發,好比Linux、Redis等。
我的的一些感覺而言新特性是爲了解決問題,若是工具自己的複雜性超過了問題的複雜性,那麼可能不是個好的趨勢,C++不少時候做爲帶類的C配合STL使用已經能夠解決不少問題,可是STL是通用的數據結構和算法庫,並無像Python一些的應用庫,這樣就致使了幾乎每一家公司都會有一套本身的C++基礎庫,它們當然可讓咱們很快解決問題,可是不具有通用性且經驗可能沒法很好地遷移,這也是個很大的問題。
固然對於語言的選擇以及發展是仁者見仁智者見智的問題,筆者不想去撕PHP是世界上最好的語言這類問題,如人飲水冷暖自知就能夠啦。
篇幅緣由本文就只提Go語言的幾個主要特性:
這多是Go中最吸引人的特性了,Go語言引入了goroutine概念,它使得併發編程變得很是簡單,Go實現CSP通訊順序進程模型來做爲協程間的通訊方式,使用消息傳遞來共享內存而不是使用共享內存來通訊,Go語言讓併發編程變得更加輕盈和安全。只須要簡單的使用關鍵字go,就可讓函數以協程方式執行,更加輕盈更省資源,讓併發真正飛入尋常百姓家。
在C++中不少服務端程序都是同步方式,所以機器使用率並不理想,異步編程方式存在必定難度,還有一些相似於騰訊libco方式的併發模式,不過都不是語言層面的併發支持。
C和C++須要使用者管理內存,因爲沒有GC機制的限制,C/C++程序運行速度很快,可是這對開發者的要求也很是高,一不當心就可能會致使內存泄露。
Go語言做爲一門新生語言,沒有迴避內存管理問題而是引入了GC機制,使用者不需考慮內存的回收而由語言提供垃圾回收器來回收內存,可是可能使程序運行效率下降。
Go語言沒有複雜的面向對象概念,直接使用最基本的類型組合功能。Go使用非侵入型接口的概念來實現C++中的一些面向對象機制,另闢蹊徑使用不一樣的方法實現了相同的效果。
Go語言重用了不少的C語言模塊,因爲Go和C的這種自然的血緣關係,容許開發者混合編寫C代碼,CGO工具很好地支持了C語言函數的調用,這是一個很是好的支持。
Go語言有很是豐富的包統稱爲標準庫,它就像開發人員的百寶箱,提供了包含I/O操做、文本處理、正則、數據庫、網絡和分佈式系統等經常使用業務包,讓開發者能夠快速解決問題,這也是Go能夠迅速推廣的重要緣由,彷彿讓Go擁有Python的開發效率但又不失強悍性能。