为 Ruby 程序员准备的 Go 入门教程(3)

程序中有个调用了sayHellothat方法的goroutine,该方法输出 “Hello, world”消息。但是,注意那个eventChannel的声明。本质上,我们声明了一个整型的channel。我们可以通过这个channel来发送数据,而其他部分可以从这个channel中读取数据。这就使得channel成为了一种通信方式。在 sayHello方法中,eventChannel < - 1将整数1加入到eventChannel中,然后在主函数中,我们可以从 eventChannel将数据读出。

这儿有一点很重要:默认情况下,如果channel中没有数据的情况下,从channel中读数据会被阻塞的,一直阻塞到可以从channel中读到数据。

来的稍微复杂的:

package main
 
import (
"fmt"
)
 
var logChannel chan string = make(chan string)
 
func loggingLoop() {
  for {
    //wait for a message to arrive
    msg := < - logChannel
 
    //log the msg
    fmt.Println(msg)
  }
}
 
func main() {
  go loggingLoop()
 
  //do some stuff here
  logChannel <- "messaged to be logged"
  //do other stuff here
}

这里,我们完成了一个main的事件轮询,它会一直处于监听事件状态,也就是loggingLoop函数。它从loggChanne中接收到一个消息后,就会输到屏幕。这是一个非常普片的设计,特别在事件轮询中获得一些状态。

就这样,短短几行代码,我们就完成了一个main函数和goroutines之间的通信。由于共享内存的通信方式,存在着诸如互斥锁,竞态条件等问题,早已成为了开发者的噩梦。但是在Go中,channels的概念解决了多数传统问题。此外,Go的channels是语言的固有部分,而非附加在某个库中的。

与Ruby相比,Go的goroutines实际上是运行在后台,并且由语言本身实现的(MRI Ruby整个运行在一个单独的线程中,所以它不能提供一个真实的并行)。此外,虽然Ruby自带线程实现,但是那实在不好使用。事实上,Agent库尝试将一些goroutines精妙的地方引入Ruby中去。

告一段落 (暂时)

这篇文章我们已经讲了不少东西了,首先介绍了一些非常基础的语法,然后直接介绍了Go语言的并发机制。

请继续关注后续的第2部分,那里我们会接触一些复杂语法,和其他一些Go语言带给我们的牛叉特性。

相关阅读

LiteIDE 开发工具指南 (Go语言开发工具)

Ubuntu 安装Go语言包

《Go语言编程》高清完整版电子书

Go语言并行之美 -- 超越 “Hello World”

我为什么喜欢Go语言

在 Cloud 9 中搭建和运行 Go

Ubuntu 13.04下Ruby的安装

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/73b419566f948c5df0024576b366fb36.html