在多年 PHP 开发后,我学习了 6 个月的 Go 语言

PHP

我 16 岁时发现了 PHP。这是我用于实际编程的第一语言。当时,我使用它来评估用户提交的表单并发送电子邮件,其中大多数是 “与我们联系” 表单。多年来,我始终把 PHP 作为我的强项,并确保自己不断扩大自己的 PHP 知识和技能。我认为我虽然不是 PHP 的大佬,但这是我最了解的语言。过去,我有机会在中小型项目中使用 Ruby,JAVA,Python 和 NodeJS。这些经验使我得以了解 PHP 与其他编程语言的比较方式,如何更好地利用其优势并防范其劣势。

6 个月前,我以工程师的身份加入了 MessageBird。我申请的职位是 PHP 工程师,但是我几乎不知道,入职后我将开始使用 GoLang 完全摆脱 PHP。这是一段神奇的经历,这段时间我学习了一种新的编程语言。而现在我又带着 6 个月的 GO 编程经验回归到了 PHP 的怀抱。

GO 是一个具有独特的功能组合的强大编程语言。 很遗憾我没有更多的时间和它相处。我出于与编程语言无关的原因而重返 PHP,但是,我想要总结一下这种经验并分享两者的比较。

静态 vs 动态#

GoLang 是一种静态编程语言,与动态的 PHP 不同。这意味着在初始化变量和对象时,你总是必须事先考虑其数据类型。在 PHP 中,你永远不会初始化变量,只是在需要时立即开始使用它。因此,在声明一个新变量之前,GoLang 让您三思而后行,与我们在 PHP 中检查变量的内容相比,我发现它比以前检查变量的内容更有效率。 PHP 在版本 7.* 中添加了类型声明,并且使用它们是更好的做法,但是在编写代码之前三思而后行是一种更健康的做法。

子程序 vs 并行处理#

Go 语言最令人惊讶的的特性之一是提供了 goroutine。它允许并发运行函数。在 Go 中,没有什么能比 goroutine 更简单易用了。在 PHP 中,每当你不得不使用并行处理时,你必须添加外部的排队机制(Beanstalk,RabbitMQ 等等)。这使得基础架构变得复杂,并增加了项目的复杂性。

Go 语言是并行处理的胜利者。

OOP 特性#

自编程发明以来,OOP 的概念就存在了。当该技术在 C++ 中广泛应用时,它成为 90 年代的主流。关于 OOP 我最喜欢的是它允许引擎使用代码创建业务逻辑图。当不断发展的系统引入变更时,它被证明是无价的。虽然 PHP 和 Go 语言都提供 OOP 特性,但是这两者还是有很大的差异。

我花了一段时间才习惯使用隐式接口。在 Go 语言中,当实现所有方法后,你的类型才满足接口的要求。而在 PHP 中,你明确地告诉你的类型需要定义什么接口,然后开始运行。Go 语言这个特性让你不用一开始就考虑应用程序的协议,这与我期望中的静态类型语言相反。

不断发展的模型具有复杂的可处理领域驱动设计的需求。为了实现这个,你需要很多 OOP 特性,而 PHP 提供了大量的特性 ——traits,抽象方法和类,final 方法和类,魔术方法等等。Go 语言缺少许多这些特性,这是难以克服的局限性。这就是我为什么认为 Go 语言只适合微服务和小型应用程序,而 PHP 适用所有微服务,小型、大型、超大型应用程序

测试#

我认为定义一个项目质量好坏最重要的事就是测试 — 单元测试,集成测试,功能测试,UI 测试,性能测试 — 这些在你的项目中越多,你的可交付成果的质量就越好。GO 和 PHP 都拥有优秀的单元测试框架 —Go 拥有嵌入式测试包,PHP 有 PHPUnit,两者都提供了大量的功能集用于测试你的代码。PHPUnit 要比 GoLang 的测试组件包有更多的特性,这是因为 PHP 本身拥有更多的特性。这两种工具都能很好地完成各自编程语言的测试工作。然而,当进入到高级测试时,PHP 和 Go 就显现出了很大的不同。

首先,对于性能测试,Go 在它的测试组件包中有许多特性。很多库 (例如 pprof) 使用这些特性创建大量的数据报告。虽然 PHP 有自己的一组库和技术用于性能测试,但 Go 似乎更易于使用。我相信这是静态类型语言的优势之一。

其次,对于高级测试技术,例如 BDD,TDD,以及 A/B 测试,PHP 有着更多的支持,更多可选的库以及更大的社区。例如,Cucumber (或 Gherkin) 都有两种语言的实现,但是带有 BEHAT 实现的 PHP 支持 40 多种语言,它由独立组件从头开始构建,并且在 GitHub 上得到了比 Cucumber 更多的支持 (更多的 forks 及 stars 等)。

最后,对于功能或 UI 测试,PHP 拥有更多的库和对现有工具更好的支持。Selenium 库对 PHP 有强大的支持 (3000 + 跨浏览器测试,视频记录,文本及可视化日志等等),然而对于 Go,只有一个不再维护的驱动 —tebeka/selenium (在本文发表时它最后一次 commit 已经是 5 个月之前了)。

其他差异#

这两种语言有很多其他不同的地方,我将只提及一些:

  • Go 相比 PHP 而言,有着更好的性能。数百个基准测试测试了在多种情况下的 Go 和 PHP,大部分情况下,Go 语言明显是赢家。最重要的是,在开发中会感觉 Go 语言更快 —— 测试运行速度更快,内存使用率更高效,CPU 使用率更低。
  • PHP 社区多于 Go 语言,其支持程度令人惊讶。我知道在使用 Go 的时候有一些不好的事情,例如代码生成器,这是 PHP 社区几年前留下来的东西。
  • 包维护也是非常困难,Go 语言是内部管理,而 PHP 有两种不同的实现级别 —— 第一是 PHP 扩展级别,其次是每个人都使用 Composer 的库级别。对于 PHP 来说,管理两种级别更为复杂。

最后想法#

这两者非常容易区分,在这两者做出选择也很容易。Go 语言有更好的性能、本机异步函数、简洁的特性,这使得它适合需要大量使用的小型应用程序和微服务。

在专注于利用 OOP 特性和社区支持的增长型应用程序的开发上,PHP 感觉在更为自然。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/swlh/6-months-with-go...

译文地址:https://learnku.com/php/t/39457

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议