为什么Go是作为PHP开发人员学习的功能强大的语言

从10年以来,我一直在专业地使用PHP进行编程。在获得计算机工程学位后,我所知道的就是Java不再是我的小菜了(在个人和学术项目中使用Java 6年以上),我想要很多更简单的堆栈,我发现作为独立开发人员推销自己的一种快速方法是进入不断增长的PHP CMS市场。

多年来,PHP发生了变化很多尽管许多人喜欢抨击或批评它,但许多人是基于非常古老且很少的经验来这样做的。现代PHP(特别是如果您愿意使用PHP 7类型并抛弃PHP 5.x)非常好用,当然,由于某些原因,PHP的优势在于几乎可以部署该语言到处都是,这就是为什么许多CMS是用PHP内置的,以及为什么如此成功的原因因为它们基于PHP(重力包括)。

当然,PHP只是一个工具,最近我一直在深入研究Go。

与PHP相比,Go是一种完全不同的语言和环境。

这不是旨在使您脱离PHP的喧嚣或文章,而是向您介绍PHP开发人员,为什么Go是一种很好的语言,可以作为一种辅助工具来学习。

首先,什么是Go?

Go是10年前由Google设计的命令式,面向对象的编程语言。

创始成员的综合知识以及为满足他们的需求而创建最佳语言的原始哲学促成了Go。

Go是一种静态类型的编译语言,具有内置的垃圾回收和并发编程功能。

没什么新鲜的

Go进行创新的方式非常有趣。它完全忽略了关于现代语言应该具有的新功能以及其他编程语言所提供的功能的炒作,而是取而代之的是从经过考验的语言中挑剔的核心概念,将数十年的编程经验汇总为一个漂亮的工具来使用。

The task of the programming language designer is consolidation not innovation – Hoare, 1973

Go具有许多独特的功能,当然,它不仅仅是一种mashup语言。去介绍例行程序,这是处理并发的绝佳方法。去介绍推迟,这是在外部函数返回时执行操作的好方法(现在也已添加到Swift中)。

Go是在标准工具中引入格式化程序的第一语言。并能够在没有摩擦的情况下为其他平台进行编译的能力,以及更多“新”事物。

Go扎根。罗伯特·格里斯麦默(Robert Griesemer)在GopherCon 2015上的精彩演讲说明了这一点:Go融合了两者的许多原理C和Oberon-2,这是一种来自Pascal家族的语言。这两种语言都起源于1960年推出的Algol 60。

所以下次有人问为什么Go看起来像20年前的语言,您也可以回答它实际上拥有60多年的经验。正如Robert Griesemer曾经说过的那样,一种编程语言成为主流需要10年的时间。

Go才刚刚起步,这对它的未来以及人们可以用它构建什么感到非常激动!

Go是PHP的补充

如果您除了PHP之外还使用Ruby或Python,您可能已经意识到,如果您从方程式中删除了狂热主义和个人喜好,因为它们都是解释性的,松散类型的语言,那么它们或多或少可以归结为PHP的不同版本。

可以将Ruby转换为PHP和Python,然后做同样的事情。唯一有很大不同的“网络语言”是JavaScript,这是由于非阻塞模型(但已通过库迁移到其他语言,包括PHP和非阻塞模型)并且因为它是当前在浏览器中本机运行的唯一语言而有所不同,这给它带来了巨大的优势。而且,它是一个不受控制的执行环境,更加狂野的生态系统,所有这些都可能以微妙的方式有所不同。

另一方面,这是完全不同的野兽。它是一种系统语言,例如C。与动态语言不同,Go的运行速度很快。

PHP是用C内置的,您可以编写和运行PHPC扩展,因此系统语言的概念不应对你来说陌生。

Go能够替换您的Web堆栈,并且可以使用它来简化Web框架,但是PHP仍然占有一席之地,特别是在进行原型设计时,您仍然不知道代码的哪一部分需要大量优化,并且毕竟您的代码是否真的会被使用。

那么,什么时候应该使用Go?当您使用PHP时,PHP并不是真正的最佳工具。如果PHP为某项特定功能占用了过多的内存或资源,则高度优化的Go程序的性能会更好。就那么简单。 PHP 7在改善PHP性能方面令人赞叹。那是免费的礼物。但是,如果您需要处理数百万个数据库条目,或者需要长时间运行从API获取千兆字节的数据,PHP可能不是正确的工具。

我依靠Node.js解决这个问题已经有很多年了,但是据我所知,Go到目前为止,我提出的任何东西都是一个更简单,更好的解决方案。

当然,它并不止于此。使用Go,您可以轻松地构建跨平台的并发应用程序,这与PHP Web开发有很大的不同,方式更具挑战性,但就个人而言,也更有趣,它可以为您带来许多有意义的工作。

因此,作为PHP开发人员,您可以开始将艰巨的任务交到Go手中,同时熟练掌握它肯定会丰富您的职业选择。

