在并发原理的设计上,Go 语 言从同样受到 Tony Hoare 的 CSP(通信序列进程 Communicating Squential Processes)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。
在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语 言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但 执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程 变得更加有乐趣,而不是在艰难抉择中痛苦前行。
因此,Go 语言是一门类型安全和内存安全的编程语言(高效快速的垃圾回收:使用了一个简单的标记-清除算法)。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机。
众所周知,代码的可读性是软件工程里最重要的一部分( 译者注:代码是写给人看的,不是写给机器看的 )。
Go 语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。
Go 语言从本质上(程序和结构方面)来实现并发编程,它通过接口(interface)的 概念来实现多态性。
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。Go 语言其实也有一些动态语言的特性(通过关键字 var )。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
第一门完全支持 UTF-8 的编程语言。
值得注意的是,因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。
为了简化设计,不支持函数重载和操作符重载
为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
Go 语言通过另一种途径实现面向对象设计来放弃类和类型的继承
不支持动态加载代码
不支持动态链接库
不支持泛型
通过 recover 和 panic 来替代异常机制
不支持断言
不支持静态变量
下面列举了 Go 代码中会使用到的 25 个关键字或保留字:
| 序号 | 关键字 介绍 | | ---- | ----------- | ------------------------------------------------------------------------------------------------------ | | 1 | break | 用于跳出循环 | | 2 | case | 选择结构标签 | | 3 | chan | 定义 channel | | 4 | const | 定义常量 | | 5 | continue | 跳过本次循环 | | 6 | default | 用于选择结构的默认选项(switch、select) | | 7 | defer | 延迟执行内容(收尾工作)有点类似 C++的析构,但是它是再函数结尾的时候去执行(也就是栈即将被释放的时候) | | 8 | else | 选择结构-否则 | | 9 | fallthrough | 如果 case 带有 fallthrough,程序会继续执行下一条 case,不会再判断下一条 case 的值 | | 10 | for | 循环 | | 11 | func | 定义函数 | | 12 | go | 并发执行 | | 13 | goto | 跳转语句 | | 14 | if | 选择结构-如果 | | 15 | import | 导入包 | | 16 | interface | 定义接口 | | 17 | map | Map 是一种无序的集合,我们可以像迭代数组和切片那样迭代它,它是使用 hash 表来实现的。 | | 18 | package | 包管理 | | 19 | range | 从 slice、map 等结构中取元素 | | 20 | return | 用于在函数内部,退出函数执行过程 | | 21 | select | go 语言特有的 channel 选择结构 | | 22 | struct | 定义结构体 | | 23 | switch | 选择结构 | | 24 | type | 定义类型 | | 25 | var | 定义变量 |
除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符,其中包含了基本类型的名称和一些基本的内置函数
内建常量 | 内建类型 | 内建函数 |
---|---|---|
true | int | make |
false | int8 | len |
iota | int16 | cap |
nil | int32 | new |
- | int64 | append |
- | uint | copy |
- | uint8 | close |
- | uint16 | delete |
- | uint32 | complex |
- | uint64 | real |
- | uintprt | imag |
- | float32 | panic |
- | float64 | recover |
- | complex64 | - |
- | complex128 | - |
- | bool | - |
- | byte | - |
- | rune | - |
- | string | - |
- | error | - |
程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作 都将由 Go 编译器自动完成。