PHP 程式員轉 Go 語言的經歷分享

来源:https://www.cnblogs.com/yxhblogs/p/18244944
-Advertisement-
Play Games

大家好,我是碼農先森。 之前有朋友讓我分享從 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 語言的正確道路。

推薦


歡迎關註、分享、點贊、收藏、在看,我是碼農先森。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本框架JSON元素組成和分析,JsonElement分三大類型JsonArray,JsonObject,JsonString。 JsonArray:數組和Collection子類,指定數組的話,使用ArrayList來add元素,遍歷ArrayList再使用Array.newInstance生成數組 ...
  • 最近項目中使用了PowerJob做任務調度模塊,感覺這個框架真香,今天我們就來深入瞭解一下新一代的定時任務框架——PowerJob! 簡介 PowerJob是基於java開發的企業級的分散式任務調度平臺,與xxl-job一樣,基於web頁面實現任務調度配置與記錄,使用簡單,上手快速,其主要功能特性如 ...
  • 百度的,後面再補一個Linux文檔操作手冊,是不是很大膽? 準備工作 1、首先得有兩個軟體Xftp(用來上傳文件到)和XShell(連接伺服器執行命令) 2、Linux上有JDK(怎麼安裝可以轉到Linux安裝JDK流程) 3、項目的JAR包 項目jar包 導jar <build> <plugins ...
  • 本文介紹基於Python中GDAL模塊,實現基於一景柵格影像,對另一景柵格影像的像元數值加以疊加提取的方法。 本文期望實現的需求為:現有一景表示6種不同植被類型的.tif格式柵格數據,以及另一景與前述柵格數據同區域的、表示植被參數的.tif格式柵格數據;我們希望基於前者中的植被類型數據,分別提取6種 ...
  • 首發地址: https://mp.weixin.qq.com/s/w6v3RhqN0hJlWYlqTzGCxA 前言 之前在PC微信逆向) 定位微信瀏覽器打開鏈接的call提過要寫一個保存公眾號歷史文章的工具。這篇文章先寫一個將文章保存成pdf和html的工具,後面再補充一個採集歷史的工具,搭配使用 ...
  • ​記錄下FFmpeg的學習筆記目錄,完整的FFmpeg開發實戰內容詳見《FFmpeg開發實戰:從零基礎到短視頻上線》一書。 下麵是補充的FFmpeg開發筆記內容目錄,主要是對《FFmpeg開發實戰:從零基礎到短視頻上線》一書的進階增補。 第一章 Linux環境編譯FFmpeg FFmpeg開發筆記( ...
  • 目錄條款32:確定你的public繼承塑模出is-a關係(Make sure public inheritance models “is-a”)public繼承的含義設計良好的繼承關係is-a的例外條款33:避免遮掩繼承而來的名稱(Avoid hiding inherited names)作用域的隱 ...
  • Python中有三種比較常見的方法類型,如類方法和靜態方法,實例方法,他們是面向對象編程中重要的概念。 1.類方法 類方法是通過使用裝飾器@classmethod來定義的,他的第一個參數是cls,指向類本身,允許我們在方法中操作類的屬性或調用其他類方法。 類方法的使用:類方法可以通過類名和實例對象來 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...