第5章 并发编程 
	Go语言的多线程是基于消息传递的,Go语言将基于CSP模型的并发编程内置到了语言中,其特点就是goroutine之间是共享内存的。

5.1 协程 
	协程是Go语言特有的一种轻量级线程,实际上,所有的Go语言都是通过goroutine运行的。

	5.1.1 核心概念 
		进程:是指具有一定功能的程序关于某数据集合上的一次执行过程,主要包含程序指令和数据。
		线程:进场的子集,是由进程创建的拥有自己控制流和栈的轻量级实体,一个进程至少有一个线程。线程是进程的实际存在。
		goroutine:是Go语言并发程序的最小执行单位,可以理解为goroutine运行在操作系统的线程之上,它更为轻量。

	5.1.2 goroutine的基本使用 
	5.1.3 sync.WaitGroup 

5.2 通道 
	通道是Go语言提供的一种在goroutine之间进行数据传输的通信机制。当然,通过channel传递的数据只能是一些指定的类型,这些类型被称为
通道的元素类型。

	5.2.1 channel写入数据 
	5.2.2 channel接收数据 
	5.2.3 以channel作为函数参数 
		无缓存的channel的特点就是同步,一个channel写入数据后,如果没有其他goroutine读取,则通道一直阻塞。

	5.2.4 缓存channel 
	5.2.5 select 
	5.2.6 超时检查 
		select 可以很方便的完成goroutine的超时检查。超时就是指某个goroutine由于意外退出,导致另一方的goroutine阻塞,从而影响
	主goroutine。

		当goroutine向某个无缓存通道发送数据,而没有其他goroutine从该无缓存通道接收数据时,发送的goroutine就会阻塞,这种情况叫
	goroutine泄露。goroutine泄露是造成超时的最常见原因。

		超时检查,技术上使用的是 select + time.After() 来实现的。

5.3 pipeline