微信号:infoqchina

介绍:有内容的技术社区媒体

【深度】Go并发编程之Go语言概述

2014-09-29 18:35 郝林

1. Go语言从何而来?


关于Go语言的萌芽时期,我们可以追溯至上个世纪。不过,直至2009年,它才真正被披露,并成为开源大家庭中的一员。在2012年,Go语言的创造者们发布了它的1.0版本。大家可能有所耳闻,Go语言出自Google公司。但很多人可能并不清楚,它的创造者们更是名头不小。他们包括Unix操作系统和B语言(C语言的前身)的创造者、UTF-8编码的发明者Ken Thompson,Unix项目的参与者、UTF-8编码的联合创始人和Limbo编程语言(Go语言的前身)的创造者Rob Pike,以及著名的JavaScript引擎V8的创造者Robert Griesemer。正因为有了他们的引领,一批又一批的全球顶尖计算机软件人才都相继加入到了Go语言项目中。


Go语言是一门强类型的通用编程语言。它的基础语法与C语言很类似,但同时也对其他的一些优秀编程语言有所借鉴。它的很多设计灵感都来源于Tony Hoare执笔的那篇著名的论文《Communicating Sequential Processes》。


2. Go语言意味着什么?


Go语言意味着更自由、更高效和一站式的编程体验,程序开发效率和运行效率之间的完美融合,以及天生的并发编程支持。


我们下面重点说说Go语言对各种流行的编程范式的支持,以及它对并发编程的强悍支持。


2.1自由的编程方式


使用Go语言就意味着你可以用自己喜欢的方式编程。因为Go语言支持当今所有主流的编程范式。这包括面向对象编程、函数式编程,以及过程式编程。


面向对象编程


面向对象的设计和编程可以使我们更容易的对现实世界进行建模。这样可以编写出让人类更易懂的代码,并且还会大大增强代码的可维护性和可扩展性。Go语言支持面向对象编程。因此,我们的Go语言程序也可以具备上述优势。面向对象编程中的很多重要原则都可以很容易的在Go语言程序中体现出来,比如:“针对接口编程,而不是针对实现编程”、“对扩展开放,对修改关闭”和“多用组合,少用继承”等等。另外,虽然Go语言中并没有继承的概念,但我们依然可以用类型嵌入的方式来模仿继承并达到相同的效果。


函数式编程


函数式编程同样可以让我们更容易的跟进变化。它可以让我们的程序实体的粒度更加小巧,从而使程序更加易变。此外,函数式编程还可以让我们的程序更加健壮,因为函数本身是没有状态的。要知道,对各种状态的维护会使程序更加复杂和脆弱。Go语言对函数式编程提供支持的一个体现就是:它的函数是绝对的一等类型。这是函数式编程的一个重要特征。更具体地说,我们可以把一个函数作为传给其他函数的参数,或成为其他函数返回的结果。这是构建闭包的必要条件。同时,这也意味着,我们可以对程序的可变部分进行更加灵活的控制和管理。


过程式编程


至于过程式编程,我们自不必多说。程序员们应该再熟悉不过了。过程式编程最直接的体现了程序的本质,同时也是简单程序的最常用的编写手法。我们可以用脚本语言写出纯过程化的程序。我之前常常使用Python代码来做这类事情。因为它可以像Shell脚本那样工作,并且总是能够保持简单。我现在的选择当然是用Go语言。不论是语言语法还是程序运行方式,Go语言都非常的脚本化。简约和易用是它的两个显著特点。


2.2便捷的并发编程


毋庸置疑,Go语言对并发编程的支持是天生的、自然的和高效的。Go语言为此专门创造出了一个关键字“go”。使用这个关键字,很容易就可以使一个函数并发执行。就像这样:


go func() {

fmt.Println("Concurrent execution!")

}()


上面的这段代码使用关键字“go”并发的执行了一个匿名函数,虽然这个匿名函数只会在标准输出上打印一句话而已。更确切地说,该匿名函数会在一个单独的Goroutine中(或称Go程)执行。我们把“go”和跟在它后面的函数以及调用符号“(”和“)”合称为go语句,而把那个匿名函数称为go函数。


如果要在不同的Goroutine中运行的函数之间传递数据,那么可以使用Channel(也可称其为通道)。这也是Go语言强烈推荐的做法。


3. Go语言的哲学


通过对前面内容的阅读,大家应该能够隐约的感觉到Go语言的关注点,以及它想为软件开发者们带来的启示和新思想。


作为本篇文章的总结,我在下面列出几点最重要的Go语言的哲学:


  • Go语言集众多编程范式之所长,并以自己独到的方式将它们融合在一起。程序员们可以用他们喜欢的风格去设计程序。

  • 相对于设计规则上的灵活,Go语言有着明确且近乎严格的编码规范。我们可以通过“go fmt”命令来按照官方的规范格式化代码。

  • Go语言是强调软件工程的编程语言。它自带了非常丰富的标准命令,涵盖了软件生命周期(开发、测试、部署、维护等等)的各个环节。

  • Go语言是云计算时代的编程语言。它关注高并发程序,并旨在开发效率和运行效率上取得平衡。

  • Go语言提倡交换数据,而不是共享数据。它的并发原语Goroutine和Channel是其中的两大并发编程利器。同时,Go语言也提供了丰富的同步工具,以供程序员们根据场景选用。然而,后者就不属于语言级别的支持了。


4. 下期预告


在下一篇文章中,我会带领大家真正进入Go语言并发编程的世界。作为入门,学会怎样正确的利用go语句并发的执行go函数总是必须的。在搞清go语句的使用之后,我们还会一窥Goroutine背后的运行机理。正所谓知其然更知其所以然。


5. 作者介绍


郝林,微博名:特价萝卜。Go语言爱好者、高级Java软件工程师、Python程序员和Linux爱好者。目前在宜信公司的小微企业增值服务中心任软件系统架构师。曾在搜狐网多年,并任Java项目经理。在互联网软件的设计和开发方面拥有丰富的实战经验。著有《Go并发编程实战》一书,并在GitHub上发布了免费的《Go命令教程》。


更多精彩内容,请点击“阅读原文”。


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 2016年值得期待的几大 Linux 发行版 平常心造就一颗赛艇 初识ASP.NET Core 1.0 Cocos开发者沙龙成都站报名啦! 聊一聊小米广告平台的构建、底层模块和坑