PHP 程序员转 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 物联网在线直播抓娃娃企业级项目
欢迎关注、分享、点赞、收藏、在看,我是码农先森。
PHP 程序员转 Go 语言的经历分享的更多相关文章
- 苦逼三流小公司程序员这半年找工作经历(3)——选择offer
本文按照企业规模.性质.规模,分成三类,点评一下遇到的这些公司.也算是为半年找工作经历的一个总结. 1,三流小公司 公司规模类似于笔者跳槽前所在企业,性质有外商独资.合资,当然大多数都是民营企业,规模 ...
- 10个足以让你成为更优秀的程序员的C语言资源
一些人觉得编程无聊,一些人觉得它很好玩.但每个程序员都必须紧跟编程语言的潮流.大多数程序员都是从C开始学习编程的,因为C是用来写操作系统.应用程序最常用的语言. · C编程笔记 这些是华盛顿实验学院C ...
- .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)
过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...
- java程序员笑不死的经历ส้้้้้้้้้
ส้้้้้้้้้้ส้้้้้้้้้้ส้้้้้้้้้ 1.程序猿最烦两件事,第一件事是别人要求他给自己的代码写文档,第二件呢?是别人的程序没有留下文档. 2.宪法顶个球!中国的法律都是.t ...
- 国外程序员整理的Java资源大全分享
Java 几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的 Java 开发资源,推荐给大家. 译文由 Imp ...
- Java程序员转Android开发必读经验分享
小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...
- PHP程序员面试技巧之口试题分享
网络上流传很广的一部分php工程师面试题目,有些phper们认为这些很形式,天下面试题目一大把,不能考核一个人的真实水平,其实细细研究起来,无论怎样,能存在就表明其有存在的价值.下面小编整理了12条P ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- 黑马程序员_ C语言基础(二)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): 1.Hello W ...
- 黑马程序员_ C语言基础(一)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o 只会检测语法是否合理,不会检测函数是 ...
随机推荐
- 基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
简介: 针对VPC FlowLog的五元组和捕获窗口信息,在分析时使用不同时间窗口精度,可能得到不一样的流量特征,本文介绍一种方法将原始采集日志的时间窗口做拆分,之后重新聚合为新的日志做分析,达到更细 ...
- 如何玩转 WebGL 并行计算
简介: 如今在 Web 端使用 WebGL 进行高性能计算已有不少实践,例如在端智能领域中的 tensorflow.js,再比如可视化领域中的 Stardust.js. 作者 | 沧东 来源 | ...
- 开源自建/托管与商业化自研 Trace,如何选择?
简介: 随着微服务架构的兴起,服务端的调用依赖愈加复杂,为了快速定位异常组件与性能瓶颈,接入分布式链路追踪 Trace 已经成为 IT 运维领域的共识.但是,开源自建.开源托管或商业化自研 Trac ...
- [ELK] 生产环境使用 Elasticsearch Docker 镜像的优化选项
[ 配置内核设置 vm.max_map_count 至少为 262144 ] https://www.elastic.co/guide/en/elasticsearch/reference/curre ...
- WPF 警惕使用 Dispatcher.InvokeShutdown 方法退出应用 将不触发 Application.Exit 事件
这是一个比较让人困惑的一个点,我一直都以为 Dispatcher.InvokeShutdown 和 Application.Current.Shutdown 是完全等价的.但是后面发现了其实这两者还是 ...
- 2019-8-31-dotnet-使用-Environment.FailFast-结束程序
title author date CreateTime categories dotnet 使用 Environment.FailFast 结束程序 lindexi 2019-08-31 16:55 ...
- leaflet 河流颜色渐变效果
1.Leaflet-polycolor github地址:https://github.com/Oliv/leaflet-polycolor 插件缺陷:需要把每个折点的颜色都指定才行,一般做不到 2. ...
- Nokia 5GC 产品概览
目录 文章目录 目录 Nokia SR OS Nokia NSP NFM-P Nokia 7750 SR-MG 5G User Plane Forwarding Mobile Gateway Non- ...
- Pageoffice6 实现后台批量生成PDF文档
在实际项目开发中经常会遇到批量后台动态生成PDF文档的需求,目前网上有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案对比". 如果一次 ...
- Unicode 14 标准发布
本文为翻译,原文地址Unicode 博客: 宣布 Unicode 标准, 版本 14.0 Unicode 标准版本 14.0 现已可用,包括核心规范.附件和数据文件.此版本增加了 838 个字符,总共 ...