Go语言程序设计:为什么是Go?

为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来10年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,让我深觉无法望其项背,处处带给我惊喜。

Go语言给我的第一个惊喜是大道至简的设计哲学。

Go语言是非常简约的语言。简约的意思是少而精。少就是指数级的多。Go语言极力追求语言特性的最小化,如果某个语法特性只是少写几行代码,但对解决实际问题的难度不会产生本质的影响,那么这样的语法特性就不会被加入。Go语言更关心的是如何解决程序员开发上的心智负担。如何减少代码出错的机会,如何更容易写出高品质的代码,是Go设计时极度关心的问题。

Go语言追求显式表达。任何封装都是有漏洞的,最佳的表达方式就是用最直白的表达方式,所以也有人称Go语言为“所写即所得”的语言。

Go语言也是非常追求自然(nature)的语言。Go不只是提供极少的语言特性,并极力追求语言特性最自然的表达,也就是这些语法特性被设计成恰如多少人期望的那样,尽量避免惊异。事实上,Go语言的语法特性上的争议是非常少的。这些也让Go语言的入门门槛变得非常低。

Go语言给我的第二个惊喜是最对胃口的并行支持。

我对服务端开发的探索,始于Erlang语言,并且认为Erlang风格并发模型的精髓是轻量级进程模型。然而,Erlang除了语言本身不容易被程序员接受外,其基于进程邮箱做消息传递的并发编程模型也小有瑕疵。我曾经在C++中实现了一个名为CERL的网络库,刚开始在C++中完全模仿Erlang风格的并发编程手法,然而在我拿CERL库做云存储服务的实践中,发现了该编程模型的问题所在并做了相应的调整,这就是后来的CERL 2.0版本。有意思的是,CERL 2.0与Go语言的并行编程思路不谋而合。某种程度上来说,这种默契也是我创办七牛时,Go语言甚至语法特性都还没有完全稳定,我们技术选型就坚决地采纳了Go语言的重要原因。

Go语言给我的第三个惊喜是接口。

Go语言的接口,并非是你在Java和C#中看到的接口,尽管看起来有点像。Go语言的接口是非侵入式的接口,具体表现在实现一个接口不需要显式地进行声明。不过,让我意外的不是Go的非侵入式接口。非侵入式接口只是我接受Go语言的基础。在接口(或契约)的表达上,我一直认为Java和C#这些主流的静态类型语言都走错了方向。C++的模板尽管机制复杂,但是走在了正确的方向上。C++0x(后来的C++11)呼声很高的concept提案被否,着实让不少人伤了心。但Go语言的接口远不是非侵入式接口那么简单,它是Go语言类型系统的纲,这表现在以下几个方面。

(1)只要某个类型实现了接口要的方法,那么我们就说该类型实现了此接口。该类型的对象可赋值给该接口。

(2)作为1的推论,任何类型(包括基础类型如bool、int、string等)的对象都可以赋值给空接口interface{}。

(3) 支持接口查询。如果你曾经是Windows程序员,你会发现COM思想在Go语言中通过接口优雅呈现。并且Go语言吸收了其中最精华的部分,而COM中对象生命周期管理的负担,却因为Go语言基于gc方式的内存管理而不复存在。

Go语言给我的第四个意外惊喜是极度简化但完备的面向对象编程(OOP)方法。

Go语言废弃大量的OOP特性,如继承、构造/析构函数、虚函数、函数重载、默认参数等;简化的符号访问权限控制,将隐藏的this指针改为显式定义的receiver对象。Go语言让我看到了OOP编程核心价值原来如此简单——只是多数人都无法看透。

Go语言带给我的第五个惊喜是它的错误处理规范。

Go语言引入了内置的错误(error)类型以及defer关键字来编写异常安全代码,让人拍案叫绝。下面这个例子,我在多个场合都提过:

f, err := os.Open(file)
if err != nil {
      ... // 错误处理
      return
}
defer f.Close()
... // 处理文件数据

Go语言带给我的第六个惊喜是它功能的内聚。

