【发布时间】:2015-01-16 06:59:43
【问题描述】:
看下面的代码sn-p
package main
import (
"fmt"
"time"
)
func sender(ch chan string) {
ch <- "Hello"
ch <- "Foo"
ch <- "and"
ch <- "Boo"
close(ch)
}
func main() {
ch := make(chan string)
go sender(ch)
for {
select {
case value := <-ch:
fmt.Println(value)
case <-time.After(time.Second * 2):
fmt.Println("Return")
return
}
}
}
结果我得到了空白输出和 time.After 将永远无法到达。为什么?
我注意到,当我尝试从关闭的通道接收值时,它将从类型接收零值。为什么我仍然可以从封闭的渠道获得价值?
我也可以检查,
v, ok := <-ch
如果 ok 为 false,则通道关闭。
【问题讨论】:
-
您的程序打印在
sender()函数中发送的单词,然后继续打印空行,即string的零值,当从关闭的通道接收时返回此零值。尝试删除close(ch)看看会发生什么。
标签: go