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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...