引言

当开始学习一门新的语言时,我总有一种既爱又恨的感觉。一方面,语言是我们做事情的基础,即使是小的变化,也会带来明显的效果。当一些事情恍然大悟时,会给如何编程带来持久的影响,并且能够重新定义你关于其他语言的期望。不利的一面是,语言设计是一个持续的过程。学习新的关键字、系统类型、编码风格、新的库、社区和范例,似乎很难解释这些需要付出许多努力。和那些我们必须学习的事相比较,花费时间去学习新语言常让人觉得不值得。

也就是说,我们必须愿意采用渐进的步骤,我们必须进步。因为语言是我们做事的基础。虽然语言一直在变化,但是它们趋向于一个更广阔的范围,并且会影响生产力、可读性、可靠性、性能、可测试性、依赖管理、错误处理、文档、性能分析、社区和标准库等等。难道说千刀万剐导致的死亡是一种积极方式?

这也给我们留下了一个重要的问题,为什么是go语言?对我来说,有两个令人信服的原因。第一,这是个相对简单的语言,它有一个相对简单的标准库。在很多方面,go语言渐进的性质,将简化一些我们过去几十年所看到的增加到语言上的复杂性。第二,对于大多数开发者,这将会补充你现有的语言工具库。

go被创建成一种系统语言(比如,操作系统和设备驱动),go是针对C/C++开发者的。据go核心开发组说,我可以确定是真的,应用程序开发者已经成为主要的go语言用户,而不是系统开发者。为什么呢?我不能代表所有的系统开发人员,但是,对于构建网站、服务和桌面应用等而言,主要归结于一类新兴系统的需求,这类系统介于低级系统应用和高级系统应用之间。

可能go语言有消息传递机制、带缓存、重计算数据分析、命令行接口、日志或监控,我不知道给go语言什么样的标签,但是在我的职业生涯中,由于系统持续增长的复杂性和成千上万种常用的并发方式,很明显,定制基础设施系统,是一个不断增长的需求。你可以用ruby或python或别的语言建立这样的系统(好多人这么做),但是这类系统受益于更严格类型系统和更高性能。同样地,你可以用go语言构建网站(也有好多人这么做),但是话又说回来,我还是喜欢通过表达性更强的Node或Ruby来实现这样的系统。

go语言还擅长于其他的领域。比如,当运行一个编译过的go程序时,它没有依赖性。你不必担心用户是否安装了ruby或者jvm,而且如果是这样,还要考虑是什么版本。出于这个原因,go作为命令行界面程序和其他并发类型应用程序的开发语言(例如日志收集),变得越来越流行。

坦白地说,学习go语言可以有效的利用你的时间。你不必花大量的时间去学习或者掌握它,你从你的努力中最终会得到一些实用的东西。

作者注解

我犹豫地写下这本书,有两个原因。首先,是由于go语言官方文档已经很完善了,特别是《Effective Go》。另一个原因是我在写一本介绍语言类的书时有点不安。当我写《The Little MongoDB Book》这本书时,我已经假设大多数读者理解关系型数据库和建模的基本知识。写《The Little Redis Book》时,你也可以做出类似的假设,即读者已经可以往redis中插入键值,然后从redis中查询该键值。

据我说知,前面这些章节,我不能再做出相同的假设。你花多长时间学习接受并理解它,这是个新的概念。比起go语言拥有的接口,其他人家是否需要更多?最终,如果你告诉我本书那些地方太浅或者太详细,考虑到这本书的价值,我会感到欣慰。

链接