这将是一系列有关Go语言的教程。 第一篇文章有点无聊,并谈论了当前的Go生态系统和该语言的概述。 以及它的优点和缺点。
我已经使用Node.js多年,然后在我的最新项目中使用Go。 我 从10岁开始从事 编程 工作已有25年以上(猜测我的年龄?)。 我想与您分享我学到的东西。
之后,在下一篇文章中,我将在这里详细介绍每条信息。 本文是为您提供Go的快速概述,而无需深入了解特定于语言的详细信息和教程。
开源语言
它是Google的一种开源编程语言。 2011年首次稳定发布。
这是一种开源编程语言,这意味着什么?
好吧,它是由Google正如我所说的创建的。 但是,即使您也可以通过创建新建议,修复错误,使其更快来为它做出贡献。 就像是在你面前成长的生物。 如果您感到好奇,它的源代码托管在Github上 。
谁创建了围棋?
Robert Griesemer,Rob Pike和Ken Thompson。 他们在2007年左右开始设计该语言。该语言于2009年开源。 在此处了解更多信息 。
从Algol,Pascal,C,Modula,Oberon,Smalltalk和Newsqueak等语言启发设计灵感。
Go主要从Oberon语言继承而来,其语法是从C继承的。Go的OOP更像Smalltalk,但是在Go中,您可以将方法附加到任何类型。 并发主要来自于Newsqueak,Newsqueak也来自Rob Pike,也是从Hoare的CSP( 通信顺序过程 )论文中复制而来的。
他们为什么创建Go?
快速的语言(如C)难以使用且不安全。 编译速度,依赖关系和运行时错误很大。 诸如Java和Ruby之类的解释语言是安全的,但它们的运行速度较慢且具有许多依赖性,其中之一是解释器本身,即运行代码所需的虚拟机。 Javascript和Node.js太疯狂了; 尽管存在一些变通方法,但它是解释型,类型弱且不安全的(不能使用) 。
另外,例如,Java变得过于复杂和冗长,无法编写。 从语言在其内部构造的上下文中可以猜到很多关键字( 称为推断) 。 Ruby很高兴与之合作,但是它并不是为速度而设计的。 Javascript让您自由,狂奔并慢慢杀死您( 维护噩梦,回调地狱,无内置安全解决方案) 。
由于编译步骤的缘故,以C之类的编译语言进行编程并不快。 但是,使用诸如Ruby之类的解释语言很快,因为它是经过解释的,并且在保存源代码之后您可以快速查看结果。
Go消除了所有这些障碍,例如安全性,速度和易于编程
- 快速的结果:由于快速的编译,它像解释型语言一样工作。 您不会注意到它正在编译。 您会认为,就好像您正在使用像Ruby这样的解释型语言一起工作。
- 安全 :强类型和静态类型并收集垃圾。 强类型表示:您不能在任何地方传递任何类型的数据。 您需要明确。 静态类型表示:编译器知道每个变量的类型。
- 易于使用:简洁,明了且易于阅读。
- 现代化:语言本身对多核网络分布式应用程序等的内置支持。
去有成语
- “把事做好”
- “单向处理” : 称为惯用的Go代码。
- “明确” : 即使不是DRY,也要明确表示。 有时允许重复。
- “通过组成事物来构建事物” : 不要从其他事物继承,而 应由 更简单的组件组成系统。 虽然,它“继承”了Unix哲学的这一口头禅。
谁使用Go?
Go社区中至少有200万程序员。
最著名的公司是:Google,Docker,Dropbox,Heroku,Medium,Lyft,Uber 等 。
另请参阅: 转到2016年调查结果 。
使用Go的一些优点:
Go有史以来最可爱的吉祥物。 好吧……,让我们看看真正的优势。
已编译
- 没有虚拟机。 它直接编译为快速,快速和快速的机器代码 ( 我说过吗? )。
- 快速编译 。 编程语言设计旨在从一开始就考虑快速编译。
- 跨平台编译到OS X,Linux,Windows 、,和许多其他平台 。
- 编译后仅创建一个可执行文件输出,没有任何依赖关系,因此您可以将其上传到Go支持的任何位置并直接运行它。 或在上传代码后在此处进行编译。
安全
- 强和静态类型。
- 收集垃圾 。 它可以在您清除污垢并将整个垃圾收集系统集成到您的可执行二进制文件中。
- 可靠。 您实际上可以使用Go创建一个非常可靠的软件。 因为,固有的语言设计可防止您用它做糟糕的事情。 例如:它有指针,但是它们在大多数情况下都不像C语言那样危险,因为内存是由Go管理的,并且默认情况下不建议使用指针算法。
范式
- 这是一种命令式语言。 对某些人来说,这是有利有弊。
- 支持另一种面向对象的编程(OOP)。 我来自Java,C#,Ruby等许多OOP语言,但是Go从OOP获得了最佳实践,并允许您以Go方式进行不同的编程。
Go希望您编写不像其他OOP lang那样继承的东西。
- 支持接口 ( 如在OOP中) 。 这有助于构图。 多态性会响起钟声吗?
- 支持功能编程(FP)。
同时
- 内置并发 。 没有重头绪,只有 渠道 。
- 几乎所有内置在其标准库 ( 默认情况下是Go附带的库)中的东西,例如http提取,json解析和加密。 因此,这使您更快,并防止了生态系统中的碎片( 大部分时间) 。
工装
- 出色的内置命令行工具 。 自动设置代码格式,检查竞争条件问题,自动文档编制,测试覆盖率报告,重构工具等。
- 示例工具:
go fmt在每次保存后自动为您重新排列代码( 如果您在文本编辑器中配置了代码) 。
- 示例工具:
go lint提出了改进Go代码的建议。
$ go lint nocomment.go
nocomment.go:3:1: comment on exported function NoComment should be of the form "NoComment ..."
使用Go的一些缺点:
- 没有泛型支持。 实际上,尽管我将其放在此处,但我并不认为这是不利的。 因为,它使您可以创建非常明确的代码。 过多的抽象会带来难以理解代码的代价。 我没有进入Go中的泛型支持阵营。 但是, Go团队仍在考虑为该语言添加泛型支持 。
- 关于泛型( 一种) , Shawn McGrath撰写了一篇很棒的文章,介绍了Doom( 游戏 )源代码的美。 特别是,请阅读以下部分:“ 最小模板 ”, 我完全同意。
- 到处都是错误。 您需要显式检查代码中每个错误产生函数的错误。 再次,对我来说,这不是缺点,我喜欢Go程序的明确性。
有一些建议可以更改错误处理,但我根本不喜欢它们。
res, err := http.Client.Get(" http://ip.jsontest.com/ ")// there are no try-catch exceptions in Go, check errors explicitly
if err != nil {
return err
}
// ...
- 没有功能重载支持。
- 条规严格。 有时是优势,有时是劣势。 例如:当您更改结构时,可能会感到有点沉重。
- 与Node.js和Ruby等其他生态系统相比,软件包数量较少 。 但是,它正在增加。
一些更多的大脑食物链接:
- 我关于Go语言的其他帖子
- 罗伯特·格里塞默(Golf)的围棋演变
- 罗伯·派克(Rob Pike)的谚语
- Rob Pike设计的Go
- 简单性使Rob Pike复杂化
- 拉斯·考克斯的未来
- Rob Pike为软件工程服务的语言设计
你做到了! 谢谢阅读!
❤️ 请 加拍手! 在 推特 上分享 !
mostly 我主要在推特上发推文: @inancgumus 。
????我正在为Go创建在线课程: 加入我的新闻通讯 !
让我们每周保持联系以获取新教程和在线Go课程。
最初于 2017 年9月20日 在 medium.com 上的 “ I'm Learning Go” 出版物中发布, 单击此链接以订阅 该出版物。
From: https://hackernoon.com/about-go-language-an-overview-bba4b04f454b