为什么选择Go,而不选择C C ++或Java?

任何语言都有它的位置。当然,Go不能击败C和C ++性能。您可以找到许多基准。

Go介于这两种主流语言和历史性语言以及动态语言之间:您想要的性能要比解释语言所能提供的更多,但是您还不准备或不愿意使用C或C ++,它们虽然更快,但它们级别太低,您需要手动管理内存,这将花费更多的时间来开发。去适合那个地方。

对于经过高度优化的代码,如果您精通C或C ++,则它们可能是更好的解决方案。我可以对大会说同样的话。

与Java相比,情况完全不同。 Java在环境方面需要大量的开销,而Go程序是单个文件,轻巧,可移植并且是本机的。

而且我们可能正在将苹果与橘子进行比较,您永远不会在使用Java的地方使用Go,而事实恰恰相反。

内心很简单

(并且要记住:简单并不意味着容易)避免功能蠕变显然是Go设计师的目标之一。传奇人物肯·汤普森(Ken Thompson)是Go的三位原创设计师之一,也是UNIX和B语言的创造者(还有许多其他事情),他曾经说过

当我们三个人(汤普森,罗伯·派克和罗伯特·格里塞梅尔)开始时,这纯粹是研究。我们三个在一起,决定讨厌C ++。 [笑声]…[回到Go,]我们开始的想法是,我们三个人都必须与语言的每个功能进行交谈,因此,由于任何原因,都不会在语言中添加任何多余的垃圾。

对于任何使用任何语言进行编码的经验丰富的开发人员来说,这都导致了一种极其简单的语言。

Java,C ++,C,C#,Erlang,JavaScript,Swift,几乎所有现代编程语言都比Go更复杂。

在这里,我的意思是为程序员使用复杂的语言,为阅读而复杂的语言,为成为一名熟练者而复杂的语言。在内部,Go隐藏了所有复杂性并公开了一个简单的API。 Go不仅具有垃圾回收功能,而且根本没有公开的内存管理功能。

试想一下,PHP有67个关键字,而Go有25个关键字。

这里的关键是我们的程序员是Google员工,而不是研究人员。他们通常相当年轻,刚从学校毕业,可能学习过Java,也许学习过C或C ++,可能学习过Python。他们无法理解出色的语言,但我们希望使用它们来构建优秀的软件。因此,我们提供给他们的语言必须易于理解和采用。 —罗伯·派克

这是Go语言哲学的核心,并解释了为什么Go选择避免实现特征(避免特征爬升),以及为什么函数编程的许多概念因其复杂性而被排除在外而引发了争论。纯粹的函数式编程与机器概念相距太远,无法与Go相关,Go是一种核心命令语言。

也就是说,Go实现了许多功能编程的概念,例如一流的函数(允许将函数分配给变量),闭包,递归。

但是与PHP或JS相比,您没有诸如map,reduce或filter之类的功能性操作,必须依靠循环。为什么?因为这些操作效率低下,所以Go必须找到一个平衡点。

说到缺少的东西,没有例外可以处理错误。没有类(即使它是面向对象的,具有带关联方法的结构,强制超越继承的组成—如果您了解JavaScript的原型对象实现的知识,那将是熟悉的,但有很大的不同),不需要泛型(尽管PHP也没有泛型),以及这就是为什么

少即是多,或(甚至更好!)更少就是成倍增长

好的软件设计的“秘密”不是在知道要在代码中添加什么。那是在知道剩下什么!这是在识别硬点和软点在哪里,并且知道在哪里留出空间/房间,而不是试图在更多设计中塞满东西。

只有一种编写循环的方法:for。忘记whiledo — whileforeach(还有吗?)。

[…]使Go取得成功的原因是该语言所遗漏的内容,与所包含的内容一样多。

从函数返回多个值的能力避免了很多麻烦(最简单的示例是返回包含2个值的数组,并且必须在不知道传递的确切类型的情况下提取它们)。

工具继承了简单性。gofix自动修复新Go版本中突破性的API更改

Go在设计上很简单,并且将始终保持简单。

正如罗伯·派克(Rob Pike)所说,许多其他语言正在互相复制功能,从而失去了它们独特的方面(例如,JavaScript引入了类语法来取悦Java和PHP开发人员),并且它们在理想情况下都融合到了概念上独特的语言。

Go不能在功能上竞争。这让我想起这篇越来越真实的文章

当心:围棋是两极分化的

Go有很多粉丝,也有很多仇恨者。作为一名PHP开发人员,我敢肯定您在这种火焰大战中发展出了厚厚的皮肤,我们可以迅速进行下一步。它非常受欢迎,并且开发人员有强烈的意见。

无论您做出什么取舍,总是会有批评,因为没有一种编程语言可以完美无缺。

