你没据说过的Go语言惊人优势

链客,专为开发者而生,有问必答!编程

此文章来自区块链技术社区,未经容许拒绝转载。json

图片描述

你没据说过的Go语言惊人优势
做者:Kirill Rogovoy 2018-09-29 来源:51CTO
【新品产上线啦】51CTO播客,随时随地,碎片化学习安全

在这篇文章中,我将讨论为何你须要尝试一下 Go 语言,以及应该从哪里学起。服务器

Go 语言是多是最近几年里你常常听人提及的编程语言。尽管它在 2009 年已经发布了,但它最近才开始流行起来。网络

根据 Google 趋势,Go 语言很是流行。并发

这篇文章不会讨论一些你常常看到的 Go 语言的主要特性。框架

相反,我想向您介绍一些至关小众但仍然很重要的功能。只有在您决定尝试 Go 语言后,您才会知道这些功能。编程语言

这些都是表面上没有体现出来的惊人特性,但它们能够为您节省数周或数月的工做量。并且这些特性还可使软件开发更加愉快。函数式编程

阅读本文不须要任何语言经验,因此没必要担忧你还不了解 Go 语言。若是你想了解更多,能够看看我在底部列出的一些额外的连接。函数

咱们将讨论如下主题:

GoDoc
静态代码分析
内置的测试和分析框架
竞争条件检测
学习曲线
反射
Opinionatedness
文化
请注意,这个列表不遵循任何特定顺序来讨论。

GoDoc
Go 语言很是重视代码中的文档,因此也很简洁。

GoDoc 是一个静态代码分析工具,能够直接从代码中建立漂亮的文档页面。GoDoc 的一个显著特色是它不使用任何其余的语言,如 JavaDoc、PHPDoc 或 JSDoc 来注释代码中的结构,只须要用英语。

它使用从代码中获取的尽量多的信息来概述、构造和格式化文档。它有多而全的功能,好比:交叉引用、代码示例,并直接连接到你的版本控制系统仓库。

而你须要作的只有添加一些像 // MyFunc transforms Foo into Bar 这样子的老牌注释,而这些注释也会反映在的文档中。你甚至能够添加一些经过网络界面或者在本地能够实际运行的 代码示例。

GoDoc 是 Go 的惟一文档引擎,整个社区都在使用。这意味着用 Go 编写的每一个库或应用程序都具备相同的文档格式。从长远来看,它能够帮你在浏览这些文档时节省大量时间。

例如,这是我最近一个小项目的 GoDoc 页面:pullkee — GoDoc。

静态代码分析
Go 严重依赖于静态代码分析。例如用于文档的 godoc,用于代码格式化的 gofmt,用于代码风格的 golint,等等。

它们是如此之多,甚至有一个总揽了它们的项目 gometalinter ,将它们组合成了单一的实用程序。

这些工具一般做为独立的命令行应用程序实现,并可轻松与任何编码环境集成。

静态代码分析实际上并非现代编程的新概念,可是 Go 将其带入了绝对的范畴。我没法估量它为我节省了多少时间。此外,它给你一种安全感,就像有人在你背后支持你同样。

建立本身的分析器很是简单,由于 Go 有专门的内置包来解析和加工 Go 源码。

你能够从这个连接中了解到更多相关内容: GothamGo Kickoff Meetup: Alan Donovan 的 Go 静态分析工具。

内置的测试和分析框架
您是否曾尝试为一个从头开始的 JavaScript 项目选择测试框架?若是是这样,你或许会理解经历这种过分分析analysis paralysis的痛苦。您可能也意识到您没有使用其中 80% 的框架。

一旦您须要进行一些可靠的分析,问题就会重复出现。

Go 附带内置测试工具,旨在简化和提升效率。它为您提供了最简单的 API,并作出最小的假设。您能够将它用于不一样类型的测试、分析,甚至能够提供可执行代码示例。

它能够开箱即用地生成便于持续集成的输出,并且它的用法很简单,只需运行 go test。固然,它还支持高级功能,如并行运行测试,跳过标记代码,以及其余更多功能。

竞争条件检测
您可能已经据说了 Goroutine,它们在 Go 中用于实现并发代码执行。若是你不曾了解过,这里有一个很是简短的解释。

不管具体技术如何,复杂应用中的并发编程都不容易,部分缘由在于竞争条件的可能性。

简单地说,当几个并发操做以不可预测的顺序完成时,竞争条件就会发生。它可能会致使大量的错误,特别难以追查。若是你曾经花了一天时间调试集成测试,该测试仅在大约 80% 的执行中起做用?这多是竞争条件引发的。

总而言之,在 Go 中很是重视并发编程,幸运的是,咱们有一个强大的工具来捕捉这些竞争条件。它彻底集成到 Go 的工具链中。

您能够在这里阅读更多相关信息并了解如何使用它:介绍 Go 中的竞争条件检测 - Go Blog。

学习曲线
您能够在一个晚上学习全部的 Go 语言功能。我是认真的。固然,还有标准库,以及不一样的,更具体领域的最佳实践。可是两个小时就足以让你自信地编写一个简单的 HTTP 服务器或命令行应用程序。

