1.为什么我们需要一门新语言-GO语言
Go希望成为互联网时代的C语言。这需要考虑些关键问题?
首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代的C语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。
其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心问题本身的解决,而互联网时代的C语言还需要考虑软件品质保障和团队协作相关的话题。
最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。
C语言是纯过程式的,这和它产生的历史背景有关。Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精。
从编程范式的角度来说,Go语言是变革派,而不是改良派。
对于C++、Java和C#等语言为代表的面向对象(OO)思想体系,Go语言总体来说持保守态度,有限吸收。
首先,Go语言反对函数和操作符重载(overload),Go不提供它。
其次,Go语言支持类、类成员方法、类的组合,但反对继承,反对虚函数(virtual function)
和虚函数重载。确切地说,Go也提供了继承,只不过是采用了组合的文法来提供:
type Foo struct {
Base
...
}
func (foo *Foo) Bar() {
...
}
再次,Go语言也放弃了构造函数(constructor)和析构函数(destructor)。
在放弃了大量的OOP特性后,Go语言送上了一份非常棒的礼物:接口(interface)。
Go语言中的接口与其他语言最大的一点区别是它的非侵入性。
2.Go语言最主要的特性:
a.自动垃圾回收
b.更丰富的内置类型
c.函数多返回值
d.错误处理
e.匿名函数和闭包
f.类型和接口
g.并发编程
h.反射
i.语言交互性
a.自动垃圾回收
Go语言作为一门新生的开发语言,当然不能忽略内存管理这个问题。又因为Go语言没有C++这么“强大”的指针计算功能,因此可以很自然地包含垃圾回收功能。因为垃圾回收功能的支持,开发者无需担心所指向的对象失效的问题,因此Go语言中不需要delete关键字,也不需要free()方法来明确释放内存。
b.更丰富的内置类型
除了几乎所有语言都支持的简单内置类型(比如整型和浮点型等)外,Go语言也内置了一些比较新的语言中内置的高级类型,比如C#和Java中的数组和字符串。除此之外,Go语言还内置了一个对于其他静态类型语言通常用库方式支持的字典类型(map)。另外有一个新增的数据类型:数组切片(Slice)。我们可以认为数组切片是一种可动态增长的数组。
c.函数多返回值
Go语言革命性地在静态开发语言阵营中率先提供了多返回值功能。这个特性让开发者可以从原来用各种比较别扭的方式返回多个值的痛苦中解脱出来,既不用再区分参数列表中哪几个用于输入,哪几个用于输出,也不用再只为了返回多个值而专门定义一个数据结构。
如果开发者只对该函数其中的某几个返回值感兴趣的话,也可以直接用下划线作为占位符来忽略其他不关心的返回值。下面的调用表示调用者只希望接收lastName的值,这样可以避免声明完全没用的变量:
_, _, lastName, _ := getName()
d.错误处理
Go语言引入了3个关键字用于标准的错误处理流程,这3个关键字分别为defer、panic和recover。
e.匿名函数和闭包
在Go语言中,所有的函数也是值类型,可以作为参数传递。Go语言支持常规的匿名函数和闭包,比如下列代码就定义了一个名为f的匿名函数,开发者可以随意对该匿名函数变量进行传递和调用:
f := func(x, y int) int {
return x + y
}
f.类型和接口
Go语言的类型定义非常接近于C语言中的结构(struct),甚至直接沿用了struct关键字。相比而言,Go语言并没有直接沿袭C++和Java的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持了最基本的类型组合功能。
g.并发编程
Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。
h.反射
Go语言的反射实现了反射的大部分功能,但没有像Java语言那样内置类型工厂,故而无法做到像Java那样通过类型字符串创建对象实例。
反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。
例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。
i.语言交互性
在Go代码中,可以按Cgo的特定语法混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。