Go Faq回答Go目的、历史、语言背景等情况

持续的Go+Python!!

1. 项目的目的是什么?

在Go成立之初,就在十年前,编程世界与今天不同。生产软件通常用C ++或Java编写,GitHub不存在,大多数计算机还没有多处理器,除了Visual Studio和Eclipse之外,很少有IDE或其他高级工具可用,更不用说在Internet上免费了。

与此同时,我们对使用我们使用的语言开发服务器软件所需的过度复杂性感到沮丧。计算机变得非常快,因为C,C ++和Java等语言最初是开发的,但编程行为本身并没有提高。此外,很明显,多处理器正在变得普及,但大多数语言对于有效和安全地编程它们几乎没有帮助。

我们决定退后一步,思考随着技术的发展,未来几年主要问题将主导软件工程,以及新语言如何帮助解决这些问题。例如,多核CPU的兴起认为语言应该为某种并发或并行提供一流的支持。并且为了使资源管理在大型并发程序中易于处理,需要进行垃圾收集或至少某种安全的自动内存管理。

这些考虑导致 了 Go 的一系列讨论,首先是作为一组思想和需求,然后作为一种语言。Go的一个首要目标是通过启用工具,自动执行代码格式化等普通任务,以及消除处理大型代码库的障碍来帮助工作程序员。

关于Go的目标以及如何满足或至少接近它们的更广泛的描述可以在 Go go:软件工程服务中的语言设计一文中找到。

2. 项目的历史是什么?

Go于2009年11月10日成为一个公共开源项目。

3. 语言叫Go或Golang吗?

该语言称为Go。该“golang”绰号的出现是因为该网站是 golang.org,不go.org,这是不提供给我们。但是,许多人使用golang名称,它作为标签很方便。例如,该语言的Twitter标签是“##golang”。无论如何,语言的名称都是简单的Go。

旁注:尽管 官方徽标 有两个大写字母,但语言名称是Go,而不是GO。

4. 为什么要创建一门新语言

Go诞生于对我们在Google工作的现有语言和环境感到沮丧。编程变得太难了,语言的选择部分归咎于此。人们必须选择有效的编译,高效的执行或编程的简易性; 这三种语言都没有相同的主流语言。程序员可以通过迁移到动态类型语言(如Python和JavaScript而不是C ++,或者在较小程度上,Java)来选择安全性和效率。

我们并不孤单。经过多年的编程语言非常安静的环境,Go是几种新语言中的第一种 - Rust,Elixir,Swift等,它们使编程语言开发成为一个活跃的,几乎是主流的领域。

Go通过尝试将解释的动态类型语言的编程简易性与静态类型的编译语言的效率和安全性相结合来解决这些问题。它还旨在实现现代化,支持网络和多核计算。最后,使用Go的目的很快:在一台计算机上构建一个大型可执行文件最多需要几秒钟。为了实现这些目标,需要解决许多语言问题:一种富有表现力但轻量级的系统; 并发和垃圾收集; 严格依赖规范; 等等。图书馆或工具无法很好地解决这些问题。需要一种新语言。

5. Go的祖先是什么?

Go主要是C系列(基本语法),Pascal / Modula / Oberon系列(声明,包)的重要输入,以及受Tony Hoare的CSP启发的语言的一些想法,如Newsqueak和Limbo(并发)。但是,它是一种全新的语言。在每个方面,语言都是通过思考程序员做什么以及如何编程来设计的,至少是我们做的编程类型,更有效,这意味着更多的乐趣。

6. 设计中的指导原则是什么?

设计Go时,Java和C ++是编写服务器最常用的语言,至少在Google上是这样。我们觉得这些语言需要太多的记账和重复。一些程序员的反应是转向更加动态,流畅的语言,如Python,但代价是效率和类型安全。我们认为应该可以用单一语言提高效率,安全性和流动性。

试图减少单词的两种意义上的输入量。在整个设计过程中,我们一直在努力减少混乱和复杂性。没有前向声明和头文件; 一切都被宣布一次。初始化具有表现力,自动化和易于使用。语法干净且关键字轻松。foo.Foo* myFoo = new(foo.Foo)使用:= declare-and-initialize构造通过简单类型派生减少了Stuttering()。也许最根本,没有类型层次:类型只是是,他们没有宣布他们的关系。这些简化使得Go具有表现力而又易于理解,而不会牺牲,精益求精。

另一个重要原则是保持概念正交。可以针对任何类型实施方法; 结构表示数据,而接口表示抽象; 等等。正交性使得更容易理解当事物结合时会发生什么。

7. 为什么Go没有泛型类型?

Go旨在用作编写易于维护的服务器程序的语言。(有关更多背景信息,请参阅此文章。)设计主要集中在可伸缩性,可读性和并发性等方面。多态编程对于当时语言的目标似乎并不重要,因此为简单起见而省略。

语言现在更加成熟,并且可以考虑某种形式的通用编程。但是,仍有一些警告。

泛型很方便,但它们在类型系统和运行时的复杂性方面付出了代价。我们还没有找到一种能够与复杂性成比例的设计,尽管我们会继续考虑它。同时,Go的内置映射和切片,以及使用空接口构造容器(具有显式拆箱)的能力意味着在许多情况下可以编写执行泛型将启用的代码,如果不太顺利的话。

这个话题仍未解决。要查看以前几次尝试为Go设计一个好的泛型解决方案,请参阅 此提案。

8. 为什么Go没有异常?

我们认为将异常耦合到控制结构(如try-catch-finally习语)会导致代码错综复杂。它还倾向于鼓励程序员标记太多普通错误,例如未能打开文件,这是特殊的。

Go采用不同的方法。对于简单的错误处理,Go的多值返回使得报告错误变得容易,而不会使返回值超载。 规范错误类型与Go的其他功能相结合,使错误处理变得愉快,但与其他语言完全不同。

Go还有一些内置功能,可以在真正特殊的条件下发出信号并从中恢复。恢复机制仅作为函数状态在错误发生后被拆除的一部分执行,这足以处理灾难但不需要额外的控制结构,并且如果使用得当,可以产生干净的错误处理代码。

有关详细信息,请参阅Defer,Panic和Recover文章。此外,错误是值博客文章描述了一种在Go中干净地处理错误的方法,通过演示,因为错误只是值,Go的全部功能可以部署在错误处理中。

9. Go是一种面向对象的语言吗?

是的,不是。尽管Go具有类型和方法,并且允许面向对象的编程风格,但是没有类型层次结构。Go中“接口”的概念提供了一种我们认为易于使用且在某些方面更为通用的不同方法。还有一些方法可以将类型嵌入到其他类型中,以提供类似但不完全相同的子类化。此外,Go中的方法比C ++或Java更通用:可以为任何类型的数据定义它们,甚至是内置类型,例如普通的“未装箱”整数。它们不限于结构(类)。

此外,缺少类型层次结构使得Go中的“对象”比C ++或Java等语言更轻量级。