go设置后端启动_为什么 Rubyists 应该考虑学习 Go

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

如今,越来越少的 Web 开发人员开始专注于 Ruby 之类的单一语言。我们针对不同的工作使用不同的工具。在本文中,Ayooluwa Isaiah 认为 Go 是 Ruby 的完美补充。两门语言都会的开发人员可以很好地应对几乎所有后端挑战。

Ruby 和 Rails 是出色的工具,可让你快速创建复杂的 Web 应用程序。好吧,一些复杂的 Web 应用程序。尽管它们在传统的,整体的,服务器呈现的应用程序方面表现出色,但在交付实时或分布式服务方面却表现不佳。

这就是为什么 Rubyists 会去学习 Go 之类的语言的原因。Go 专为编写可处理大量连接的轻量服务而设计。它的优势与 Ruby 的劣势惊人地吻合。如果你会这两门语言,那么你基本上是势不可挡的。

本文是关于从 Rubyist 的角度学习 Go 的系列文章的第一篇。它将涵盖与其他任何教程中相同的语言基本原理。但是,将花费时间在 Ruby 中可能的陌生领域。

##Go 简介

Go 是由 Robert Griesemer,Rob Pike 和 Ken Thompson 在 Google 设计的一种编译的,静态类型的编程语言,它于 Ruby 首次发布十多年后的 2007 年开始开发,并于 2009 年首次发布。

开发新的编程语言的想法源自与 Google 使用其他语言有关的挫败感。目标是创建一种语言,以解决现代编程难题,同时消除所有无关功能,这些功能使维护诸如 C++ 之类的代码变得困难。

Go 极简。它的语法很简单,只有 25 个关键字。它的规范相对容易阅读。这意味着你可以快速启动并运行。让我们一起去看看 “hello world” 是什么样的:

// Hello World! program in Go

Go 提供类型安全性和快速的开发周期

作为 Ruby 开发人员,编写完代码,然后立即运行它。我们中的许多人从未发现有什么不同,因此我们没有意识到快速开发周期是什么奢侈品。

必须编译的像 C++ 之类的语言。在较大的代码库上,这可能需要几分钟甚至几小时。您能想象这么长时间运行刚刚编写的代码会多么令人沮丧吗?

当然,之所以要花费这么长时间,是因为 C++ 编译器在前期做了很多工作,而 Ruby 没有。在 C++ 中,如果您拼写错误的方法名称,编译器会告诉您。这是因为 C++ 是“类型安全的”。在 Ruby 中,直到运行代码并获取常见的 NoMethodError,您才知道自己犯了一个错误。

df2964af44f20f9a9427d01d00402dcc.png
NoMethodError exception

Go 为你提供了两全其美的方案:快速的开发周期和类型安全。

Go 具有动态语言一样的快速开发体验,这是因为它具有闪电般的快速编译时间,同时还提供了这些动态语言所缺乏的类型安全性。Go 程序也非常快。它们并没有完全达到 Rus t或 C 的水平,但比其他语言(如 Ruby 或 Python)要快得多。

Go 是一种多用途语言,可以在软件开发的许多不同领域中使用。它具有内置的并发功能,特别适合网络应用程序和分布式云服务,使应用程序可以有效利用运行它的硬件的可用资源。

Go 很简单

从 Go 诞生之日起,避免引入太多功能成为 Go 的特定设计目标。许多其他语言都希望继续添加更多功能,其理由通常是为了表达力。Go 的设计师通过选择只包含覆盖解决方案空间并与语言的其他功能可预测地交互的功能来拒绝这种哲学。

Go 语言的原始设计师之一肯·汤普森(Ken Thompson)很好地总结了这种不同寻常的立场:

当我们三个人(Thompson, Rob Pike 和 Robert Griesemer)开始开发 Go 时,纯粹是研究。我们三个在一起,决定这么做,因为讨厌 C ++。[笑声] ... [回到Go],我们开始的想法是,我们三个人都必须与语言的每个功能进行确认,因此,任何原因,都不会在语言中添加多余的垃圾。

多年来,Go 团队一直恪守这一理念。这导致了一种语言的设计,即使在某些情况下(例如在处理错误时)过于冗长,其语言也为清晰起见而设计。

// Error handling in Go

Go 程序通常具有很高的可读性和易于维护性,因为除了业务逻辑之外,您不需要了解太多的事情就可以在任何代码库上工作,即使是不熟悉的代码库,也不会遇到每个开发人员都使用的问题。语言的不同子集,这是用其他语言编写的大型软件项目中经常遇到的情况。

Go 很“固执”

