mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:43:26 +08:00
Reformat
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
#1.2 语言的主要特性与发展的环境和影响因素
|
||||
##1.2.1 影响 Go 语言发展的早期编程语言
|
||||
正如“21 世纪的 C 语言”这句话所说,Go 语言并不是凭空而造的,而是和 C++、Java 和 C# 一样属于 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
|
||||
# 1.2 语言的主要特性与发展的环境和影响因素
|
||||
|
||||
## 1.2.1 影响 Go 语言发展的早期编程语言
|
||||
|
||||
正如 “21 世纪的 C 语言” 这句话所说,Go 语言并不是凭空而造的,而是和 C++、Java 和 C# 一样属于 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
|
||||
|
||||
在声明和包的设计方面,Go 语言受到 Pascal、Modula 和 Oberon 系语言的影响;在并发原理的设计上,Go 语言从同样受到 Tony Hoare 的 CSP(通信序列进程 *Communicating Squential Processes*)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。
|
||||
|
||||
@@ -12,14 +14,16 @@
|
||||
|
||||

|
||||
|
||||
图1.3 其它编程语言对 Go 语言的影响
|
||||
图 1.3 其它编程语言对 Go 语言的影响
|
||||
|
||||
##1.2.2 为什么要创造一门编程语言
|
||||
- C/C++的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
|
||||
## 1.2.2 为什么要创造一门编程语言
|
||||
|
||||
- C/C++ 的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
|
||||
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
|
||||
- 在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
|
||||
|
||||
##1.2.3 Go 语言的发展目标
|
||||
## 1.2.3 Go 语言的发展目标
|
||||
|
||||
Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。
|
||||
|
||||
因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
|
||||
@@ -44,14 +48,15 @@ Go 语言还能够在运行时进行反射相关的操作。
|
||||
|
||||
使用 `go install` 能够很轻松地对第三方包进行部署。
|
||||
|
||||
此外,Go 语言还支持调用由 C 语言编写的海量库文件(第3.9节),从而能够将过去开发的软件进行快速迁移。
|
||||
此外,Go 语言还支持调用由 C 语言编写的海量库文件(第 3.9 节),从而能够将过去开发的软件进行快速迁移。
|
||||
|
||||
## 1.2.4 指导设计原则
|
||||
|
||||
##1.2.4 指导设计原则
|
||||
Go语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。
|
||||
|
||||
这些方面的工作都是为了减少编码的工作量,甚至可以与 Java 的简化程度相比较。
|
||||
|
||||
Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分( ***译者注:代码是写给人看的,不是写给机器看的*** )。
|
||||
Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分( **译者注:代码是写给人看的,不是写给机器看的** )。
|
||||
|
||||
这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。
|
||||
|
||||
@@ -61,7 +66,8 @@ Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](h
|
||||
|
||||
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是 Go 语言的语法标准,你也可以在 `src/cmd/gc/go.y` 中查看到,这种语法标准在编译时不需要符号表来协助解析。
|
||||
|
||||
##1.2.5 语言的特性
|
||||
## 1.2.5 语言的特性
|
||||
|
||||
Go 语言从本质上(程序和结构方面)来实现并发编程。
|
||||
|
||||
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
|
||||
@@ -76,9 +82,10 @@ Go 语言使用静态类型,所以它是类型安全的一门语言,加上
|
||||
|
||||
Go 语言其实也有一些动态语言的特性(通过关键字 `var`),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的开发者们也具有很大的吸引力。
|
||||
|
||||
Go 语言支持交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行下 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言( ***译者注:.NET好像也支持吧?*** ),这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
|
||||
Go 语言支持交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行下 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
|
||||
|
||||
## 1.2.6 语言的用途
|
||||
|
||||
##1.2.6 语言的用途
|
||||
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
|
||||
|
||||
Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP](http://en.wikipedia.org/wiki/Complex_event_processing)),这项技术要求海量并行支持,高度的抽象化和高性能。当我们进入到物联网时代,CEP 必然会成为人们关注的焦点。
|
||||
@@ -91,13 +98,14 @@ Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP]
|
||||
|
||||
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到这个页面进行查看:[http://go-lang.cat-v.org/organizations-using-go](http://go-lang.cat-v.org/organizations-using-go)。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
||||
|
||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl( ***译者注:为什么我觉得这是"氯化钠"?*** )),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||
|
||||
Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
||||
|
||||
在 Google App Engine 中使用 Go 语言:2011年5月5日,官方发布了用于开发运行在 Google App Engine 上的 Web 应用的 Go SDK,在此之前,开发者们只能选择使用 Python 或者 Java。这主要是 David Symonds 和 Nigel Tao 努力的成果。目前最新的稳定版是基于 r60.3 的SDK 1.6.1,于 2011 年 12 月 13 日发布。当前 Go 语言的稳定版本是 Go 1( ***译者注:目前最新的稳定版是Go1.1*** )。
|
||||
在 Google App Engine 中使用 Go 语言:2011 年 5 月 5 日,官方发布了用于开发运行在 Google App Engine 上的 Web 应用的 Go SDK,在此之前,开发者们只能选择使用 Python 或者 Java。这主要是 David Symonds 和 Nigel Tao 努力的成果。目前最新的稳定版是基于 r60.3 的SDK 1.6.1,于 2011 年 12 月 13 日发布。当前 Go 语言的稳定版本是 Go 1( ***译者注:目前最新的稳定版是Go1.2.1*** )。
|
||||
|
||||
## 1.2.7 关于特性丢失
|
||||
|
||||
##1.2.7 关于特性丢失
|
||||
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
|
||||
|
||||
- 为了简化设计,不支持函数重载和操作符重载
|
||||
@@ -113,12 +121,14 @@ Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安
|
||||
|
||||
关于 Go 语言开发团队对于这些方面的讨论,你可以通过这个页面查看:[http://golang.org/doc/go_faq.html](http://golang.org/doc/go_faq.html)
|
||||
|
||||
##1.2.8 使用 Go 语言编程
|
||||
## 1.2.8 使用 Go 语言编程
|
||||
|
||||
如果你有其它语言的编程经历(面向对象编程语言,如:Java、C#、Object-C、Python、Ruby),在你进入到 Go 语言的世界之后,你将会像迷恋你的 X 语言一样无法自拔。Go 语言使用了与其它语言不同的设计模式,所以当你尝试将你的X语言的代码迁移到 Go 语言时,你将会非常失望,所以你需要从头开始,用 Go 的理念来思考。
|
||||
|
||||
如果你在至高点使用 Go 的理念来重新审视和分析一个问题,你通常会找到一个适用于 Go 语言的优雅的解决方案。
|
||||
|
||||
##1.2.9 小结
|
||||
## 1.2.9 小结
|
||||
|
||||
这里列举一些 Go 语言的必杀技:
|
||||
|
||||
- 简化问题,易于学习
|
||||
@@ -132,7 +142,8 @@ Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安
|
||||
- 文档全面
|
||||
- 免费开源
|
||||
|
||||
##链接
|
||||
## 链接
|
||||
|
||||
- [目录](directory.md)
|
||||
- 上一节:[起源与发展](01.1.md)
|
||||
- 下一章:[安装与运行环境](02.1.md)
|
||||
|
Reference in New Issue
Block a user