“Go will be the server language of the future.” — Tobias Lütke, Shopify

在过去几年,崛起了一门新的语言:Go 或者 GoLang。没有什么比一门新的编程语言更令开发者兴奋了,不是么?

目前一些开源社区,纷纷采用Go语言开发了许多平台、框架等,如:Docker、Kubernetes等,甚至逐步从其它语言(如:C、Java等)转换到了Go,相信这一点你已经体会到了。当您在看一些开源代码时,全是Go语言编写的,你该咋办呢?

此外,伴随着近两年来云原生技术的发展迅猛,Go语言作为新生代的编译型编程语言,凭借语法简单、高并发性能良好和编译速度快等特点,成为了云原生技术落地实践的绝妙利器。云原生的到来,这也将迫使您不得不多学习一门新语言了。

因此,从今天开始从零开始学Go语言,一方面是督促自己不断前行且学习新的知识,另一方面是分享给读者,希望与大家一起进步。该专栏文章将从零基础开始,以通俗易懂的方式一起学习、分享Go语言的学习历程,且看且珍惜吧,加油!

适合人群:

  • 编程爱好者

  • Go语言初学者

学习目标:

帮助Go语言小白快速学习Go语言基础知识,从不了解到了解,到会写Go语言程序,到入门,直到精通,作为Go语言系列全教程。

专栏简介:

Go语言是Google公司开源的一门编程语言,它天生支持并发的特性吸引了越来越多的公司使用Go语言作为主开发语言。目前国内外Go语言的岗位需求持续增长,Go语言的未来发展前景十分可观。

本专栏是Go语言从入门到精通的教程,其中包含详细的语法介绍和丰富的练习示例,带你从0基础开始学习Go语言,提升Go语言能力。

废话不多说,奥力给!

1、Go介绍

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

“Go是一种开源的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。”(来自Go官网golang.org的定义)

Go语言,又称为Golang,在2007年9月形成构思,并于2009年11月发布,其发明人是Google的Robert Griesemer, Rob Pike和Ken Thompson。该语言其及配套工具集使得编译和执行既富有表达力又高效,而且使得程序员能够轻松写出可靠、健壮的程序。

Go的吉祥物是金花鼠(gordon),并将其作为logo,如下图所示:

Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

1.1 Go的起源

编程语言的演化跟生物物种的演化类似,成功的语言会繁衍后代,这些后代语言会从它们的祖先那里汲取各种优点。有时候,语言间的“混血”会产生异常强大的力量;在一些罕见情况下,某个重大的语言特性也可能凭空出现而无先例。通过观察语言间的影响,我们可以学到不少知识,比如语言为什么会变成这个样子,以及它适合用于哪些环境等等。

下图展示了有哪些早期的编程语言对Go语言的设计产生了重要影响。

Go有时会称为“类C语言”,或者是“21世纪的C语言”。从C中,Go继承了相似的表达式语法、控制流结构、基本数据类型、按值调用的形参传递和指针,但比这些更重要的是,继承了C所强调的要点:程序要编译成高效的机器码,并自然地与所处的操作系统提供的抽象机制相配合。

但是在Go语言的家族树中还有其它的祖先。其中一个有影响力的分支来自Niklaus Wirth所设计的Pascal语言。然后Modula-2语言激发了包的概念。然后Oberon语言摒弃了模块接口文件和模块实现文件之间的区别。第二代的Oberon-2语言直接影响了包的导入和声明的语法,还有Oberon语言的面向对象特性所提供的方法的声明语法等。

Go语言的另一支祖先,带来了Go语言区别其他语言的重要特性,灵感来自于贝尔实验室的Tony Hoare于1978年发表的鲜为外界所知的关于并发研究的基础文献 顺序通信进程 ( ,缩写为CSP。在CSP中,程序是一组中间没有共享状态的平行运行的处理过程,它们之间使用管道进行通信和控制同步。不过Tony Hoare的CSP只是一个用于描述并发性基本概念的描述语言,并不是一个可以编写可执行程序的通用编程语言。

接下来,Rob Pike和其他人开始不断尝试将CSP引入实际的编程语言中。他们第一次尝试引入CSP特性的编程语言叫Squeak(老鼠间交流的语言),是一个提供鼠标和键盘事件处理的编程语言,它的管道是静态创建的。然后是改进版的Newsqueak语言,提供了类似C语言语句和表达式的语法和类似Pascal语言的推导语法。Newsqueak是一个带垃圾回收的纯函数式语言,它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道是动态创建的,属于第一类值, 可以保存到变量中。

在Plan9操作系统中,这些优秀的想法被吸收到了一个叫Alef的编程语言中。Alef试图将Newsqueak语言改造为系统编程语言,但是因为缺少垃圾回收机制而导致并发编程很痛苦。(译注:在Alef之后还有一个叫Limbo的编程语言,Go语言从其中借鉴了很多特性。 具体请参考Pike的讲稿:http://talks.golang.org/2012/concurrency.slide#9 )

Go语言的其他的一些特性零散地来自于其他一些编程语言;比如iota语法是从APL语言借鉴,词法作用域与嵌套函数来自于Scheme语言(和其他很多语言)。当然,我们也可以从Go中发现很多创新的设计。比如Go语言的切片为动态数组提供了有效的随机存取的性能,这可能会让人联想到链表的底层的共享机制。还有Go语言新发明的defer语句。

1.2 Go的特点

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速

1.3 Go的用途

其它语言能够实现的系统,Go语言都能实现。

目前,Go主要应用在下面这些系统:

net/http

1.4 Go的美貌

说了这么多,Go 程序到底长啥样?我们先睹为快,一看美貌!

hello.go
package main import "fmt" func main() { fmt.Println("Hello, World!") } 
2、为什么我们要学习Go?

就我而言,目前主要从事微服务方面的产品研发,之前一直使用Java语言作为核心编程语言,但随着市场的变化,Java有时变得力不从心(一些轻量级的功能模块实现时,Java却显得有些笨重)。此外,为迎接云原生技术的到来,学习Go成为了必然。

对于你而言,为什么要学习Go呢?下面我参考知乎和网上大神的答案,谈谈Go语言的优势。

  • Go 语言特色

    • 简洁、快速、安全
    • 并行、有趣、开源
    • 内存管理、数组安全、编译迅速
  • Go 语言用途

    Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

    对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

  • C/C++的问题

开发效率低,对开发者要求高;libc只向后兼容,运维难度偏大。

  • Lua/Python的问题

动态语言,缺少编译过程,低级错误频出;缺少有效的性能分析及调试工具。