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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...