10 年 Java 经验,转行 Go 的 7 个理由
原因一:开发速度
如今,当我要编写一款软件时(我肯定可以用上面提到的三种语言编写它),我将始终选择 Go。
因为我可以花较短时间用 Go 开发完,而且代码更具可读性,不那么抽象,更“切合实际”。
在编写 Go 代码时,您所做的正是您应该做的。编写的代码基本就是“生产级别”代码。你不是在编写类,子类,getter,setter 和一堆代码,实际上这些都没做。当你编写 Go 代码时,你在编写代码,这可以完成某些工作。您不是在为“代码本身”编写代码。(GCTT 译注:意思是说,写的代码都是完成任务核心的代码,而不是一堆无关的代码,比如 getter/setter 之类的就是和完成任务不相关的代码)。
最终,你将减少编写代码的时间,并减少对代码工作的思考,因此开发的速度将蒸蒸日上。
旁注:从我的个人经验来看,用 Go 编写的代码从这三种语言中读起来最简单。我已经对此进行了测试。我曾经用他们最好的技术用 C#,Java 和 Go 编写过一个软件。然后,我问了三个同事一个简单的问题:“这段代码在做什么?”。它们在 Java 和 C#(现在是 PHP 开发人员)中迷失了,但是他们从 Go 代码中看懂了。
原因二:部署速度
这是我个人最喜欢 Go 的第二点。我倾向于实时修改。我希望修改后能立即看到修改的结果。
Go 代码的构建速度如此之快,我可以根据需要进行多次更改,这没有问题。而且我不在乎项目有多大。
想为三个主流操作系统(Win、Linux、Mac)部署二进制文件吗?小菜一碟。
原因三:只有一种方式
在数月或数年后看之前的代码,你将不胜感激。根据创建者的决定,Go 代码采用相同的格式设置。这意味着你将几乎理解任何 Go 代码。
例如,作为 C#开发人员,你大约有 7 种不同的方式将整数转换为字符串。你可以通过更多选择来做很多其他事情。
你是否可以想象,如果将所有这些“不同的处理方式”结合起来,例如将整数转换为字符串,那么你将拥有多少种不同的代码?我在理解其他开发人员的 Java 和 C# 代码时仍然遇到问题,但是即使当时我还不知道的 Go 代码在做什么,却可以立很容易看懂。
Go 的简单性是它的优势之一,随着时间的流逝,您一定会喜欢这点。
原因四:二进制大小
作为开发人员,你应该始终尝试拥有尽可能小的二进制文件。较小的尺寸意味着更快的部署。较小的尺寸意味着较少的网络传输。越小越好。
在我们公司中,我们将 Docker 用作运行时环境,因此我们将软件“打包”到 Docker 映像中。Docker Hub 存储库中有大量映像,因此我们可以轻松比较它们的大小。当然,无论使用哪种语言,我们都会使用最佳技术来使镜像尽可能小。
我们不在 Docker 中使用 Java,因此抱歉,在这里无法进行比较。
但是我们使用 C# 和 Go,所以比较相同的功能。
C# 镜像 40+ MB[1]Go 镜像 3+ MB[2]
你可以在本文[3]中了解更多信息。
原因五:标准库
当我们开始使用 Go 时,我们开始搜索库。因为你需要库来执行其他操作,对吗?
在 Go 中,它具有令人难以置信的标准库:stdlib。你仅使用标准库就可以编写几乎所有内容。更少的库(这里是模块)意味着您需要寻找的第三方代码也更少。我在这篇文章[4]中写了这个。
原因六:Goroutine
这是我们所有人的最爱。我们正在开发基于网络的软件。与该设备的通信,与该设备的通信,与…的通信,你明白了吧。我们希望在所有这些设备之间进行区分。
这意味着,线程是我们在软件中经常使用的东西。如果你曾经使用过线程,也许你会记得,你是如何学习的以及必须要做的工作。(GCTT 译注:比如 Java 怎么开线程,你知道吗?)
在 Go 中,如果要在“线程”中运行 function(),只需在其前面添加 go,即像 go function()
这样。
就这样。当我第一次看到它的时候,我就像:“就这样吗?”。是的,仅此而已。
另外,您是否知道,默认情况下,一个 Java 线程分配大约 1MB 的内存,C# 线程也分配大约 1MB 的内存,但是 Go 的 goroutine 仅分配大约 2kb 的内存?那有多棒?!
原因七:Web Server
这是一瞬间的爱,特别是对我来说。你可以使用下面的代码运行一个简单的 Web 服务器,侦听 80 端口。
然后将你的 html,css 和 javascript 文件放入 data 文件夹中,就可以了。
package main
import (
"github.com/julienschmidt/httprouter"
"net/http"
)
func main() {
router := httprouter.New()
router.ServeFiles("/data", http.Dir("data"))
_ = http.ListenAndServe(":80", router)
}
如果你想看完整的教程,这篇文章[5]适合你。
注:我主张使用标准库,在这里,在此 Web 服务器示例中,我实际上是在使用第三方库。
原因很简单:我一直都在使用它,但我错误地将其视为标准。下面是没有第三方库,实现相同功能。
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./data")))
_ = http.ListenAndServe(":80", nil)
}
总结
当我第一次了解 Go 时,我并不感兴趣。我以为,我使用的已经是世界上最好的语言了(即 Java 和 C#),并得到了大公司的支持。(GCTT 译注:世界上最好的语言不是 PHP 吗?哈哈哈哈)
但是后来我读了一些有关 goroutine 的东西。它吸引了我的注意。当我看到运行 Web 服务器有多么容易时,我就迷上了。我开始使用 Go,从此无法回头。Go 成为我最爱、最常用的语言。
所以,我建议您尝试一下。
你会惊讶于你的生产力。
本文作者:Petr Jahoda
原文链接:https://itnext.io/7-reasons-you-should-try-use-go-5fb4714015d1
参考资料
C# 镜像 40+ MB: https://hub.docker.com/r/petrjahoda/zapsiservercore/tags?page=1&ordering=last_updated
[2]Go 镜像 3+ MB: https://hub.docker.com/r/petrjahoda/zapsi_service/tags
[3]本文: https://itnext.io/create-go-service-the-easy-way-viii-157427e7cd35
[4]这篇文章: https://petrjahoda.medium.com/lessons-learned-while-developing-enterprise-system-287c3afce1ca
[5]这篇文章: https://medium.com/swlh/create-go-service-the-easy-way-iii-c84489cc1ee0
⬇⬇⬇