前言

Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,它用批判吸收的眼光,融合C语言、Java等众家之长,将简洁、高效演绎得淋漓尽致。

Go语言起源于2007年,当时Google的技术大神们备受C++越来越臃肿的困扰,决心开发一种新的语言来取代C++。他们认为:与其在臃肿的语言上不断增加新的特性,不如简化编程语言。于是,Golang这门新语言应运而生。

在十年多的时间里,Go语言发展势头强劲,凭借其简洁、高效的特性,在竞争激烈的编程语言市场中占据了一席之地。Google、腾讯、阿里等大公司纷纷选择使用Go语言来开发服务应用项目。当然,和其他的编程语言一样,Go语言也有其自身的缺陷。

正文

特点及优势

Go语言的设计者们一直致力于降低构建简单、可靠、高效软件的门槛。相比于其他语言,Go语言具有众多令人兴奋不已的特点和优势:

1.自动垃圾回收降低了开发难度

内存和资源管理一直是一个让人非常抓狂的难题。在其他语言(如C或C++)中,使用内存前要先分配这段内存,使用完毕后再将其释放掉,一个小疏忽就可能引发内存泄漏,导致程序甚至系统崩溃。而Go语言的现代化垃圾回收机制显著地降低了开发难度,把无趣的内存管理交给专业的编译器去做,而让程序员专注于更有趣的事情。

2.更丰富的内置类型

Go语言是一种典型的实战派语言,它内置了一个其他静态语言通常用库方式来支持的字典类型(map),理由很简单:既然绝大多数开发者都需要用到这个类型,为什么还非要每个人都写一行import语句来包含一个库?

Go语言还新增了一个数据类型:数组切片(Slice)。我们可以将数组切片看作是一种可动态增长的数组,其功能与C++标准库中的vector类似,但有效地消除了反复写以下几行代码的工作量:

1
2
3
4
#include <vector>
#include<map>
#include<algorithm>
using namespace std;

使用Go语言,开发者不用再费事添加依赖的包,既减少了输入工作量,又可以让代码更简洁。

3.支持函数多返回值

目前的主流语言中除Python外基本都不支持函数的多返回值功能,但很多情况下开发者非常需要这个功能。比如,我们要定义一个函数,用于返回个人的名字信息,而名字信息包含多个部分——姓氏、名字、中间字,在不支持多返回值的语言中有两种做法来实现名字信息的返回:

专门定义一个结构体:

1
2
3
4
5
6
7
8
struct name
{
char first_name[20];
char middle_name[20];
char last_name[20];
};
extern name get_name();//函数原型
name n = get_name();//函数调用

或以传出参数的方式返回:

1
2
3
4
5
6
7
8
9
10
extern void get_name(
char* first_name,
char* middle_name,
char* last_name);//函数原型
//先分配内存
char first_name[20];
char middle_name[20];
char last_name[20];
//函数调用
get_name(first_name,middle_name,last_name);

Go语言的多返回值功能让开发者既不用再只为了返回多个值而专门定义一个数据结构,也不用再区分参数列表中哪几个用于输入,哪几个用于输出。

使用Go语言返回名字信息可以这样写:

1
2
3
4
func getName(firstName,middleName,lastName string){
return "May","M","Chen"
}
fn,mn,ln,nn := getName()//函数调用

4.漂亮的错误处理

漂亮的错误处理规范是Go语言最大的亮点之一。Go语言引入了defer关键字用于标准的错误处理流程,并提供了内置函数panic、recover完成异常的抛出与捕获。与C++和Java等语言中的异常捕获机制相比,Go语言的错误处理机制可以大量减少代码量,开发者无需再仅为了程序安全而添加大量一层套一层的try-catch语句。

5.匿名函数和闭包

在Go语言中,所有的函数也是值类型,可以作为参数传递。Go语言支持常规的匿名函数和闭包,比如下列代码就定义了一个名为f的匿名函数,开发者可以随意对该匿名函数变量进行传递和调用:

1
2
3
f := func(x,y,int) int{
return x+y
}

6.简洁的类型和“非侵入式”接口

