那天在 V2EX 上看一个帖子,Java 的 super() 问半天没人讲得明白。学一门简单的语言,没有那么多复杂和不易掌握的特性,把时间放在更高层次的、更加通用的抽象上,比如设计,架构,分布式,算法上,不好吗?
我在 Twitter 上看到 Caddy server 的作者 Matt Holt 讲,Go 语言和 Go 社区,比他经历的任何其它一种语言 /社区教给他更多的 computing 知识(ref:
https://twitter.com/mholt6/status/911041650738073600)。我也是这种感受。简单说几点:1. Go 语言很简单,它的标准库,用 Rob Pike 的说法,very accessible,所以很容易理解和学习。
2. Go 解决问题的方式。某一年的 Go 社区的年度调查问卷,主要反映三个问题。包管理、错误处理和范型。就包管理来说,Russ Cox 至少写 10 篇博客(ref:
https://research.swtch.com/vgo)来阐述包管理所遇到的问题,以及解释 Go modules 的设计和解决方案。不仅如此,Go modules 还能提供对之前 gopath,dep,vendor 等之前方案的兼容和无缝升级,最终还提供了比其它包管理更加清晰和简单的使用体验。对于 Go 的范型支持,Ian Lance Taylor 和 Robert Griesemer 大约研究了三五年了,最近才提出了一个 draft design,而且还在不停修正,比如前几天 Robert 做了一个用 parameterized interface 来替代 contracts 的实验(ref:
https://twitter.com/bradfitz/status/1206446785373196288)。Go 的错误处理也是类似,渐进地推出 draft design 和 proposal,听社区的反馈,而后进行集成或者丢弃。Go 语言从 1.0 到现在 1.13 ,语言核心特性几乎没有发生什么变化,甚至到将来引入范型都能一直保持向后兼容。我举这几个示例是想说明,Go 核心开发者( Google )解决事情的方式,以及他们对待问题的态度,真的教给我们很多。
3. 写 Go 真的很快乐,前提是你认可 Go 语言所呈现出来的哲学。一门比 Python 更好地继承了 Zen of Python 哲学的语言(ref:
https://go-proverbs.github.io)。Go 的 package 的概念比我见过的其他语言的包的概念都要简单,用首字母大小写导出替代 public/private,松耦合的 interface 实现,struct composition 代替 Class (从而没有多重继承),甚至只有一种循环关键字 for,简单的并发,对单元测试的直接集成( Test_ or Example_),'go' cmd line tool 对核心功能的集成(编译、性能分析、错误检查、格式化、包管理、测试等)。对于很多人争议的 Go 的错误处理(if err != nil),Go 开发者也承认这不太「完美」,也在着手解决,但他们认为这种方式相比较 Try-Catch 首先是「正确」的((ref:
https://devblogs.microsoft.com/oldnewthing/20040422-00/?p=39683)),所以 Go 采用的是正确了方式,即使一开始看起来麻烦一点。所有这些 Go 的设计和特性呈现出来的东西,如果让我用一个词来形容,那就是“合理”。这是一门合理设计的语言,专注于解决大规模软件的「工程性」问题,而不是另造一门「创新」的语言(ref:
https://changelog.com/gotime/100)。4. Go 的生态。Cloud Native 生态大部分开源项目都是用 Go 写的,包括 Kubernetes, Istio, Docker, CoreNS, Prometheus 等,Envoy 除外。Cloud Native 及 Service Mesh 的影响是,将来用什么语言开发业务不再重要,service mesh 会为各种语言开发的服务提供统一的抽象和上层管理,业务的归业务,管理的归管理。如果说基础设施层是 C 和 C++ 或者将来的 Rust 的,那么中间 DevOps 层就是 Go 的,再上面是其他语言的业务层。那天看到一条评论说,istio 的微服务管理对于 Spring Cloud 的微服务管理是降维打击,因为一个是在 DevOps 层解决问题,一个在语言层解决问题。当然 Java 当前生态是巨大的,有很多厉害的开源中间件,比如 ElasticSearch,Kafa,大数据生态等。那天看 Go 的未来规划,有一个重点是在近几年推动 Go 语言作为大学的教学语言。作为一门才诞生十年的语言,取得这样的成就已经很了不起的,但更可以预见将来 Go 生态会有更大的发展,也会开拓出其他的中间件生态,比如 TiDB 就是一个例子。
所以,以上说了这么多,总结起来就是,Go 语言容易学,也容易用,设计合理,核心开发者靠谱,社区很繁荣,生态在发展,现在上车最好不过了。