Go 語言是谷歌 2009 年首次推出并在 2012 年正式發布的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發 Go,是因為過去10多年間軟件開發的難度令人沮喪。Google 對 Go 寄予厚望,其設計是讓軟件充分發揮多核心處理器同步多工的優點,并可解決面向對象程序設計的麻煩。它具有現代的程序語言特色,如垃圾回收,幫助開發者處理瑣碎但重要的內存管理問題。Go 的速度也非???,幾乎和 C 或 C++ 程序一樣快,且能夠快速開發應用程序。
7月30日的在線培訓《Go語言編程》,七牛云存儲聯合創始人兼首席布道師徐立(@飛天急速徐倒立)將帶來 Go 的前世今生與 Go 語言編程的基礎教學,以及七牛云存儲應用 Go 的實踐分享。報名地址:http://huiyi.csdn.net/activity/product/goods_list?project_id=1202
在課程開始前,CSDN 對徐立進行了簡單的采訪。七牛云存儲是用 Go 語言開發實現的,而七牛可以說是全球第一個最早用 Go 吃螃蟹還吃得很香的大玩家。徐立認為 Go 是劃時代的,唯有 Go 能成為史詩之絕唱!Go 不是在顛覆,就是在逆襲!Go 在當下必然大有可為,大有作為,事在人為。
七牛云存儲聯合創始人兼首席布道師 徐立
Hi,大家好!我叫徐立,默默無聞至今做了十年碼農,必須感謝漫長的碼農歲月在侵蝕我花樣年華的同時又栽培了我,如今依然還是一個充滿技術理想情懷的熱血青年!同時,也是一個想用更好的技術創造出一些更加美好體驗的互聯網創業者。當前,我與我的團隊們正在一起努力鑄造 “計算機網絡世界里邊同時也是我們這個星球上最具特色并還可以更加驚艷的數據倉儲及物流系統” ――七牛云存儲,一款為廣大應用開發者一站式解決文件加速上傳和加速下載以及個性化云端數據處理的云服務,目標是讓天下沒有難寫的代碼和難搞的運維,以此可以讓廣大應用開發者過上 “Lazy coding, happy life!” 的幸福美好生活。
我在中學年間開始接觸編程,那時從網上偶爾接點活兒掙點游戲點卡和零花錢,從早前比較偏向實用功能的業務層應用開發(比如軟件和 Web )做到后來比較底層的系統技術(比如分布式計算和存儲),對于互聯網技術日新月異的發展一直保持著敬畏與追隨。在中國互聯網發展演進的這十幾年間,快速經歷了桌面軟件,PC 互聯網,移動互聯網,互聯網硬件,云計算服務這樣一個快速變革的時代,算是一個在互聯網高速成長的時代背景下土生土長出來外表粉嫩內心滄桑的程序員。如果要采訪我和電腦摩擦相愛了至少十年為什么還是這么年輕粉嫩?我會毫不遲疑地告訴你能夠抵擋歲月無情摧殘的唯有激情與才華,還有夢想。由于現階段的工作需要,不少精力都投放在與互聯網前沿技術相關的學習與分享交流,比如最近分享的 Docker 和 Go 的話題。我喜歡把經過實踐檢驗后沉淀下來的美好事物分享給大家,俗稱布道師,當前也是七牛的首席布道師。如果你同樣也是一個有著技術理想情懷的熱血青年,相信我在當下這樣一個技術驅動變革的時代你不是一個人在騷動,如果你已經按耐不住心中的喜悅和熱情,歡迎聯系我(xl@qiniu.com),歡迎來到七牛。七牛,不只是幾頭牛,你會發現更多!
2009 年 11 月 Google 首次對外公開透露 Go 的存在后,就一直有保持關注。但真正開始使用 Go 語言大規模投產是在 2011 年上半年,當時是在和我們團隊的早期成員使用 Go 語言研發分布式對象存儲系統。
與此同時,市面上幾乎沒有發現和我們一樣這么大規模玩 Go 語言的個體或組織??陀^地說,我們這樣做的確很冒險,連 Google 官方當時也沒有這么干,且 Go 語言官方正式版都尚未發布,Google 發布 Go 1.0 是在過了一年之后。記得項目啟動早期,我們對于要不要使用這么一門還在萌芽生長狀態的編程語言來構建線上的大規模系統,內部成員曾各抒己見略有爭議。后來根據我們團隊成員的經驗自我剖析判斷下來,確定這事可行 。原本存儲系統我們做過好幾遍,實際也跑過幾個線上大規模運營的自研存儲系統,且成員資歷都是十幾年的資深研發工程師(只有我個人資歷最小當時還不到十年)。且早前我們在 2006 年嘗試使用 C++ 開發分布式存儲系統,后來又有嘗試使用 Erlang 替代,直到后來我們注意到問世不久的 Go 讓我們是既興奮驚喜又相見恨晚。在被 C++ 實現并發編程框架折騰得夠嗆之后,又遇到天生為并發而生的 Erlang,但實際上又被 Erlang 不能滿足我們預期的高性能計算而堪折;而當遇到 Go 并實際寫了一些程序測試檢驗過之后,發現不但用 Go 編程寫代碼很順溜很開心,關鍵在執行效率和性能上也是非一般地驚艷。一個把 C++ 的性能優勢以及 Erlang 天生的并發特性相融合的產物,且語法語義上要比 C++ 或 Erlang 簡約不止幾個數量級的編程語言,同時還是一幫世界上頂尖大牛的巔峰之作以及 Google 的大力投入支持,還有經過我們這群愛折騰的碼農呆瓜們充分的測試和檢驗得以確認,何樂而不為。常言道實踐出真知,并不是我們盲目冒險決策用 Go,只不過是我們早在幾年之前第一個吃了螃蟹且經實踐檢驗得出了的明確的結論而已。
當初使用 Go 語言編程的時候,市面上除了官方網站公開可查閱的文檔以外,可以參考的資料讀物相當甚少,團隊成員也是現學現用彼此交流互補。早期其實并沒有誕生寫書的想法,只是覺得公司團隊壯大起來以后一定需要有份系統的文檔手冊方便新人上手學習,對我們自己來講這本身就是一個強烈的剛需,沒有任何理由不去執行。然而,后來內容越寫越豐富,微博上等技術圈子里也知道七牛用 Go 且很吃香,就有出版社機構慕名前來找到我們,再后來就有了出書這回事兒。但在當時,我們只有為數不多的幾個人,都是研發重活攬了一堆事情,是寫代碼趕工期還是出書是個很糾結的態度取向問題。在經過團隊成員一致達成共識后,秉著 “技術驅動創新”,“美好的事物就該分享”,“獨樂樂不如眾樂樂”,“一個人走得雖快但一群人才能走得更快更穩” 等一系列等推動人類文明向前發展的各種雞湯洗禮陶醉之后,我們自發地默同接受新增任務并開始組織團隊協作完善《Go語言編程》一書,開放分享技術經驗心得的同時收獲反饋和喜悅,希望有更多的人和組織能夠參與進來用 Go 去譜寫他們的故事和美妙篇章。后來,事實也的確證明:越來越多的個人和組織以及大大小小的互聯網公司都開始使用 Go 語言去承載他們的海量業務,以及聽聞個別開發者終于習得 Go 心經之后實現了他們內心積壓已久的技術理想。海外甚至都開始有長篇大論開始分析探討 “Why is Golang popular in China?”,用 Google 搜索 Golang 熱度最高的至今一直是中國。放到當時去看,這塊大陸是有多么荒蕪;今天再回過頭來看,江山又是如此多嬌。盡管當時白天要忙寫代碼晚上要忙寫書最終倉促出版留下了些許審校上的遺憾,但不管怎樣,那都是一段義無反悔的鏗鏘歲月。
并發
Go 最大的特色就是在語言層面天生支持并發,不需要像其他大多數編程語言那樣需要開發者自行實現或借助第三方類庫實現并發編程,Go 在語言級別支持的并發編程,其邏輯簡化得通俗易懂簡單好上手。
性能
不同于大多數腳本或解釋性的高階編程語言,用 Go 編寫的代碼直接了當編譯成機器碼高效執行。
簡潔
25 個關鍵字即表達你能想到的所有招式,沒有也不需要有任何多余,想干啥事就 go 一下。
跨平臺
x86、AMD64 (x86_64)、ARM;Linux、Windows、Darwin (OSX)、FreeBSD、Android (計劃Go 1.4) 幾乎全平臺支持,真正做到一份源碼,隨處編譯,到處運行。
作為一個 Go 語言的重度用戶來看,當前除了不適合拿來造操作系統以外在操作系統之上應用級的事情都能干。再更具體一點,比如說適用于這樣一些使用場景:
系統應用
以前要用 C/C++ 做的系統應用,現在都可以用 Go 來寫,事半功倍,而且 Go 完美包容 C 源代碼,兩者互相調用還可以混合編譯從而無縫集成。
網絡應用
包含了常見的服務端編程比如 Web 和 API Service,以前用 PHP / Python / Ruby / Java 干的事情現在都可以用 Go 更加簡單清晰的來寫。再比如還可以拿來做一些 Proxy(代理)如網絡穿透軟件等,你懂的。
分布式系統
基于 Go 強大的系統編程加網絡編程,打造各種跨網絡的分布式系統服務,Go 社區有不少和分布式系統相關的開源產物。
各種形態的存儲和數據庫應用
比如 groupcache,influxdb 等。
客戶端應用
包括帶界面的桌面軟件,以及后續可以想像的移動端應用(比如對 Android 的支持)。
云服務(PaaS)
如基于 Go 打造的七牛云存儲(分布式對象存儲系統),比如基于 Go 編寫的 Docker(一款開源的容器虛擬化產物)。
Go 能做的事情,包含但不限于以上羅列的使用場景。
我們主要使用 Go 開發了以下服務和工具:
總的來講,Go 在我們七牛的工程中代碼覆蓋率超過 90% 。還有 10% 不能覆蓋的原因是我們給開發者自助使用的 Web 界面需要用 JavaScript 編程來實現酷炫的前端,以及我們為開發者準備了多達超過 10 種編程語言的 SDK 。
Go 比較熱門的開源項目,不完全羅列舉例:
更多: https://code.google.com/p/go-wiki/wiki/Projects
用 Go 的公司,不完全羅列舉例:
國外:
Google、YouTube、Dropbox、dotCloud、10gen、Apcera、Mozilla、Heroku、Github、Bitbucket、Bitly、CloudFlare、Cloud Foundry、Flipboard、Disqus、SendGrid、Tumblr、Zynga、Soundcloud
更多:https://code.google.com/p/go-wiki/wiki/GoUsers
國內:
七牛云存儲、京東云平臺、盛大云CDN、仙俠道、金山微看、Weico、西山居、美團、豆瓣、小米商城、360
更多:https://github.com/qiniu/go/issues/15
這是一個很有趣的話題,尤其是在今年6月份相繼召開了 APPLE WWDC 2014 和 Google I/O 2014 兩場舉世聞名的互聯網科技盛會后,APPLE 發布了用于 iOS 下一代編程的 Swift 語言,這給關注 Android 的開發者們留下了無限的遐想,盡管后來驚喜并沒有如人們預期一樣出現。作為一個純潔的 Android 程序員,大概不會關注到 Go 將要支持 Android 的消息;作為一個無邪的 Go 程序員,大概也不會去關心 Android 開發和未來。但戲劇性的就是,我們當下就是處于這樣一個各種跨界的大融合時代,沒有什么不可能。
由于 Go 是跨平臺編譯的,早前就有在 ARM 上編譯 Go 并成功運行的嘗試。這個嘗試是直接將用 Go 編寫的源代碼在 ARM 環境下編譯,然后調用 adb shell 裝入 Android 里邊作為 Linux 下的可執行文件運行,但是沒法關聯支持 JNI(Java Native Interface),只能作為一個獨立的進程運行,然后通過 RPC、TCP 等協議方式通信,相當于是一個 App 在運行方式上分成了兩部分,這樣非常不利于 App 的狀態管理,所以此方式無法用 Go 編寫出無縫結合的 Android 應用。
然而,單方面想要用 Go 語言封裝 Android SDK 更是難以行通的:Android 原本用 Java 封裝的 SDK,包含了海量的 API 接口。如果是手工封裝會導致功能上的欠缺,自動封裝會讓 Go 語言變得丑陋不堪。不管用哪種方式,都很難快速實現。若是用 Go 再實現一遍 Android SDK 且還想期望能與 Java 等效,這幾乎是不可能的事情。
但實際上,Android 系統提供了兩種開發包:SDK 和 NDK。用 Go 移植 Android SDK 不通,還可以嘗試走 Android NDK 。
Android NDK(Native Development Kit )是一套開發工具集合,允許開發者用像 C/C++ 語言那樣實現應用程序的一部分。然后可以通過 JNI 實現 Java 代碼與 NDK 動態庫的無縫集成。
Go 內置 Cgo,使得 Go 和 C 之間可以無縫地互相轉換和調用,以及代碼混合編譯。僅此一點,就可以看出至少也為 Go 進行 Android NDK 開發奠定了基礎。當然,Go 可以進行的擴展嘗試可可以更多。
后續的嘗試是另辟蹊徑走 Android NDK,借助其可以將動態庫 .so 和 Java 代碼一起打包成 apk 的機制,實現在 Android 上的無縫加載和運行。所以,問題簡化成只要 Go 能夠編譯出 .so 動態庫再通過 Android NDK 就可以實現開發 Android 應用程序了。
Go 是一門純粹靜態類型的編程語言,編譯出來的二進制是靜態的,如何構建動態庫,這是一道坎。不過 Go 社區的欣欣向榮完全超出你我的想像,比如 Go 社區里邊有人發布了個開源項目叫 Goandroid,一個擴展了 Go 的工具鏈和運行庫來支持將 Go 代碼創建動態庫(*.so)的工具。另外一個開源項目 Mandala 則是在基于 Goandroid 的工具鏈構建了一套完善的用 Go 開發原生 Android 應用的開發框架。
Goandroid 和 Mandala 的出現已經讓 Go 開發原生 Android 應用成為現實。 盡管這兩個框架都是 Go 社區由個人發起的開源項目,Go 官方尚未參與,不過 Go 已經打開了 Android 的潘多拉魔盒。
另外,可以再來扒一扒和技術無關的業界新聞。
2014 年 5 月,一場已經持續 4 年的官司:關于“Google 在 Android 平臺使用 Java 侵犯知識產權”一案,聯邦法院判定 Oracle 獲勝。
2014 年 6 月,APPLE 公司在 WWDC 2014 上發布 Swift 編程語言,用來替代 Objective-C 更高效地編寫 iOS 和 OS X 程序。
2014 年 6 月,Google 公司 Go 語言開發團隊成員 David Crawshaw 提議下一個 Go 版本 ( Go 1.4 ) 支持 Android 平臺。這算是一個關于 Go 支持 Android 而言相當擲地有聲的宣稱。文獻詳見:http://golang.org/s/go14android
就目前而言,Go 支持 Android 后可以干啥。簡單來講,Go 以支持 Android NDK 編程作為切入點,自然是可以在 NDK 這層注入 Go 所能帶來的新鮮活力,比如在異步的并發編程上用 channels 而不再是 callbacks 通訊,比如為游戲引擎提供底層的高性能支撐,比如跟多媒體相關的更豐富地處理。所以,可以想像的到 Go 是可以引領 Android NDK 迎來一片生機盎然的春天。
Go 支持 Android 這事當前看起來是 Go 的一廂情愿,而 Android 對此結合似乎還無動于衷。然而, Android 背負的包袱畢竟過重。Go 躍出的一小步,開啟的必然會是 Android 海闊天空的一大步。
盡管 Go 是一門問世不久顯得很新的編程語言,有很多質疑的聲音認為新生的事物就是不成熟就此望而卻步。但在我個人看來,考量成熟的因素并不完全取決于它所經歷和走過的歲月,而是在于它是否可以被當下這個時代所需要并賦予厚望,以及其心智和能力是否能夠承載并擔當得起這份榮耀與責任。
在我們今天這個時代,是一個包含了 PC 互聯網、移動互聯網、物聯網和云計算 “四世同堂” 的技術多元盛世。在不曾久遠的過去,此前的數十年間,沒有哪一門編程語言能夠經得起此般歲月的幾經摧殘而長生不老。70 年代就開始基業長青的 C,書寫了整個單機時代的輝煌,在硬件更新換代多核一度再翻成指數級更迭又如此瞬息萬變的今天,C 那副認真憔悴的注目神情所表達的靜靜默守和激流勇退才終歸得以明白它曾有過的卓絕。而 Java / Python / PHP / Ruby 此前彼后所縱橫的 PC Web 時代,以當下之勢在此不可逆轉的時代背景下正似歲月如梭般地離我們漸行老去。而當移動互聯網悄然踏至的那一時刻,Android 勢如破竹般地野蠻生長搭救了 Java 一命并在其身上傾覆了所有,換來的卻不過是一份難以割舍又無法言痛的沉重愛情,在被包養換主后的 Java 擦傷了貞潔之后不得不忍辱負重潸然淚行,而 Java 也從此難以走下一座叫作 “節操” 的斷背深山。而和 Java 長得很像極帥的那位 JavaScript,意氣風發一竿子捅到底逆襲了整個 Web 后端,討得所有 Web 前端開發者的擁簇和狂歡,眼看高舉全棧工程大旗就要翻手為云覆手為雨,卻優秀得不懂克己錯失風向與當下這個多核時代格格不入,曾一度與 HTML5 結隊合唱 “輕應用就是未來” 這一出雙簧,不料 Apple Swift 以迅雷不及掩耳之勢以逆襲之道還治其逆襲之身;如今既生 Go,又何生 NodeJS,感慨 Node 君真是生不逢時??傊?,問君能有幾多愁,掐指一算,不知諸君該何去何從……
雖群雄逐鹿,現百家爭鳴,然亂世必有新生。 Go 有如清水出芙蓉,一個曾在溫柔的歲月里深沉熟睡,爾后隨著換季時節的輕聲絮語呼喚蘇醒,然后起身剎那之間不經意驚艷了時光,此后就在此應時之季嬌艷綻放,隨后波光花影,激蕩漣漪,滿是春意盎然,勃勃生機。
時光往回倒流近二十年,那是 1995 年,有幾位計算機泰斗,在白紙上畫了一個圈,開啟了分布式系統編程時代的春天。那時還在貝爾實驗室參與九號計劃(Plan9)的 Robert C. Pike(Plan9 操作系統和 UTF-8 的共同設計者,分布式編程語言 Limbo 作者) 和 Kenneth Lane Thompson(1983年圖靈獎得主,創建了 UNIX 和 Plan9 操作系統,B 語言和 C 語言的共同設計者,UTF-8 的共同設計者),在此段工作經歷中開發了分布式網絡操作系統 Inferno,并在此之上實現了分布式編程語言 Limbo,這是能夠追溯到最早和后來的 Go 在功能特性上比較相似的前身。隨后這兩位泰斗相繼都加入了 Google 公司,在 2007 年 9 月,這兩位 Unix 和 C 還有 UTF-8 的始祖成員,再加上 Javascript V8 引擎和 Java HotSpot 編譯器的作者 Robert Griesemer 一起,這 3 人小組設計了最初的 Go 語言雛形。此后,Go 語言逐漸吸引了一些業界優秀人物比如 80 后程序員 Brad Fitzpatrick(Memcached 作者,OpenID 協定者)的加入,Go 的團隊陣營逐漸壯大。從 2007 年 9 月作為一個 Google 20% 自由時間的一個實驗項目;到 2008 年 5 月發展為 Google 100% 支持的全時項目;再到 2009 年 11 月;Google 首次對外公開透露 Go 的存在;以及 2012 年 3 月,Go 1.0 官方正式版問世;Go 的演變和發展簡直始料未及,從開始到現在都是一如既往地突飛猛進,一發不可收拾。
如果說到 Java 曾經的流行,我們會聯想到 SSH(Struts + Spring + Hibernate);如果提到 Python,也會聯想到 Django;如果提到 Ruby,會聯想到 Ruby on Rails;如果提到 JavaScript,會聯想到 NodeJS;如果提到 PHP,更是一堆長江后浪推前浪前浪死在沙灘上的 Web 開發框架。這些編程語言社區的繁榮昌盛無一例外都和 Web 開發息息相關,且最終沉淀下來的都是各種五花八門各有千秋的眾多 Web 開發框架??梢哉f,我們當前所面臨和 Web 開發的技術選型,從未有過如此的繁榮。繁榮的背后,襯托的是一個大江東流去不復還的 PC Web 時代。
我們再來看看 Go 的社區,是多么地非同尋常和多樣豐盛。我們之前列舉過 Go 社區里邊比較流行熱門的開源項目:比如 Docker,是時下最流行和容器虛擬化相關的技術產物;比如 GroupCache ,是一個類似或代替 Memcached 的分布式內存緩存系統;比如 nsq,是一款處理海量并發的消息隊列系統;再比如 etcd,是一套用于配置同步管理的分布式鍵值存儲系統;以上這些都是和網絡和系統服務以及分布式相關。再比如 Goandroid,是一個開發 Android NDK 應用的工具,是和移動開發相關的…… 總之,有太多創新的開源產物,而 Web 開發框架都不是主要重點。Go 幾乎涵蓋了和編程領域相關的所有點和面,在 Go 1.0 正式版出現后的兩年時間里,基于 Go 可以枚舉全面覆蓋的開源項目超過了 1000 個??芍^是隨風潛入夜,潤物細無聲。
從 Go 誕生的時代背景和團隊陣容以及開源社區的繁榮來講,Go 并不是新生不熟,而是后生可畏,且極有可能成為一統天下的集大成者。
我們再來看一些實際使用場景,比如 Web 開發。大多數編程語言之上的 Web 開發框架都是遵照 MVC 的處理流程去開發 Web 應用:Model 部分封裝數據,Controller 部分處理業務邏輯,View 部分植入變量填充模板頁面。而大部分 Web 框架關于 MVC 的三部分都是在 Server-side 處理,比如對 View 部分的處理都是在 Server-side 通過程序動態對模版變量求值后再拼接組裝成 HTML 頁面輸出給瀏覽器去呈現。而 Go 開發 Web 應用,并不依賴任何 Web 開發框架,用內置的標準庫就可以輕而易舉地實現:比如使用 net/http
標準庫就可以數行代碼構建一個完整的 Web 骨架應用;再比如,通過關鍵字 struct
封裝一個數據結構就可以表達原本 MVC 框架中需要用厚重的 ORM (Object-Relational Mapping) 才能表達的那部分。大道至簡,這可以說是 Go 的哲學。在 View 這一層,Go 也有相應標準庫提供支持,但更推薦的做法,是當下比較流行的 MVVM (Model-View-ViewModel):Server-side 只輸出 JSON,瀏覽器 DOM 作為 View 層,前端 JavaScript 充當 Contoller 部分;這樣,不僅減少了 Server-side 的資源消耗還有中間傳輸的網絡流量,而且前端可以更靈活和更豐富,后端也可以更輕盈和更高效,也更有利于項目的分工和協作。 而 Go 對 JSON 的生成和輸出,有數據測試表明異常高效(在 i7-2600K 處理器上針對所有編程語言包含開發框架總計約100個測試對比中,Go 的性能指標穩居第一,詳見:http://t.cn/RvZHyKI)。以我個人喜好之見,后端用 Go 前端用 AngularJS 可以說是現今流行 MVVM 方式的 Web 開發之絕唱組合。所以,如有疑問 Go 適不適合用來做 Web 開發,我想答案很肯定的:不但可以而且更簡單同時做得更出色甚至還可以做的更多。
我們再來看看當下硬件突飛猛進的多核時代,軟件層面的編程語言都有哪些支持和作為。“人生苦短,我用 Python”,被喊了這么多年的標語,是有多少有追求和品味的程序員都熱衷于 Python。我想大家可以做個實際測驗:比如用 Python 寫一個死循環程序,然后運行起來,過一小段時間看看 CPU 占用率是多少。測試結果會是什么呢,CPU 會占用 100% 嗎?不好意思如果是那應該是單核,且還得是沒有超線程支持的骨灰級 CPU 才行!在當下普遍的雙核(甚至 4 核或 8 核) CPU 上,這個死循環跑滿最多只會占用不超過 50% 的 CPU 資源。好吧,你會說我開多個線程并行來跑這個死循環不就可以吃滿 CPU 了嗎?我想測試結論可以很明確的告訴你,多線程的方式并行跑這個死循環可是連 50% 的 CPU 都吃不到,不信你可以試試,呵呵。無需我解釋為什么,大家可以自行 Google 搜索看看 GIL (Global Interpreter Lock) 機理。也不是我特別拿 Python 舉例,PHP / Ruby / NodeJS 的程序員們也可以來做做同樣的測試,呵呵。總之,一個簡單得不能再簡單的死循環,程序上再怎么優化,跑起來都吃不滿 CPU,你說我們都是這么有品味的程序員,到底都是在追求些什么呢?這些 PC Web 時代下的腳本語言或者字節碼解釋型的語言,幾乎都由于線程安全問題而在語言級的并發機制上裹足不前。盡管 Ruby 實現了很華麗的纖程,NodeJS 實現了很光線的非阻塞 IO,但始終逃離不了單線程簡單可依賴原則抑或多線程效率提升但伴隨著各種問題困擾從而不得不折中取舍的桎梏。所以,大部分時候,語言層面沒有根本性地解決并發問題,轉而使用傳統的多進程這一外援策略去解決并發需求以及變相地迎合這個多核時代。然而,硬件很快,軟件很慢,摩爾定律在硬件行業的應驗帶給傳統軟件行業的紅利已經走到了盡頭。
我們再來看看 Go 在當下這個多核時代的作為。不得不說,Go 最大的特色就是在語言層面天然支持并發,在 Go 程序里邊,你可以通過在一個函數調用前使用關鍵字 go 即可讓該函數 func 運行成為一個獨立的 goroutine,goroutine 可以理解成一種比線程更加輕盈更省開銷的輕量級協程。Go 的并發模型就是通過系統的線程來多路派遣這些獨立函數的執行,使得每個用關鍵字 go 執行調用的函數可以運行成為一個單位協程。當?個協程阻塞的時候,調度器就會自動把其他協程安排到另外的線程中去執行,從而實現程序的無等待并行化運行。且調度的開銷非常小,單核 CPU 調度的規模不下于每秒百萬次,這使得我們能夠創建大量的 goroutines,從而可以很輕松地編寫并發程序達到我們想要的目的。
同時,Go 在語言層面還引入了 channel 這一內置類型來實現并發執行體 goroutines 之間的消息傳遞,通信靠 channels 來傳遞消息。Go 遵循 CSP(Communicating sequential processes) 并發模型,通過通信來共享內存而不是用共享內存的方式進行通信。Go 的并發里邊沒有共享內存,更沒有內存鎖,這一切都有利于進行更為安全和簡單的并行程序編寫。
終有一日,你會感慨:“人生苦短,說 Go 就 Go”!
時代在快速躍遷,尤其是現在言必及多核和并發,我們所看到的那些 PC Web 時代下的腳本語言所堆砌的華麗不過是一些延續性追隨,而且這種延續性的步伐會越來越沉重,最終還是苦不堪言。唯有 Go,在語言層面對并發和多核乃是純天然的支持,原本就是一場應時而生順時而為的土生土長,Go 所代表的是一種破壞性創新。而我們所經歷的這個時代,正是處于一個時代被時代所顛覆的時代,在這樣一個轉折點,所有的延續性創新不過是杯水車薪,唯有破壞性創新,與時代共舞,才會產生革命性的顛覆。
我們還可以回顧下之前提到 Go 對 Android 移動端非侵入式的支持,幾乎就是一場悄無聲息的逆襲。
Go 很年輕,卻已健壯成年。Go 被設計得簡潔高效,Go 在語法層面有著清晰簡潔卻又高效的表達能力,是一個讓開發者編寫程序很開心同時又更有生產力的系統編程語言。Go 在語言層面有著良好的并發支持,使得用 Go 語言編寫多核和分布式網絡的應用程序簡單容易許多。Go 內置新穎靈活的類型系統還可以很方便地編寫和構建模塊化程序。Go 是一門需要編譯源碼才能運行應用的純靜態強類型語言,這點保證的了程序的安全性和執行效率,且 Go 從程序源代碼編譯成機器碼非???。Go 的跨平臺支持,使得用 Go 語言編寫的程序可以在現今大多數操作系統上編譯運行。Go 還自帶垃圾回收的內存管理機制,并且支持強大的運行時反射。Go 是動靜相宜的,在性能和安全性方面保留了靜態語言的優點,在編程寫法上,卻有著動態語言的靈活與優雅。
Go 是劃時代的,唯有 Go 能成為史詩之絕唱!Go 不是在顛覆,就是在逆襲!
Go語言編程。歡迎感興趣的朋友參與進來交流,謝謝大家!
7月30日的在線培訓《Go語言編程》,七牛云存儲聯合創始人兼首席布道師徐立(@飛天急速徐倒立)將帶來 Go 的前世今生與 Go 語言編程的基礎教學,以及七牛云存儲應用 Go 的實踐分享。報名地址:http://huiyi.csdn.net/activity/product/goods_list?project_id=1202
免費訂閱“CSDN云計算”微信公眾號,實時掌握第一手云中消息!
CSDN作為國內最專業的云計算服務平臺,提供云計算、大數據、虛擬化、數據中心、OpenStack、CloudStack、Hadoop、Spark、機器學習、智能算法等相關云計算觀點,云計算技術,云計算平臺,云計算實踐,云計算產業資訊等服務。