如今,越来越少的 Web 开发人员开始专注于 Ruby 之类的单一语言。我们针对不同的工作使用不同的工具。在本文中,Ayooluwa Isaiah 认为 Go 是 Ruby 的完美补充。两门语言都会的开发人员可以很好地应对几乎所有后端挑战。
Ruby 和 Rails 是出色的工具,可让你快速创建复杂的 Web 应用程序。好吧,一些复杂的 Web 应用程序。尽管它们在传统的,整体的,服务器呈现的应用程序方面表现出色,但在交付实时或分布式服务方面却表现不佳。
这就是为什么 Rubyists 会去学习 Go 之类的语言的原因。Go 专为编写可处理大量连接的轻量服务而设计。它的优势与 Ruby 的劣势惊人地吻合。如果你会这两门语言,那么你基本上是势不可挡的。
本文是关于从 Rubyist 的角度学习 Go 的系列文章的第一篇。它将涵盖与其他任何教程中相同的语言基本原理。但是,将花费时间在 Ruby 中可能的陌生领域。
Go 是由 Robert Griesemer,Rob Pike 和 Ken Thompson 在 Google 设计的一种编译的,静态类型的编程语言,它于 Ruby 首次发布十多年后的 2007 年开始开发,并于 2009 年首次发布。
开发新的编程语言的想法源自与 Google 使用其他语言有关的挫败感。目标是创建一种语言,以解决现代编程难题,同时消除所有无关功能,这些功能使维护诸如 C++ 之类的代码变得困难。
Go 极简。它的语法很简单,只有 25 个关键字。它的规范相对容易阅读。这意味着你可以快速启动并运行。让我们一起去看看 “hello world” 是什么样的:
// Hello World! program in Go
package main;
import "fmt";
func main(){
fmt.Println("Hello World!")
}
作为 Ruby 开发人员,编写完代码,然后立即运行它。我们中的许多人从未发现有什么不同,因此我们没有意识到快速开发周期是什么奢侈品。
必须编译的像 C++ 之类的语言。在较大的代码库上,这可能需要几分钟甚至几小时。您能想象这么长时间运行刚刚编写的代码会多么令人沮丧吗?
当然,之所以要花费这么长时间,是因为 C++ 编译器在前期做了很多工作,而 Ruby 没有。在 C++ 中,如果您拼写错误的方法名称,编译器会告诉您。这是因为 C++ 是“类型安全的”。在 Ruby 中,直到运行代码并获取常见的 NoMethodError,您才知道自己犯了一个错误。
Go 为你提供了两全其美的方案:快速的开发周期和类型安全。
Go 具有动态语言一样的快速开发体验,这是因为它具有闪电般的快速编译时间,同时还提供了这些动态语言所缺乏的类型安全性。Go 程序也非常快。它们并没有完全达到 Rus t或 C 的水平,但比其他语言(如 Ruby 或 Python)要快得多。
Go 是一种多用途语言,可以在软件开发的许多不同领域中使用。它具有内置的并发功能,特别适合网络应用程序和分布式云服务,使应用程序可以有效利用运行它的硬件的可用资源。
从 Go 诞生之日起,避免引入太多功能成为 Go 的特定设计目标。许多其他语言都希望继续添加更多功能,其理由通常是为了表达力。Go 的设计师通过选择只包含覆盖解决方案空间并与语言的其他功能可预测地交互的功能来拒绝这种哲学。
Go 语言的原始设计师之一肯·汤普森(Ken Thompson)很好地总结了这种不同寻常的立场:
当我们三个人(Thompson, Rob Pike 和 Robert Griesemer)开始开发 Go 时,纯粹是研究。我们三个在一起,决定这么做,因为讨厌 C ++。[笑声] … [回到Go],我们开始的想法是,我们三个人都必须与语言的每个功能进行确认,因此,任何原因,都不会在语言中添加多余的垃圾。
多年来,Go 团队一直恪守这一理念。这导致了一种语言的设计,即使在某些情况下(例如在处理错误时)过于冗长,其语言也为清晰起见而设计。
// Error handling in Go
result, err := object.DoSomething()
if err != nil {
log.Printf("Something failed", err)
return err
}
Go 程序通常具有很高的可读性和易于维护性,因为除了业务逻辑之外,您不需要了解太多的事情就可以在任何代码库上工作,即使是不熟悉的代码库,也不会遇到每个开发人员都使用的问题。语言的不同子集,这是用其他语言编写的大型软件项目中经常遇到的情况。
Go 对如何编写和格式化代码有强烈的规定。因此,所有 Go 代码看起来都差不多。这种质量有助于减轻熟悉陌生代码库时的认知负担,并消除有关琐碎细节(例如空格和大括号位置)的不必要争论。
该语言内置了 gofmt 和 golint 之类的工具,可为现有的所有 Go 代码提供格式化和编码,并且它们遵循的规则无法以任何方式进行配置。例如,gofmt 使用制表符缩进 Go 程序。您是否喜欢空格而不是制表符?好吧,你不能改变它。至少通过 gofmt 做不到。
Go 不允许你导入包或在不使用包的情况下声明变量。如果尝试这样做,代码将无法编译。这种行为背后的想法是为了短期的不方便而换来长期的编译速度和程序的清晰度。
Go 语言不存在访问修饰符关键字。没有 public,private 或 protected 关键字。Go 支持两种用于变量,函数和其他类型(即已导出和未导出)的访问修饰符,它们可以在包级别使用。
如果要创建未导出的标识符(在程序包外部无法访问的标识符),请以小写字母开头。您可能会猜到,导出的标识符以大写字母开头。在阅读代码时会立即理解这一点,并使代码更加简洁。
var Foo string; // exported
var bar int; // unexported
Go 的测试包附带一个要求,即任何测试文件都必须带有 _test.go 后缀。名为 program.go 的文件有测试文件时,应该命名为 program_test.go。这样一来,Go 可以在编译代码时忽略测试文件,因为程序运行不需要它们。当您要测试代码时,提供了开箱即用的 go test 命令,该命令执行这些文件并运行测试。
尽管 Go 的拥护者人数众多,但如今批评这种语言已成为一种时尚。甚至还有一个 GitHub 代码库,专用于列出抱怨 Go 的文章。他们中的大多数人都专注于 Go 所没有的功能或语言中的某些问题。
与其他所有语言一样,Go 也有相当多的包袱和缺点。随着语言的发展,随着时间的流逝,这些事情可能会有所改善。Go的主要优势在于其基本的极简主义哲学。但是,它并不完美,某些方面可以改进,包括缺少泛型。
Go 永远不会使每个人都高兴,但是当用于它设计的问题领域时,它绝对是赢家!
Go 具有令人惊叹的标准库,可让您快速开发可扩展且安全的 Web 应用程序,而无需使用框架。它带有一个功能齐全的 Web 服务器(net/http),并包括模板,路由以及大多数您需要的 Rails 之类的东西。对于许多类型的项目,坚持使用标准库是完全合理的。
在标准库不符合您的期望的情况下,存在一些补充标准库的第三方软件包,例如 Gorilla Toolkit。另外,如果您确实需要一个包含所有内容的框架,您将很高兴得知存在多个选择。如果您正在寻找具有与 Rails 类似特征的东西,可以看看Buffalo。
Go 程序的部署过程也轻而易举!您不需要在服务器上安装任何东西。只需为您的目标操作系统编译项目,您将获得一个可移植的二进制文件,可以上传到服务器并执行该二进制文件。
例如,要从 Linux 计算机为 Windows 环境构建,可以使用以下命令:
GOOS=windows GOARCH=386 go build -o hello.exe hello.go
生成的 hello.exe 文件将可在具有 x86 CPU 的任何 Windows 计算机上运行,而无需任何进一步的设置。这对容器也很好。只需将一个二进制文件放入一个轻量级的 Docker 容器中,设置一些环境变量,然后运行该应用程序即可!
如果在部署后出现问题并且需要回滚,则可以轻松地还原到先前的二进制文件。由于整个程序都被编译为单个二进制文件,因此您无需担心意外升级了依赖项。
与 Rails 相比,Go 程序通常在 CPU 和内存资源上使用的资源要少得多,这有助于显着降低服务器成本。例如,Iron 在从 Rails 切换到 Go 时,在启动时就可以将其内存使用量从 50MB 减少到数百 KB。
由于其内置的并发功能,Go 非常适合需要同时处理数千个请求的大型软件项目。Go 在执行其他任务时会使用 goroutines 并发执行一些代码,而称为“channel”的轻量级通信机制可帮助您避免并发数据修改。
如果你准备学习 Go,则可以按照此处提供的说明将其下载并安装到计算机上。要学习该语言的基本语法和功能,请使用 A Tour of Go。gobyexample 是另一个值得学习的好资源。
想要利用您所学的知识来构建程序吗?试试 https://gophercises.com/。它提供免费的教程,通过构建多个项目来涵盖语言的各个方面,每个项目旨在教给您一些不同的东西。
如果您想读一本书,那么《Go编程语言》和《Go语言实战 Go In Action》是极好的读物。
使用 Go 还是 Ruby 将取决于您的项目要求。两者都是很棒的,它们绝对可以共存于您的语言工具箱中。
作为 Ruby 开发人员学习 Go,软件开发中的其他范例会让你眼前一亮。有时会感到陌生,但最终会给您带来不同的看法并帮助您成为更好的开发人员。
我希望本文有助于激起您对 Go 的好奇心,并促使您考虑如何在当前和将来的软件项目中使用它。