- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有些情况下您需要关闭 channel ,有些情况下则不需要。
http://play.golang.org/p/piJHpZ2-aU
queue := make(chan string, 2)
queue <- "one"
queue <- "two"
close(queue)
for elem := range queue {
fmt.Println(elem)
}
我来了
fatal error: all goroutines are asleep - deadlock!
而此代码的关闭是可选的
http://play.golang.org/p/Os4T_rq0_B
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
<-done
// close(done)
最佳答案
第一个例子,由于使用了range
, channel 需要关闭。关键词。当范围与 channel 一起使用时,它将继续尝试从 channel 读取数据,直到 channel 关闭。
来自 http://golang.org/ref/spec#For_statements
[When using
range
for] ...channels, the iteration values produced are the successive values sent on the channel until the channel is closed. If the channel is nil, the range expression blocks forever.
这意味着您必须关闭 channel 以退出循环。
在第二个示例中,您使用的是接收运算符 <-
.该运算符将阻塞,直到一个 项可以从 channel 中拉出。由于 channel 中有一件商品在等待配送,因此它会立即让出。在这种情况下,关闭是可选的,因为在那之后 channel 上没有其他阻塞操作,所以很高兴保持“打开”状态。
参见 channels section更多详情...
关于go - 我怎么知道关闭是必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19746629/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!