一、前言
Go语言在设计时,Java和C ++是编写服务器程序最常用的语言(至少在Google是这样),这是因为使用这些语言可以高效的开发。但是Go设计者们觉得像Java和C++这些语言需要开发者记忆太多的语法和规则,并且需要重复做的事情太多,这导致一些程序员开始转向更加动态,流畅的语言,如Python,但是付出的是损失开发效率和对类型安全检查的缺失。Go设计者们认为应该可以发明一种语言,这种语言集高效的开发、提供类型安全检查、简洁流畅的代码风格与一体,于是Go就诞生了。
二、GoLang并发编程
Go在语言层面提供了内置的并发支持,在Google内部运行在多核心cpu机器之上并拥有高并发流量的web服务器程序,是最典型应用。由于C++和Java在语言层面对并发的支持不是特别好,所以使用它们编写高并发程序都不是特别容易。
传统的线程模型,比如经常使用Java、C++、Python编程的时候,需要多个线程之间通过共享内存(比如在堆上创建的共享变量)来通信。这时候为保证线程安全,多线程共享的数据结构需要使用锁来保护,多线程访问共享数据结构时候需要竞争获取锁,只有获取到锁的线程才可以存取共享数据。
Go中也提供了这种低级同步原语-锁,比如互斥锁、读写锁、条件变量等,但是Go的并发原语 - goroutines和channels 提供了一种优雅而独特的结构化开发并发软件的方式。 Go鼓励使用通道在goroutine之间传递对共享数据的引用,而不是明确地使用锁来保护对共享数据的访问。 这种方法确保在给定时间只有一个goroutine可以访问共享数据。 这个理念被总结为:不要通过共享内存来通信,而要通过通信来共享内存。