编译
Go一直被标榜为轻量化语言,简洁易读,功能也非常强大。但我认为Go更应该是半轻量化语言,是介于C++、Java和Python之间的语言。Go省去了C++的那种复杂写法,不用什么功能都需要亲自写一遍,很多内容只需调用底层库即可实现,但是我认为Python才是目前使用最广功能上也很全的轻量化语言。但Python局限在于不能实现很多复杂功能,确在算法这一块独占鳌头。
很多的Go程序都可以在1秒内编译完成,即使在现代硬件上,编译整个Go语言的源码也只需20秒即可。使用过C/C++的同学都应该清楚,编译相关程序要遍历依赖链中所有依赖的库,这非常耗时,即使我们预编译也是换汤不换药。
并发
如果你有相关的开发经验,要开发出能充分利用硬件资源的应用程序是一件很难的事情。现代计算机都拥有多个核,但是大部分编程语言都没有有效的工具让程序可以轻易利用这些资源。这些语言需要写大量的线程同步代码来利用多个核,很容易导致错误。
编者在开篇是就说过Go 语言的特点就是并发。 goroutine 很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。通道( channel)是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine之间发送消息,而不是让多个 goroutine 争夺同一个数据使用权。
goroutine
goroutine 是可以与其他 goroutine 并行执行的函数,同时也会与主程序(程序的入口)并行执行。在其他编程语言中,你需要用线程来完成这些事情,但是Go语言会使用同一个线程来执行多个goroutine。这里给一个简单的示例如下:
func log(msg string) {
fmt.printIn(msg)
}
go log("what's happend?")
这里调度 log 函数作为独立的 goroutine 去运行,以便与其他 goroutine 并行执行。由于占用资源少,所以能启动成千上万的goroutine。
channel
通道是一种数据结构,可以让goroutine之间进行安全的数据通信。通道可以帮助用户避免其他语言里常见的内存访问问题。C++中的多线程会使用复杂的锁规则来防止同一个全局变量或共享内存的不同步修改,而通道模式能够保证同一时刻只有一个goroutine修改数据。如下图所示:
image.png
有 3 个 goroutine,还有 2 个不带缓存的通道。第一个 goroutine 通过通道把数据传给已经在等待的第二个 goroutine。在两个 goroutine 间传输数据是同步的,一旦传输完成,两个 goroutine 都会知道数据已经完成传输。当第二个 goroutine 利用这个数据完成其任务后,将这个数据传给第三个正在等待的 goroutine。这次传输依旧是同步的,两个 goroutine都会确认数据传输完成。这种在 goroutine 之间安全传输数据的方法不需要任何锁或者同步机制。
网友评论