Go 语言拥有出色的文档,大部分高级主题已经在他们的博客上进行了介绍:Go 编程语言博客。

比起 Java(以及 Java 家族的语言)、Javascript、Ruby、Python 甚至 PHP,你能够更轻松地把 Go 语言带到你的团队中。因为环境易于设置,您的团队在完成第一个生产代码以前须要进行的投资要小得多。

反射
代码反射本质上是一种隐藏在编译器下并访问有关语言结构的各类元信息的能力,例如变量或函数。

鉴于 Go 是一种静态类型语言,当涉及更松散类型的抽象编程时,它会受到许多各类限制。特别是与 Javascript 或 Python 等语言相比。

此外,Go 没有实现一个名为泛型的概念,这使得以抽象方式处理多种类型更具挑战性。然而,因为泛型带来的复杂程度,许多人认为不实现泛型对语言其实是有益的。我彻底赞成。

根据 Go 的理念(这是一个单独的主题),您应该努力不要过分设计您的解决方案。这也适用于动态类型编程。尽量坚持使用静态类型,并在确切知道要处理的类型时使用接口interface。接口在 Go 中很是强大且无处不在。

可是,仍然存在一些状况,你没法知道你处理的数据类型。一个很好的例子是 JSON。您能够在应用程序中来回转换全部类型的数据。字符串、缓冲区、各类数字、嵌套结构等。

为了解决这个问题,您须要一个工具来检查运行时的数据并根据其类型和结构采起不一样行为。反射Reflect能够帮到你。Go 拥有一流的反射包,使您的代码可以像 Javascript 这样的语言同样动态。

一个重要的警告是知道你使用它所带来的代价 —— 而且只有知道在没有更简单的方法时才使用它。

你能够在这里阅读更多相关信息: 反射的法则 — Go 博客.

您还能够在此处阅读 JSON 包源码中的一些实际代码: src/encoding/json/encode.go — Source Code

Opinionatedness(专制独裁的 Go)
顺便问一下,有这样一个单词吗?

来自 Javascript 世界,我面临的最艰巨的困难之一是决定我须要使用哪些约定和工具。我应该如何设计代码?我应该使用什么测试库?我该怎么设计结构?我应该依赖哪些编程范例和方法?

这有时候基本上让我卡住了。我须要花时间思考这些事情而不是编写代码并知足用户。

首先,我应该注意到我彻底知道这些惯例的来源,它老是来源于你或者你的团队。不管如何,即便是一群经验丰富的 Javascript 开发人员也很容易发现他们在实现相同的结果时,而大部分的经验倒是在彻底不一样的工具和范例上。

这致使整个团队中出现过分分析,而且使得个体之间更难以相互协做。

嗯,Go 是不一样的。即便您对如何构建和维护代码有不少强烈的意见,例如:如何命名,要遵循哪些结构模式,如何更好地实现并发。但你只有一个每一个人都遵循的风格指南。你只有一个内置在基本工具链中的测试框架。

虽然这彷佛过于严格,但它为您和您的团队节省了大量时间。当你写代码时,受一点限制其实是一件好事。在构建新代码时,它为您提供了一种更直接的方法,而且能够更容易地调试现有代码。

所以,大多数 Go 项目在代码方面看起来很是类似。

文化
人们说,每当你学习一门新的口语时,你也会沉浸在说这种语言的人的某些文化中。所以,您学习的语言越多,您可能会有更多的变化。

编程语言也是如此。不管您未来如何应用新的编程语言,它总能给你带来新的编程视角或某些特别的技术。

不管是函数式编程,模式匹配pattern matching仍是原型继承prototypal inheritance。一旦你学会了它们,你就能够随身携带这些编程思想,这扩展了你做为软件开发人员所拥有的问题解决工具集。它们也改变了你阅读高质量代码的方式。

而 Go 在这方面有一项了不得的财富。Go 文化的主要支柱是保持简单,脚踏实地的代码,而不会产生许多冗余的抽象概念,并将可维护性放在首位。大部分时间花费在代码的编写工做上,而不是在修补工具和环境或者选择不一样的实现方式上,这也是 Go 文化的一部分。

Go 文化也能够总结为:“应当只用一种方法去作一件事”。

一点注意事项。当你须要构建相对复杂的抽象代码时,Go 一般会妨碍你。好吧,我会说这是简单的权衡。

若是你真的须要编写大量具备复杂关系的抽象代码,那么最好使用 Java 或 Python 等语言。然而,这种状况却不多。

在工做时始终使用最好的工具!

总结
你或许以前据说过 Go,或者它暂时在你圈子之外的地方。但不管怎样,在开始新项目或改进现有项目时,Go 多是您或您团队的一个很是不错的选择。

这不是 Go 的全部惊人的优势的完整列表,只是一些被人低估的特性。

请尝试一下从 Go 之旅 来开始学习 Go,这将是一个使人惊叹的开始。

相关文章
相关标签/搜索