Go 对如何编写和格式化代码有强烈的规定。因此,所有 Go 代码看起来都差不多。这种质量有助于减轻熟悉陌生代码库时的认知负担,并消除有关琐碎细节(例如空格和大括号位置)的不必要争论。

该语言内置了 gofmt 和 golint 之类的工具,可为现有的所有 Go 代码提供格式化和编码,并且它们遵循的规则无法以任何方式进行配置。例如,gofmt 使用制表符缩进 Go 程序。您是否喜欢空格而不是制表符?好吧,你不能改变它。至少通过 gofmt 做不到。

Go 不允许你导入包或在不使用包的情况下声明变量。如果尝试这样做,代码将无法编译。这种行为背后的想法是为了短期的不方便而换来长期的编译速度和程序的清晰度。

Go 语言不存在访问修饰符关键字。没有 public,private 或 protected 关键字。Go 支持两种用于变量,函数和其他类型(即已导出和未导出)的访问修饰符,它们可以在包级别使用。

如果要创建未导出的标识符(在程序包外部无法访问的标识符),请以小写字母开头。您可能会猜到,导出的标识符以大写字母开头。在阅读代码时会立即理解这一点,并使代码更加简洁。

var Foo 

Go 的测试包附带一个要求,即任何测试文件都必须带有 _test.go 后缀。名为 program.go 的文件有测试文件时,应该命名为 program_test.go。这样一来,Go 可以在编译代码时忽略测试文件,因为程序运行不需要它们。当您要测试代码时,提供了开箱即用的 go test 命令,该命令执行这些文件并运行测试。

Go 的两极分化

尽管 Go 的拥护者人数众多,但如今批评这种语言已成为一种时尚。甚至还有一个 GitHub 代码库,专用于列出抱怨 Go 的文章。他们中的大多数人都专注于 Go 所没有的功能或语言中的某些问题。

与其他所有语言一样,Go 也有相当多的包袱和缺点。随着语言的发展,随着时间的流逝,这些事情可能会有所改善。Go的主要优势在于其基本的极简主义哲学。但是,它并不完美,某些方面可以改进,包括缺少泛型。

Go 永远不会使每个人都高兴,但是当用于它设计的问题领域时,它绝对是赢家!

Go 非常适合 Web 开发

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 入门

如果你准备学习 Go,则可以按照此处提供的说明将其下载并安装到计算机上。要学习该语言的基本语法和功能,请使用 A Tour of Go。gobyexample 是另一个值得学习的好资源。

想要利用您所学的知识来构建程序吗?试试 https://gophercises.com/。它提供免费的教程,通过构建多个项目来涵盖语言的各个方面,每个项目旨在教给您一些不同的东西。

如果您想读一本书,那么《Go编程语言》和《Go语言实战 Go In Action》是极好的读物。

总结

使用 Go 还是 Ruby 将取决于您的项目要求。两者都是很棒的,它们绝对可以共存于您的语言工具箱中。

作为 Ruby 开发人员学习 Go,软件开发中的其他范例会让你眼前一亮。有时会感到陌生,但最终会给您带来不同的看法并帮助您成为更好的开发人员。

我希望本文有助于激起您对 Go 的好奇心,并促使您考虑如何在当前和将来的软件项目中使用它。

原文链接:https://www.honeybadger.io/blog/rubyist-learn-go/

作者:Ayooluwa Isaiah

翻译:Go语言中文网 polaris

推荐阅读

  • Go 和 Rust 的优缺点;预测 Go 1.16-1.19 会支持泛型


喜欢本文的朋友,欢迎关注“Go语言中文网”:

0279a767ec001ff0e265193b4e0caa74.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生涯刚开始就要转会?

昨晚,12点快睡觉的时候,一个同学给我发来的问题,篇幅有点长,都是文字,看起来可能有点乏味,不过有耐性的同学还是瞄一下,应该很多人都有这样的迷茫期,我的解答也不一定完全正确&#…

Topaz Video AI 视频修复工具(内附安装压缩包win+Mac)

目录 一、Topaz Video AI 简介 二、Topaz Video AI 安装下载 三、Topaz Video AI 使用 最近玩上了pika1.0和runway的图片转视频,发现生成出来的视频都是有点糊的,然后就找到这款AI修复视频工具 Topaz Video AI。 一、Topaz Video AI 简介 Topaz Video…

python文本编辑器报错_notepad++编辑器中运行python程序时需要注意的编码格式

本篇文章给大家带来的内容是关于notepad编辑器中运行python程序时需要注意的编码格式,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 语言:python3.4 文本编辑器:notepad 报错:SyntaxErro…

我不建议大家随便跳槽

