为什么选择Go
编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定领域的语言有Erlang、R和MATLAB等,那么我们为什么需要 Go这样一门新语言呢?
Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难让我们有点沮丧”。这一定位暗示了Go语言希望取代C和Java的地位,成为最流行的通用开发语言。
Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为C++ 真的没啥好学的,值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也要足够简单!
单机时代的语言可以只关心问题本身的解决,但是随着工程规模的不断扩大,软件复杂度的不断增加,软件工程也成为语言设计层面要考虑的重要课题。多数软件需要一个团队共同去完成,在团队协作的过程中,人们需要建立统一的交互语言来降低沟通的成本。规范化体现在多个层面,如:
- 代码风格规范
- 错误处理规范
- 包管理
- 契约规范(接口)
- 单元测试规范
- 功能开发的流程规范
Go语言很可能是第一个将代码风格强制统一的语言,例如Go语言要求public的变量必须以大写字母开头,private变量则以小写字母开头,这种做法不仅免除了public、private关键字,更重要的是统一了命名风格。
计算机软件经历了数十年的发展,形成了多种学术流派,有面向过程编程、面向对象编程、函数式编程、面向消息编程等,这些思想究竟孰优孰劣,众说纷纭。
C语言是纯过程式的,这和它产生的历史背景有关。Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精。
从编程范式的角度来说,Go语言是变革派,而不是改良派。
语言简史
提起Go语言的出身,我们就必须将我们饱含敬意的眼光投向持续推出惊世骇俗成果的贝尔实验室。贝尔实验室已经走出了多位诺贝尔奖获得者,一些对于现在科技至关重要的研究成果,比如晶体管、通信技术、数码相机的感光元件CCD和光电池等都源自贝尔实验室。该实验室在科技界的地位可想而之,是一个毫无争议的科研圣地。
这里我们重点介绍一下贝尔实验室中一个叫计算科学研究中心的部门对于操作系统和编程语言的贡献。回溯至1969年,肯·汤普逊(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)在贝尔实验室的计算科学研究中心里开发出了Unix这个大名鼎鼎的操作系统,还因为开发Unix而衍生出了一门同样赫赫有名的编程语言——C语言。对于很大一部分人而言,Unix就是操作系统的鼻祖,C语言也是计算机课程中最广泛使用的编程语言。Unix和C语言在过去的几十年以来已经造就了无数的成功商业故事,比如曾在90年代如日中天的太阳微系统(Sun MicroSystems),现在正如日中天的苹果的Mac OS X操作系统其实也可以认为是Unix的一个变种(FreeBSD)。在之后的几十年中,该研究项目又演变出了另一个叫Inferno的项目分支,以及一个名为Limbo的编程语言。Limbo是用于开发运行在小型计算机上的分布式应用的编程语言,它支持模块化编程,编译期和运行时的强类型检查,进程内基于具有类型的通信通道,原子性垃圾收集和简单的抽象数据类型。它被设计为:即便是在没有硬件内存保护的小型设备上,也能安全运行。
Limbo语言被认为是Go语言的前身,不仅仅因为是同一批人设计的语言,而是Go语言确实从Limbo语言中继承了众多优秀的特性。贝尔实验室后来经历了多次的动荡,包括肯·汤普逊在内的Plan 9项目原班人马加入了Google。在Google,他们创造了Go语言。早在2007年9月,Go语言还是这帮大牛的20%自由时间的实验项目。到了2008年5月,Google发现了Go语言的巨大潜力,从而开始全力支持这个项目,让这批人可以全身心投入Go语言的设计和开发工作中。Go语言的第一个版本在2009年11月正式对外发布,并在此后的两年内快速迭代,发展迅猛。第一个正式版本的Go语言于2012年3月28日正式发布,让Go语言迎来了第一个引人瞩目的里程碑。
基于Google对开源的一贯拥抱态度,Go语言也自然而然地选择了开源方式发布,并使用BSD授权协议。任何人可以查看Go语言的所有源代码,并可以为Go语言发展而奉献自己的力量。
语言特性
自动垃圾回收:到目前为止,内存泄露的最佳解决方案是在语言级别引入自动垃圾回收算法(GarbageCollection,简称GC)。
更丰富的内置类型:Go语言内置了一个对于其他静态类型语言通常用库方式支持的字典类型(map)。新增的数据类型:数组切片(Slice)。我们可以认为数组切片是一种可动态增长而且不限制数据类型的数组。
函数多返回值:Go语言革命性地在静态开发语言阵营中率先提供了多返回值功能。
错误处理:Go语言引入了3个关键字用于标准的错误处理流程,这3个关键字分别为defer、panic和recover。
匿名函数和闭包:在Go语言中,所有的函数也是值类型,可以作为参数传递。Go语言支持常规的匿名函数和闭包。
类型和接口:Go语言并没有直接沿袭C++和Java的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持了最基本的类型组合功能。它还引入了一个无比强大的“非侵入式”接口的概念,即类型和接口不紧密绑定。
并发编程:Go语言引入了goroutine概念,是一种比线程更加轻盈、更省资源的协程。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。
反射:Go语言的反射实现了反射的大部分功能,但没有像Java语言那样内置类型工厂,故而无法做到像Java那样通过类型字符串创建对象实例。
语言交互性:由于Go语言与C语言之间的天生联系,可以按Cgo的特定语法混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。开发者基本上可以完全忽略这个Go语言和C语言的边界是如何跨越的。
安装Go
下载地址:Go下载地址
一键安装就好,而且环境变量都给配置好了。
IDE的选择,作为一个JetBrains的粉丝,自从用过idea之后就再也回不去eclipse了,自然要使用JetBrainsGoLand。