Golang全接觸

滿打滿算, 從好友推薦Golang至發文時, 使用Golang已經有1年多了. 這種時間對於C/C++ Java這些老者來講, 簡直是菜鳥級別的經驗html

但做爲新生代語言的特色就是實戰. Golang這一年裏, 已經爲項目提供了穩定的服務器和強大的擴展能力, 與客戶端的Unity3D裏的C#同樣, 都是強大, 極致開發效率表明的優秀開發語言.程序員

用途篇

Golang到底拿來作啥? 我須要麼?編程

高效(性能,開發)的服務器語言. 包括Web, 遊戲, Appjson

編寫桌面級UI暫不是很適合設計模式

我須要把如今的C++, Python, Erlang等服務器改爲Golang麼?api

性能有瓶頸, 開發效率低, 有錢有時間的話, 徹底能夠數組

 

評價篇

聽過太多的人對Golang的評價, 大概分爲這麼幾類:服務器

C/C++性能黨

此類黨員對任何事物都追求極致的 性能. 還好Golang是直接生成native code, 不然會被批的體無完膚. 可是因爲Golang底層爲併發和開發效率而作出的一些系統, 相似於GC, 調度器和分配器等, 會在語言層上損失不少性能. 所以C/C++黨仍是有理由批Golang性能低下架構

Erlang併發黨

做爲電信級元老, Erlang的模型和架構當之無愧, OTP擴展性超級強. 完美的Actor模型也讓邏輯編寫比OO更加直觀併發

CSP與Actor區別僅僅只是在channel的歸屬範圍而已, 但這點細微差異卻對兩種語言的開發變的迥然不一樣

Golang在併發模型上選擇了CSP, 就是考慮把架構的設計留給使用者. 像C#同樣創建一個類庫的世界, 而不是MFC同樣的框架世界. 讓開發更自由

Erlang的Actor也沒錯. 讓開發更直觀, 讓崩潰提早來到, 儘快處理

Rust黨

Rust在發文時已經發布了1.0. 這讓R粉興奮的穿梭於各大技術論壇和討論羣

但Rust的理念在我看來有點偏執了, 必定要把各類錯誤在編譯期暴露出來, 因此造出了不少不須要的類型和概念, 連語言都比C語言更符號話

大白話說來, 有點編程經驗的人看到JavaScript徹底看得懂, 但看Rust卻像天書

對比同時期的TypeScript, Dart, Swift. Rust就是有點那麼獨闢蹊徑

該黨黨員常常性的用各類特性對比Golang, 追求單特性的優秀.

但其實, Golang自己是一門完整哲學. 不少語言特性互相之間有關聯. 有設計不當的地方, 固然更多的是完總體系. 不求和其餘語言比

只追求解決問題的速度

自定義黨

雲風看過Golang後, 由於該語言自己就是強化版的C, 所以頗受雲風喜歡. 但在一堆評價後, 雲風仍是果斷選擇了C+lua的組合寫出的Skynet

雖然不知道緣由, 但我猜的話, 畢竟是對語言自己的可控性還不那麼看好

同時, 咱們發現Skynet使用的是Actor模型, 也發現大神級的程序員就是有先見.

轉載請註明: 戰魂小築http://www.cppblog.com/sunicdavy

感觸篇

設計

踏入Golang, 就不要嘗試設計模式

傳統的OO在這裏是非法的, 嘗試模擬只是一種搞笑

把OO在Golang裏換成複合+接口

對實現者來講, 把各類結構都複合起來, 對外暴露出一個或多個接口, 接口就好像使用者在實現模型上打出的不少洞

別怕全局函數, 包(Package)能夠控制全局函數使用範圍.

不必什麼都用interface對外封裝, struct也是一種良好的封裝方法

Golang無繼承, 所以無需類派生圖. 沒有派生這種點對點的依賴, 所以不會在大量類關係到來時, 造成繁雜不可變化的樹形結構

 

容器

用了很長時間map, 才發現Golang把map內建爲語言特性時, 已經去掉了外置型map的api特性. 一切的訪問和獲取都是按照語言特性來作的, 原子化

數組能夠理解爲底層對象, 你平時用的都是切片, 不是數組, 切片就是指針, 指向數組. 切片是輕量的, 即使值拷貝也是低損耗的

 

內存

Golang在實際運行中, 你會發現內存可能會瘋漲. 但跑上一段時間後, 就保持穩定. 這和Golang的內存分配, 垃圾回收有必定的關係

現代的編程語言的內存管理不會很粗暴的直接從OS那邊分配不少內存. 而是按需的不斷分配成塊的內存.

對於非海量級應用, Golang自己的內存模型徹底能夠撐得下來. 無需像C++同樣, 每一個工程必作內存池和線程池

Channel

Channel和鎖誰輕量? 一句話告訴你: Channel自己用鎖實現的. 所以在無可奈何時, 仍是儘可能減小使用Channel, 但Channel屬於語言層支持, 適度使用, 能夠改善代碼可讀寫

轉載請註明: 戰魂小築http://www.cppblog.com/sunicdavy

錯誤

以爲Golang不停的處理err? 那是由於平時在其餘語言根本沒處理過錯誤, 要否則就是根部一次性try過全部的異常, 這是一種危險的行爲

panic能夠被捕獲, 所以編寫服務器時, 能夠作到不掛

 

危險的interface{}

這東西就跟C/C++裏的void*同樣的危險, nil被interface{}包裹後不會等於nil相等, 但print出來確實是nil

模板估計能夠解決容器內帶interface{}的問題. 但新東西引入, 估計又會讓如今的哲學一些凌亂

 

轉載請註明: 戰魂小築http://www.cppblog.com/sunicdavy

 

初學Tips

語言學習按照官網的教學走, 跑完基本就會了

下載一個LiteIDE, 配合Golang的Runtime,基本開環境就有了

Golang的類庫設計方式和C#/C++都不一樣, 若是有Python經驗的會感受毫無違和感

有一萬個理由造輪子都請住手, 類庫裏有你要的東西

寫大工程請搜索: Golang項目目錄結構組織

Golang語言自己本人沒有發現bug, 即使有也早就被大神們捉住了. 惟一的一個感受貌似bug的, 常常是結構體成員首字母小寫, 可是json又沒法序列化出來…

慎用cgo. 官方已經聲明將來對cgo不提供完整兼容性. 任何一門語言在早期都須要對C作出支持, 但後期完善後的不兼容都是常態

參考:http://www.cppblog.com/sunicdavy/archive/2015/06/04/210823.html

相關文章
相關標籤/搜索