Go语言的类型定义非常接近C语言中的结构(struct),甚至直接沿用了struct关键字。为了保持简洁,Go语言没有直接沿袭C++和Java的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持最基本的类型组合功能。虽然看起来过于简洁,但Go语言依然能够实现C++和Java使用复杂的类型系统才能实现的功能。

而引入强大的“非侵入式”接口让开发者从以往对C++和Java开发中的接口管理问题中解脱了出来。

7.并发编程更轻盈更安全

Go语言引入了goroutine概念。goroutine是一种比线程更加轻盈、更省资源的协程。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,并发编程变得更加轻盈和安全。

主要应用场景

Golang非常适合用来做网络并发方面的服务,比如消息推送、监控、容器等。国内外的很多著名公司都使用了Go语言来开发服务及应用,比如:

  • Google最核心的搜索和广告业务;
  • 腾讯的Docker容器化
  • 百度的运维BFE(Baidu Front End)项目,应对庞大的前端页面访问量。
  • 小米的运维监控系统,小米商城、小米视频等团队也在使用Go语言

不足之处

尽管Go语言独特的垃圾回收机制和并发编程机制等设计使代码更简洁,并大大提高了程序的性能,但与Python、Java、C/C++等语言相比,Go语言还是太年轻。

1.软件包版本管理不完善

Go语言的软件包版本管理一直被开发人员吐槽。Go语言没有制定特定版本的依赖库,在不同时间构建时,创建的生成可能会基于不同版本的包。在这方面,Go语言还无法与Python、Java等语言的软件包管理系统相媲美。

2.错误信息难获得

Go语言的错误处理最被人所诟病的一点是,开发者不能从函数上知道下层函数可能返回哪些类型的错误,很容易丢失错误发生的范围,难以提供有效的错误信息。

作为一门新兴的语言,Go语言难免存在种种缺陷。但出身名门的它拥有强大的后备力量,开源社区的用户不断地贡献新的轮子,Google也组建了一个独立的小组全职开发Go语言,在Google内部,Go语言有逐渐取代Java和Python主流地位的趋势。未来Go语言的身影应该会出现在越来越多的应用服务当中。

如果你对Go语言感兴趣的话,可以参考以下两本图书,深入地学习Go的特性,并与其他语言进行比较和判断。

《Go语言实战》,作者:[美]William Kennedy [美]Brian Ketelsen [美]Erik St. Martin,译者:李兆海,审校:谢孟军

本书向读者提供了一个专注、全面且符合语言习惯的视角。本书同时关注语言的规范和实现,涉及的内容包括语法、类型系统、并发、管道、测试,以及其他一些主题。 作者William Kennedy是一位熟练的软件开发者,也是博客http://GoingGo.Net的作者。 Brian Ketelsen和Erik St. Martin是全球Go语言大会GopherCon的组织者,也是Go语言框架Skynet的联合作者。

《Go语言编程》,作者:许式伟 吕桂华

这本书首先引领读者快速浏览Go 语言的全貌,迅速消除读者对这门语言的陌生感,然后循序渐进地介绍了Go 语言的面向过程和面向对象的编程语法,其中穿插了一些与其他主流语言的比较,以让读者理解Go 语言的设计动机,接着探讨了Go 语言重要的并行编程方法,之后介绍了网络编程、工程管理、安全编程、开发工具等非语法相关但非常重要的内容,适合所有层次的开发者阅读。

学习路线

从去年开始接触学习 Go 语言,一直没有一个明确的学习方向,只是一贯的跟着视频学习,虽自己做了衍生开发的项目,但是使用的技术也是 Go 语言中的冰山一角,近期在 Github 中找到了一个 Star 比较高的 Go语言学习成长路线图,才发现自己所学的仅仅是入门而已,若想得到一个体系化的进步,在最学习的过程中要追求的是高效率的量变,促使自己得到一个可量化的质变,这才是高效的学习。

今天将 Github 中此路线图放在此处,做一个 Flag,也作自己查缺补漏的一个加油站⛽️,作为 最有潜力的高并发语言之一,相信未来 Go 语言会解决更多的场景。

学习路线

[在 2019 成为一名 Go 开发者的路线图。为学习 Go 的人而准备。]

参考

  1. ^Additional IP Rights Grant”. The Go Programming Language. Google. Retrieved October 5, 2012.

to be continued…