[英]Go channel: consume data from channel although not push anything to channel
例如,我有以下代碼:
package main
import (
"fmt"
)
func main() {
c1 := make(chan interface{})
close(c1)
c2 := make(chan interface{})
close(c2)
var c1Count, c2Count int
for i := 1000; i >= 0; i-- {
select {
case <-c1:
c1Count++
case <-c2:
c2Count++
}
}
fmt.Printf("c1Count: %d\nc2Count: %d\n ", c1Count, c2Count)
}
運行時,輸出為:
c1Count: 513
c2Count: 488
我不知道的是:我們沒有做任何事情就創建了c1和c2通道。 為什么在select / case塊中,c1Count和c2Count可以增加值?
謝謝
在調用close之后,並且在接收到任何先前發送的值之后,接收操作將返回通道類型的零值而不會阻塞。 多值接收操作返回接收值以及通道是否關閉的指示。
您正在計數零值。
例如,
package main
import (
"fmt"
)
func main() {
c1 := make(chan interface{})
close(c1)
c2 := make(chan interface{})
close(c2)
var c1Count, c2Count int
var z1Count, z2Count int
for i := 1000; i >= 0; i-- {
select {
case z1 := <-c1:
c1Count++
if z1 == nil {
z1Count++
}
case z2 := <-c2:
c2Count++
if z2 == nil {
z2Count++
}
}
}
fmt.Printf("c1Count: %d\nc2Count: %d\n", c1Count, c2Count)
fmt.Printf("z1Count: %d\nz2Count: %d\n", z1Count, z2Count)
}
游樂場: https : //play.golang.org/p/tPRkqXrAFno
輸出:
c1Count: 511
c2Count: 490
z1Count: 511
z2Count: 490
對於帶有范圍子句的語句
對於通道,所產生的迭代值是在通道上發送的連續值,直到關閉通道為止。 如果通道為nil,則范圍表達式將永遠阻塞。
對於帶range子句的for語句,關閉很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.