突然的留言 我的微信好友很多,经常也有一些同学给我留言一些问题,当然能回答的我肯定会回答了,但是如果是非常难的技术问题,我一般会说,我要请教一下身边的朋友,昨晚准备睡觉的时候,收到一个同…

我是不建议随便跳槽的

突然的留言我的微信好友很多,经常也有一些同学给我留言一些问题,当然能回答的我肯定会回答了,但是如果是非常难的技术问题,我一般会说「我要请教一下身边的朋友」,我会非常刻意的去回避我技术很水的这个问题&#xff0…

ubuntu c++检测usb口事件变化_拆解报告:美式双USBA口充电插座

----- 充电头网拆解报告 第1441篇 -----最近充电头网拿到了一款美式插座,这款产品相比常规墙插插座,除了配有两个双脚AC插口外,还有两个USB-A接口,支持直接插上数据线即可为两台设备进行同时充电。其中两个USB-A口都支持最大5V4.8…

div不继承父类样式_Python编程思想(27):类的继承

-----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。-----------正文---…

mysql 举例_MySQL 语句举例(一)

举例:有10个用户,输出在订单表中下单数最多的5个人的名字。my_user 表数据my_order,uid对应my_user表的id测试数据生成写一个存储过程,随机插入10000条数据:CREATE DEFINERrootlocalhost PROCEDURE test_loop( )BEGIND…

你知道Linux里D进程会搞事吗?

前言这篇文章是一位大神在实际项目中遇到问题并分析总结出来的,作为新手,能接触到这类文章应该是受益匪浅,这位同学现在在魅族工作,以后也会一直在魅族工作,是Linux 方面的专家,「魅族还有另一个Linux 大神…

react-router 页面离开 提示数据变更

以前项目使用 react-router2.0, 业务层面页面离开的时候需要弹出自己的弹出框,根据用户的操作,进行是否可以离开 试了几种方式都存在问题,实现的并不完美,没办法对用户点击浏览器后退支持的很好,除非是显示…

C语言系列文章之#和##

很久就知道了 # 和 ## ,但是都没怎么使用,直到最近的项目涉及到需要编写大量相似的代码之后才决定尝试使用 ## 去简化代码的书写。比如说我的项目需要控制四个通道的电机,四个通道的逻辑控制代码都是类似的,只是对应的硬件和数据信…

springboot 上传文件_基于SpringBoot的文件上传

在实际的企业开发中,文件上传是最常见的功能之一,SpringBoot集成了SpringMVC常用的功能,当然也包含了文件上传的功能,实现起来没有太多的区别。下面我们来讲解一下,使用SpringBoot如何实现多个文件上传操作。使用的环境…

Linux的 i2c 驱动框架分析

1.基本概念总线设备驱动模型,是Linux 内核的一个基础,基本理论可以说按照大企业的分工原则,每个人只要负责自己的事情,向其他部门给出标准的接口调用,后勤部就负责后勤工作,厨房有可能跟后勤部产生工作上的…

matlab fftshift_数字信号处理没有Matlab?用Python一样很爽

通常,在数字信号处理时,我们避不开matlab这个工具,因其它的强大的功能受到广大工程师的好评,也一直都是业界的不二之选。但是,matlab毕竟是商业软件,公司里如果使用的话,就需要支付高昂的费用。…

栈,C语言实现

什么是数据结构?数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是…

Camera摄像头工作原理

回想这工作的这几年,尝尽社会的辛酸艰难,从一开始什么都没有到30万,从30万到200万,从200万到1300万,不是炫耀,我只是想通过我自己的经历告诉我的朋友们「手机像素越高,拍的照片越清晰」摄像头结…

es6一维数组转二维数组_技术图文:Numpy 一维数组 VS. Pandas Series

背景Numpy 提供的最重要的数据结构是 ndarray,它是 Python 中 list 的扩展。Pandas 提供了两种非常重要的数据结构 Series和DataFrame。Numpy 中的一维数组与 Series 相似,一维数组只是提供了从0开始与位置有关的索引,而Series除了位置索引之…

unity UI事件

由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_sourcetuicool&utm_mediumreferral,并对相关问题进行解释。 我们最常用到的就是unity的button组件,…

电子工程学院的师兄弟姐们们,老师叫你们回家

昨天写了很长的文章,接收到推送的同学们应该也会很开心,但是由于我的原因,需要把文章删除「你们能想到的原因肯定不是我删文的原因」,但是呢,也因为这样,又可以重写一篇,刚好可以多加点内容。后…

auto.js停止所有线程_Java多线程编程基础知识 概念介绍,以及线程状态

一、进程进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动。操作系统中,几乎所有运行中的任务对应一条进程(Process)。一个程序进入内存运行,即变成一个进程。进程是处于运行过程中…