项目的目的是什么?
在Go诞生之初,也就是十年之前,编程的世界与今天有所不同。 生产软件通常用C ++或Java编写,GitHub是不存在的,大多数计算机还没有多核处理器,像Visual Studio和Eclipse这些工具或其他可用的高级工具几乎都没有,更不用说互联网上免费的了 。
于此同时,我们对于我们用来开发服务器软件所使用的语言的过度复杂性感到沮丧。 自从类似c,c++和java语言的首先开发以来计算机已经变得非常快了,但是编程本身并没有进步太多。 同样,很明显随着多核处理器的变得普遍但大多数的语言对有效和安全的编程几乎没有什么改进。
我们决定退后一步去思考在未来几年中随着技术的发展哪些主要问题将主导软件工程,以及怎样一种新的语言如何帮助解决这些问题。 例如,多核CPU的兴起表明,一种语言应为某种并发性或并行性提最好地支持。 和大型并发程序中资源易于管理的,能垃圾回收或至少某种安全的自动内存管理。
这些思考导致了一系列的讨论,由此引发了Go,首先是作为一组想法和渴望,然后是当作一种语言。
总体目标是GO通过可用的工具,自动化普通平常的任务如代码格式化以及消除在大型代码库上工作的障碍为工作中的程序员提供更多的帮助。
Google的Go语言:软件工程服务中的语言设计一文中提供了关于Go语言的目标以及如何实现或至少达到这些目标的更广泛的描述。
一篇更为丰富描述GO的目标以及如何实现或至少达到这些目标的,可见于这篇文章中Go at Google: Language Design in the Service of Software Engineering.
项目的历史?
Robert Griesemer,Rob Pike和Ken Thompson于2007年9月21日开始在白板上草拟一种新语言的目标。几天之内,这些目标就已经定下执行的计划以及它将会是一个合理的想法。并打算占用工作上的一部分时间去做这件跟工作不相关的事情。 到2008年1月,Ken开始研究一种编译器用来探索哪些想法。 其输出的是生成的c代码。 到年中,该语言已成为一个全职的项目并且在生产的编译器上被设定足够多的尝试。 2008年5月, Ian Taylor使用规范草案独立地为Go开启了GCC接口。 Russ Cox于2008年末加入,并帮助将语言和库从原型转变为现实。
Go于2009年11月10日成为一个公共开源项目。来自社区的无数人贡献了他们的想法,讨论以及代码。
现在,全球有数以百万计的Go程序员(土拨鼠),而且每天不断增多。 Go的成功远远超出了我们的期望。
土地鼠吉祥物的来源?
吉祥物和logo由RenéeFrench设计,他还设计了Glenda-the Plan 9 bunny。 一篇关于土地鼠的博客文章解释了它是如何从几年前RenéeFrench用来设计WFMU T恤中衍生而来的。logo和吉祥物受知识共Creative Commons Attribution 3.0许可的保护。
地鼠有一个模型表图解了它的特征以及如何去正确表示它们。模型表首先在Renée于2016年Gophercon的一次演讲中talk展示。它有独特的特征;它是GO地鼠,而不是任何过去的地鼠。
这门语言叫做Go还是Golang?
该语言称为Go。 之所以出现“ golang”这个绰号,是因为该网站是golang.org,而不是go.org,go.org对于我们是用不了的。由于许多人都使用golang名称,它很容易用作了标签。 例如,该语言的Twitter标记是“ #golang”。 不管怎样,该语言的名称原本就是Go。
附注:尽管官方logo有两个大写字母,但语言名称写为Go,而不是GO。
你们为什么开创一种新语言?
Go诞生是我们出于对在谷歌工作中所使用现存的语言和环境感到沮丧。编程变得太困难了,部分原因是对于语言的选择。 人们必须选择高效的编译,高效的执行或易于编程。 在同一主流编程语言中不同时有这三种特性。 程序员宁愿通过迁移到动态类型的语言例如Python和JavaScript而不是c++或者较小程度上的Java来简化安全和效率。
我们并不孤单。 经过多年的编程语言的一片平静之后,Go成为了几种新语言Rust,Elixir,Swift等中的第一种,这使编程语言的开发再次成为活跃的,几乎是主流的领域。
Go通过尝试将解释型动态类型语言的编程易用性与静态类型编译语言的效率和安全性相结合解决了这些问题。 它还旨在成为现代化的,并支持网络和多核计算。 总之使用Go的目的是要快:在单台计算机上构建大型可执行文件最多需要几秒钟。 为了实现这些目标,需要解决许多语言问题:一个富有表现力但轻量级的系统; 并发和垃圾回收; 严格的依赖规范; 等等。 库或工具无法很好地解决这些问题; 需要一种新的语言。
Go at Google这篇文章讨论了Go语言设计背后的背景和动机,并提供了有关此FAQ中提供的许多答案的更多详细信息。
Go的前身是?
Go主要属于C族(基本语法),其中大量的引入Pascal / Modula / Oberon族(在声明,程序包),此外,受到Tony Hoare的CSP启发了一些语言灵感,例如Newsqueak和Limbo(并发)。 但是,这是一门全新的语言。 通过考虑程序员的所做以及如何使去编写程序,go在各个方面都被精心设计,至少我们设计的这种语言会更有效,也就会更有趣。
设计的指导原则是什么?
在设计Go时,Java和C ++是编写服务器的最常用语言,至少在Google来说。 我们认为这些语言需要太多的标签和副本。 一些程序员反应通过转到更加动态流畅的语言比如Python,但需要牺牲效率和类型安全为代价。 但我们认为同一种语言要同时具有效率,安全性和流动性。
Go尝试减少两种词义的打字量。 在整个设计过程中,我们一直努力减少混乱和复杂性。 没有前置声明,也没有头文件; 一切都只需声明一次。 初始化是富有表现力,自动且易于使用的。 语法简洁明了。 这种(foo.Foo * myFoo = new(foo.Foo))方式通过使用:=声明并初始化结构简化了类型派生。 也许最根本的是,没有类型层次结构:类型仅是类型,它们不必声明它们的关系。 这些简化使Go富于表达而又易于理解,而不会牺牲复杂性。
另一个重要原则是保持正交的概念。任何类型都可以实现方法; 结构代表数据,而接口代表抽象; 等等。 正交性使人们更容易理解事物组合时会发生什么。