Go很好地解决了问题。而且您不必成为天才就可以开始使用它,尽管这可能会损害您的感觉。

Go非常自以为是,有明确的约定

您会发现关于Go的第一件事就是几乎所有可以找到的代码都几乎相同。

这是因为Go具有明确和强制的约定。内置工具提供了2条与约定有关的命令(gofmtlin,其中包含第一个自动格式化代码,第二个仅显示警告),他们可以检查您的代码是否符合要求,甚至可以根据Go准则自动调整样式。

这与JS不同ESLint/ JSHint,因为这些工具是团队范围的应用程序。就像在所有JS中一样,您可以自定义首选项中的任何内容。gofmt是一种,没有配置,这就是要遵循的风格。

这对于在您自己的代码上提供一致性非常有用(您5年前用PHP或JavaScript编写的代码可能是非常与您当前的约定和首选项不同)和代码每个人分发。

想象没有更多的内部团队讨论最佳的代码样式,想象一下开源项目中所有PR都以相同的方式进行格式化和删除。分隔vs0选项卡,节省思维周期-它是选项卡。大括号是在同一行还是在下一行?总是同一行(这是有原因的,它允许省略分号)。

如果未使用变量或导入,Go会引发编译错误,从而防止程序随时间累积垃圾。

命名约定是如此重要,以至于访问修饰符已从等式中完全删除。小写变量?私人的。大写变量?上市。如此简单,一个简单的约定就消除了大量无用的屏幕空间使用,并且立即可以理解。

注释有特殊需要,您可以使用特殊语法编写注释,以便可以使用以下命令检查软件包go doc并且您拥有所需的所有文档,而无需在Google上进行搜索。

go get内置的(可用于开源和发行版)供您使用。虽然在我看来,PHPland在依赖项管理方面要先进得多。

PHPUnit /代码接收?不需要,go test已经为您服务*_test.go文件。

它使您成为更好的程序员

如果您来自PHP,那么学习Go会让您以另一种全新的方式思考。这将使您成为更好的程序员,就像学习任何其他语言一样:它向您介绍了新概念。如果感觉陌生而陌生,则说明您正在学习并成长为一名开发人员是一个好兆头。

首先,Go是编译而不是解释的。完全不同的工作流程和部署。

如果您没有使用强类型的经验,那将是一个范式更改。 PHP 7附带了类型检查功能,如果您不必支持旧版本的PHP,它会提供很大的帮助。 Go是强类型的。许多(如果不是全部)类型问题在编译时已解决。

Go非常简单,设计得很简单,而成为Go开发人员意味着要认识到这种简单性并加以利用,而不是尝试编写类似于Java的Go,而是要接受它。

简单地说,我并不是说Go是一种玩具语言,它当然不是,而且我也不是要向某人介绍编码的语言。

简单来说,我的意思是更多极简主义无绒毛

当一种语言为您提供多种方法来做相同的事情时,您就不得不思考哪种才是最好的,这会分散您要解决的问题的注意力。

您可以从PHP运行Go代码

因此,我建议一开始的一种方法是编写一些繁重的例程或长时间运行的代码,这些代码作为Go服务会占用过多的内存。

那里 许多 方法直接从PHP调用Go程序,但您也可以选择实现一个通过ZeroMQ的服务队列,或通过反向代理公开API端点来访问长期运行的go程序。您有很多选择。

Go的特殊武器:并发

众所周知,PHP-FPM可以很好地处理并发请求,产生了一个新进程,该进程为每个用户执行实际的PHP代码。通常,在Web应用程序中,数据库是瓶颈。但是,对于长时间运行的进程(您确实不想在PHP中构建的东西),或者需要在PHP请求中启动繁重的计算循环(您需要在其中运行成千上万个并发进程)呢?

PHP具有线程支持,因此它可以执行并发处理,但是PHP(甚至C和其他语言)可以使用语言外部的库进行并发,而Go是设计的具有内置的并发编程,并提供了goroutine之间进行通信的本机方式。

线程比较重例行程序。一个系统可以支持10k线程,而同一系统可以支持数百万个goroutine,因为内部实现了goroutine的内存消耗要轻得多,例如Java或Erlang。

因此,即使您不需要数百万个并发请求,性能提升也很明显。

此外,通过简单的方式消化goroutine并了解代码的作用非常容易。

无需扩展类或包括特殊扩展名,这些扩展名可能并不总是可用(这有效地限制了我们可以将PHP并发用于自行安装的分布式代码的程度)

只需输入go someFunction()然后该函数将在goroutine中执行。

结论

如果您是Go的新手PHP开发人员,希望您现在对这个工具感到好奇,并考虑该工具在什么地方有用,或者是否适合您。

如果您是一个喜欢简单而不是复杂,而是喜欢直接和可读的代码而不是抽象的程序员,那么我相信您会发现Go真的很有趣。


更多教程: