大家好,我是碼農先森。 之前有朋友讓我分享從 PHP 轉 Go 的經歷,這次它來了。我主要從模仿、進階、應用這三個方面來描述轉 Go 的經歷及心得。模仿是良好的開端,進階是艱難的成長,應用是認知的提升。希望我的經歷對大家能有所啟發。 模仿 著名藝術家畢加索說過「模仿是人類一切學習的開端,然後才是創新 ...
大家好,我是碼農先森。
之前有朋友讓我分享從 PHP 轉 Go 的經歷,這次它來了。我主要從模仿、進階、應用這三個方面來描述轉 Go 的經歷及心得。模仿是良好的開端,進階是艱難的成長,應用是認知的提升。希望我的經歷對大家能有所啟發。
模仿
著名藝術家畢加索說過「模仿是人類一切學習的開端,然後才是創新,最後是你的自主」。在我國軍事的發展上有一個典型的例子,第一艘新航母模仿的就是遼寧號航母,這促使我們更加容易理解:先模仿,再創新,後超越的路子。大到國家尚且如此,那麼小到個人更應該充分認識到「模仿」的價值。模仿是人類固有的天性和本能,大家小時候經常會模仿大人模樣,比如學大人的說話口氣、做各種動作等等。
在我學習 Go 語言的過程中,也正是利用了「模仿」這種技巧,比如把 Go 中的結構體 Struct 對標成 PHP 中的 Class、把 Go 中的介面 Interface{} 對標成 PHP 中的抽象類 Abstract Class、把 Go 中的結構體指針 Pointer 對標成 PHP 中的類對象 This、把 Go 中的 Gin 框架對標成 PHP 中的 ThinkPHP 框架等等。我剛開始在熟悉了 Go 的語法後,力爭都要能在 PHP 中找到相應的影子。然後使用 PHP 的框架 ThinkPHP 實現一個 CURD 的案例,再把這些功能利用 Go 的框架 Gin 實現一遍。語言絕大多數的區別都只是語法糖的不同,編程思想都類似,萬變不離其宗。都說萬事開頭難,利用這個模仿的技巧實現這個案例之後,算是開了個好頭,讓自己有了簡單的成就感,看到了相應的學習成果。最重要的收穫是邁出了學習 Go 語言的第一步,剋服了畏難思想。
進階
模仿式學習只是掌握了錶面知識,就好似練習詠春拳只學到招式,沒有學到內功。要想修煉好內功,還得理解語言的本質區別。PHP 是解釋型、動態類型語言,代碼的運行是基於 Zend VM 虛擬機引擎,在 Web 領域應用廣泛。Go 是編譯型、靜態類型語言,直接編譯成二進位可執行文件便可運行,在高併發、雲計算等領域應用廣泛。PHP 在 Web 領域有著天然的優勢生態完善,Go 的高併發性能突出,兩者剛好互補,這也是我學習 Go 語言的主要原因。
讓我真正感受到 Go 語言的與眾不同,是在參與了一個物聯網項目「基於IOT物聯網線上直播抓娃娃」(文末附上了項目代碼地址)的開發之後,這個項目開發了實時通信、視頻推流、設備通信、用戶分發等技術,這些技術都是基於 Go 語言的 goroutine、websocket、mqtt、channel、select 等特性實現的。實踐出真知,真正的進階是要在參與實戰項目之後才能得到提升。當然我是有幸參與了這類項目,但大部分人卻可能連參與實戰項目的機會都沒有,那應該怎麼進階呢?我的回答是「交流」,多與高手交流、向高手學習、聽高手講解。俗話說的好「聽君一席話,勝讀十年書」便是如此。和高手交流對我們的學習和成長很有益處,不僅有助於瞭解技術方向、關鍵的技術點,也可以通過觀察和學習高手的技術思維、解決問題的方式。最後在進階的路上還是得多尋找一些實踐的機會,畢竟實踐是檢驗學習效果的唯一標準。
應用
好鋼要用在刀刃上,要充分瞭解 PHP 語言與 Go 語言的差異,才能在各自的場景中利用好 PHP 和 Go 的優勢,避免出現殺雞濫用宰牛刀、鬍子眉毛一把抓的現象。在我之前的公司就有過這樣的情況「立項前:高併發,日活千萬,用xxx語言;上線後:停掉吧,一個用戶都沒有」,相信大家也遇到過類似的情況,最終項目的結果都是不了了之。
因此在實際的項目開發中,選擇合適的技術是一項很重要的原則。比如在項目的初期利用 PHP 語言短平快的特性,快速的把項目推向市場進行試錯,及時收集用戶的反饋,推進項目的持續優化,當用戶量達到預期的規劃時,適時對部分訪問頻繁的介面,採用 Go 語言進行重構,以承載後期的訪問量。技術選項和架構設計是隨著業務的發展而進行演進的,不可能一蹴而就,有了這個認識後,才能發揮出 PHP 和 Go 各自的價值。
結語
其實想要更深入的學習好 Go 語言,還得花時間去鞏固操作系統、網路通信等基礎知識。有些普通 PHPer 可能連 多進程、協程、socket、epoll、tcp/ip 等概念都搞不清楚,只會用簡單的框架套用模版,那何談能把 Go 語言學好?這也就是有些人轉 Go 語言失敗的原因。真正學好 Go 語言並不容易,我從剛開始模仿式的學習,期間也踩過很多坑,限於篇幅原因沒有展開,再到後來的進階實踐也是遇到各種編譯錯誤,最後從應用層面來認知到學習 Go 語言的價值。我的學習經歷並不適用於每個人,僅供大家參考,希望大家都能找到自己學習 Go 語言的正確道路。
推薦
- PHP轉Go系列 | 變數常量的使用姿勢
- PHP轉Go系列 | 字元串的使用姿勢
- PHP轉Go系列 | 數組切片的使用姿勢
- PHP轉Go系列 | 條件迴圈的使用姿勢
- PHP轉Go系列 | 類結構體的使用姿勢
- PHP轉Go系列 | ThinkPHP與Gin的使用姿勢
- 基於 GoLang 實現的 IOT 物聯網線上直播抓娃娃企業級項目
歡迎關註、分享、點贊、收藏、在看,我是碼農先森。