一个最典型的案例是Go语言的组合功能。对于多数语言来说,组合只是形成复合类型的基本手段,这一点只要想想C语言的struct就清楚了。但Go语言引入了匿名组合的概念,它让其他语言原本需要引入继承这样的新概念来完成事情,统一到了组合这样的一个基础上。

在C++中,你需要这样定义一个派生类:

class Foo : public Base {
     ...
};

在Go语言中你只要:

type Foo struct {
     Base
     ...
}

更有甚者,Go语言的匿名组合允许组合一个指针:

type Foo struct {
     *Base
     ...
}

这个功能可以实现C++中一个无比晦涩难懂的特性,叫“虚拟继承”。但同样的问题换成从组合角度来表达,直达问题的本质,清晰易懂。

Go语言带给我的第七个惊喜是消除了堆与栈的边界。

在Go语言之前,程序员清楚地知道哪些变量在栈上,哪些变量在堆上。堆与栈是基于现代计算机系统的基础工作模型上形成的概念,Go语言屏蔽了变量定义在堆上还是栈上这样的物理结构,相当于封装了一个新的计算机工作模型。这一点看似与Go语言显式表达的设计哲学不太一致,但我个人认为这是一项了不起的工作,而且与Go语言的显式表达并不矛盾。Go语言强调的是对开发者的程序逻辑(语义)的显式表达,而非对计算机硬件结构的显示表达。对计算机硬件结构的高度抽象,将更有助于Go语言适应未来计算机硬件发展的变化。

Go语言带给我的第八个惊喜是Go语言对C语言的支持。

可以这么说,Go语言是除了Objective-C、C++这两门以兼容C为基础目标的语言外的所有语言中,对C语言支持最友善的一个。什么语言可以直接嵌入C代码?只有Go。什么语言可以无缝调用C函数?只有Go。对C语言的完美支持,是Go快速崛起的关键支撑。还有比C语言更让人觊觎的社区财富吗?那是一个取之不尽的金矿。

总而言之,Go语言是一门非常具有变革性的语言。尽管40年(从1970年C语言诞生开始算起)来出现的语言非常之多,各有各的特色,让人眼花缭乱。但是我个人固执地认为,谈得上突破了C语言思想,将编程理念提高到一个新高度的,仅有Go语言而已。

Go语言很简单,但是具备极强的表现力。从目前的状态来说,Go语言主要关注服务器领域的开发,但这不会是Go语言的完整使命。

我们说Go语言适合服务端开发,仅仅是因为它的标准库支持方面,目前是向服务端开发倾斜:

  • 网络库(包括socket、http、rpc等);
  • 编码库(包括json、xml、gob等);
  • 加密库(各种加密算法、摘要算法,极其全面);
  • Web(包括template、html支持)。

而作为桌面开发的常规组件:GDI和UI系统与事件处理,基本没有涉及。

尽管Go还很年轻,然而Go语言已经得到了非常普遍的认同。在国外,有人甚至提出“Go语言将制霸云计算领域”。在国内,几乎所有你听到过名字的大公司(腾讯、阿里巴巴、京东、360、网易、新浪、金山、豆瓣等),都有团队对Go语言做服务端开发进行了小范围的实践。这是不能不说是一个奇迹。

Go语言是一门前途非常光明的语言,很少有语言在如此年轻的时候就得到如此热捧。

但因为年轻,导致了Go语言的书籍哪怕在全球都非常稀少。这本书由知名技术作家Mark Summerfield撰写,它会让你了解Go语言,按Go语言的方式思考,以及使用Go语言来编写高性能软件。一直以来,Summerfield的教学方式都是深入实践的。每一章节都提供了多个活生生的代码示例,它们都是经过精心设计的用于鼓励读者动手实验并且能够帮助读者快速掌握如何开发的。

版权申明:本站文章均来自网络,如有侵权,请联系01056159998 邮箱:itboby@foxmail.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

猜你还会喜欢下面的内容

    无相关信息

中国领先的互联网域名及云服务提供商

为您提供域名,比特币,P2P,大数据,云计算,虚拟主机,域名交易最新资讯报道

域名注册云服务器