首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go语言中那些你未曾听说过的惊人优点

在过去的几年里你可能多次听到 Go 这门编程语言。尽管它的历史能够追溯到 2009 年,但是在最近的几年它的人气才开始飙升。

这篇文章并不介绍 Go 语言中那几个你经常看到的卖点。

相反,我将向你展示 Go 里面那些微小但意义非凡的特性,这些特性只有你在决定尝试 Go 之后才能了解到。

这些令人惊叹的特性在表面上看毫不起眼,但却能实实在在得帮你节省数周或者数月的工作量,让开发者更多地享受到软件开发的乐趣。

如果你是一个 Go 语言的新手,也请不用担心,这篇文章不需要任何与 Go 相关的语言知识。同时我也在文章的底部添加了几个链接,以便让你学习更多的内容。

接下来我们将会阅读到以下几个主题:

GoDoc

静态代码分析

内置的测试和性能分析框架

竞态条件检测

学习曲线

反射

偏执

文化

请注意,上面的列表并不遵循任何特定的顺序。

GoDoc

Go 非常重视代码中的文档,所以编写Go语言项目的文档非常简单。

GoDoc是一个静态代码分析工具,可以直接通过你的代码生成美观的文档页面。GoDoc 一个卓越的地方在于,你不需要在代码中像 JavaDoc、PHPDoc 或者 JSDoc 那样使用额外的语法来构建注释,一切都是英文。

它通过在代码中获取尽可能多的信息,然后来构建大纲、结构以及对文档做格式化。它也具有所有花里胡哨的功能,例如交叉引用、示例代码等,而且能够直接链接到你的版本控制系统的仓库里。

所有你能做的就是添加一个优质的注释,例如,它们将会被引用到文档里。你甚至能够添加示例代码,然后在Web接口或者本地运行。

GoDoc 是整个 Go 社区唯一使用的文档引擎。这意味着所有 Go 编写的库或者应用程序都拥有相同文档格式。从长远来看,浏览这些文档时可以节省大量的时间。

这里有个例子,我最近的宠物项目的 GoDoc 页面:pullkee — GoDoc.

静态代码分析

Go 非常依赖静态代码分析。包括用于文档的godoc、代码格式化的gofmt、代码风格标记的golint,还有其他更多的例子。

有个叫做gometalinter的项目,将上面提到的这类程序组合成一个单独的工具。

这些工具大多都实现为独立的命令行应用程序,并且能够很容易得与任何开发环境整合在一起。

静态代码分析实际上并不是现代编程的新东西,但 Go 将它更进一步。我无法估计它为我节省了多少时间。同时,它也能给你安全感,就如同有人在背后做你的后盾。

创造你自己的分析器也很简单,Go 内置了专用的包用来分析和使用 Go 源码。

你可以在这个 talk 中学到更多:GothamGo Kickoff Meetup: Go静态分析工具 by Alan Donovan.

内置的测试和性能分析框架

你有没有试过为从零开始的 Javascript 项目选择一个测试框架?如果有的话,可能就理解选择是多么令人纠结了。你也许已经意识到,你所选择的框架80%的功能你都不会用到。

当你需要做一些可靠性分析的时候,这个问题会再次出现在你面前。

Go 提供了一个内置的测试工具,旨在简化使用流程和提高工作效率。它尽可能为您提供了最简单的 API,并做出了最小的假设。你可以用它做各种类型的测试、性能分析,甚至提供可以运行的代码例子。

它默认提供对 CI 友好的输出,并且通常情况下只需要简单得使用运行即可。当然,它也支持并行测试、跳过标记以及其他更多的高级特性。

竞态条件检测

你可能了解过 Goroutines,它用来在 Go 中实现代码的并发执行。如果你还没了解过,这里有一个非常简短的解释。

无论使用哪种特定的技术,在复杂的程序中进行并发编程从来都不是一件容易的事,部分原因就在于可能存在的竟态条件。

简单来说,当多个并发操作以不可预知的顺序执行时,竟态条件就会发生,这可能会导致许多难以追踪的 bug。有没有花掉一整天的时间,去调试一个只能执行80%的集成测试的经历?这很有可能就是竟态条件引起的。

正因为如此,在 Go 里面并发编程是被严肃对待的一件事。Go 的工具链里面集成了一个强有力的工具,我们可以用它来捕获那些竟态条件。

你可以从这里了解更多以及学习如何使用它:Go竟态条件介绍— The Go Blog

学习曲线

我可以负责任得说,你只用一个晚上的时间就能学习完Go的所有语言特性。当然,还需要学习标准库、在不同特定领域中的最佳实践等,但两个小时完全足够你充满自信得编写一个HTTP服务,或者一个命令行程序。

官方提供了一份绝佳的文档,并且大部分高级主题也在它们的博客中有过介绍

将 Go 引入你的团队中要比 Java 系列、JavaScript、Ruby、Python、甚至 PHP 容易得多。开发环境很容易搭建,在正式代码编写之前你需要做的事少了很多。

反射

代码反射本质上是一种能力,可以让你获得各种不同的关于语言结构的元信息,比如变量和函数。

由于 Go 是一门静态语言,所以当涉及到更为送散的抽象编程时会受到一系列限制,尤其是和 Javascripth 或者 Python 比较时。

此外,由于 Go 没有关于泛型的概念,使用多类型的抽象方式进行编码时会受到更多挑战。然而也有许多人认为,相比于因为引入泛型导致语言复杂性增加,暂时舍弃泛型对语言会更有益。我完全同意。

根据 Go 的哲学(这是另外一个独立的话题),你应该尽量不要对你的解决方案进行过度设计。这也适用于动态语言。尽可能得使用静态类型,并且当你知道确切的类型时则使用接口。在 Go 中接口无处不在并且非常强大。

然而,在有些情况下你无法确定正在面对哪些数据。一个典型的例子是 JSON,您需要在应用程序中来回转换所有类型的数据,字符串,缓冲区,各种数字,嵌套结构等等。

为了避免这一切,你需要一个工具用来检查所有运行中的数据,然后根据其不同的类型和结构采取不同的行为。这个工具就是反射,Go 拥有一个优秀的反射包,用来让你的代码像 Javascript 一样动态运行。

但是也有一个警告:你必须知道反射的代价——只有在没有更加简单的方法时才使用它。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180212B0PABW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券