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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...