导读:本文作者以Ruby开发者的身份讲解Ruby和Go的关键区别,这对于有其他语言背景的同学来说,同样有启示作用。
我喜欢 Ruby,这门语言让我乐于编写代码。但作为一名 Rails 开发者,我最终还是遇到了瓶颈。我需要处理一个 4GB 的 CSV 文件,有时可能需要构建一个能够处理 10,000 个连接的实时通知服务。
在某些情况下,Ruby 会显得运行缓慢或者占用大量内存。因此,许多 Rails 开发人员(包括 Basecamp 团队)开始使用Go (Golang) 来开发高性能的辅助服务。
如果你和我一样,是一名 Ruby 开发者,Go 语言会让你感觉截然不同。它没有任何“魔法”,还是强类型语言,而且运行速度极快。
以下,便是我编写的 Go 语言学习指南,教你如何轻松入门。
在 Rails 中,我们习惯了“魔法”。你输入代码User.find(1),它就能直接运行。你看不到 SQL 代码,看不到导入语句,也不用担心数据类型问题。
而Go则恰恰相反,它没有任何魔力可言。
一开始,这会非常烦人。你会感觉自己打字太多了。但一周后,你会意识到,因为没有什么魔法,所以你可以阅读任何 Go 文件并准确了解它的功能。
我们来看两种语言编写一个简单的函数比较。
Ruby:
def greet(name)"Hello, #{name}!"endputs greet("Zil")
Go:
package mainimport "fmt"// We must say name is a string, and the function returns a stringfunc greet (name string) string {return "Hello, "+ name +"!"}func main() {fmt.Println(greet("Zil"))}
请注意 `& package main` 和 `& import`——每个 Go 文件都需要它们。另外,你还要注意花括号{}。
作为一名 Ruby 程序员,你用do...end一开始可能会觉得不习惯,但你会慢慢习惯它的。
begin...rescue会处理错误。或者,我们也可以任由应用程序崩溃,然后查看日志。在 Go 语言中,错误并非“异常”,它们只是函数返回的值。你会在每个 Go 项目中看到这种模式:
user,err:=findUser(1)if err!= nil{// Something went wrong, handle it herereturn err}// If no error, continuefmt.Println(user.Name)
每天要写 50 次这样的代码会感觉很重复,但这意味你的应用在生产环境中几乎不会崩溃,因为你在输入代码的同时,就被迫处理每一个极端情况。
这就是我学习 Go 的主要原因。
在 Ruby 中,如果你想同时处理 10 件事,你需要 Sidekiq 和 Redis。
在 Go 语言中,你可以使用Goroutine 。你只需在函数调用前加上 Goroutine 这个词,它就会立即在后台的另一个 CPU 线程上运行。
func sendEmail(email string){// slow logic}func main(){// This runs in the background. No Redis needed!gosendEmail("test@example.com")fmt.Println("Moving on...")}
它非常的轻巧。一台5 美元的廉价笔记本电脑就能运行 10 万个 goroutine。
对于像我这样热爱Kamal和 Docker 的人来说,Go 语言简直是部署的绝佳选择。
在构建 Go 应用时,它会被编译成一个单独的文件(二进制文件)。这个文件包含了你的代码和所有库。你无需在服务器上安装 Ruby、Bundler 或 Node。
只需要将这个文件移动到服务器并运行即可。这使得 Docker 镜像体积小巧,部署速度也极快。
我并不建议用 Go 替换 Rails 作为你的主要 Web 应用语言。Rails 在构建用户界面和 CRUD 逻辑方面仍然快得多。
相反,你应该把 Go 当作你工具箱里的一个工具。
学习 Go 语言会让你成为更有条理的开发者。它教会你思考内存、类型以及计算机的实际工作原理。
作者:场长
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。