Skip to content

Commit

Permalink
Merge pull request astaxie#53 from cnbuff410/patch-1
Browse files Browse the repository at this point in the history
Typo correction
  • Loading branch information
astaxie committed Oct 6, 2012
2 parents 0c3ed72 + 0661fbd commit e9e8481
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions 2.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ channel通过操作符`<-`来接收和发送数据
fmt.Println(x, y, x + y)
}

默认情况下,channel接收和发送数据都是阻塞的除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显示的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel 是在多个goroutine之间同步很棒的工具。
默认情况下,channel接收和发送数据都是阻塞的除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel 是在多个goroutine之间同步很棒的工具。

##Buffered Channels
上面我们介绍了默认的非缓存类型的channel,不过Go也允许指定channel的缓冲大小,很简单,就是channel可以存储多少元素。ch:= make(chan bool, 4),创建了可以存储4个元素的bool 型channel。在这个channel 中,前4个元素可以无阻塞的写入。当写入第5个元素时,代码将会阻塞,直到其他goroutine从channel 中读取一些元素,腾出空间。
Expand Down Expand Up @@ -131,11 +131,11 @@ channel通过操作符`<-`来接收和发送数据
}
}

`for i := range c`能够不断的读取channel里面的数据,直到该channel被显示的关闭。上面代码我们看到可以显示的关闭channel,生产者通过关键字`close`函数关闭channel。关闭channel之后就无法再发送任何数据了,在消费方可以通过语法`v, ok := <-ch`测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。
`for i := range c`能够不断的读取channel里面的数据,直到该channel被显式的关闭。上面代码我们看到可以显式的关闭channel,生产者通过关键字`close`函数关闭channel。关闭channel之后就无法再发送任何数据了,在消费方可以通过语法`v, ok := <-ch`测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。

>记住应该在生产者的地方关闭channel,而不是消费的地方去关闭它,这样容易引起panic
>另外记住一点的就是channel不像文件之类的,不需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显示的结束range循环之类的
>另外记住一点的就是channel不像文件之类的,不需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的
##Select
我们上面介绍的都是只有一个channel的情况,那么如果存在多个channel的时候,我们该如何操作呢,Go里面提供了一个关键字`select`,通过`select`可以监听channel上的数据流动。
Expand Down

0 comments on commit e9e8481

Please sign in to comment.