- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在用这样的东西测试一些代码时:
// ch := make(chan error)
for {
select {
case <- ch:
println("here")
}
}
我注意到如果我不添加 default
代码块:
for {
select {
case <- ch:
println("here")
default:
}
}
如果需要 block ,那么使用range
再好不过了,比如:
for {
for _ = range <- ch {
println("here")
}
}
或者在这种情况下使用 select
而不是 range
有什么区别/优势吗?
最佳答案
1- 当你处理一个 channel 时,可以使用for
,
考虑这个工作代码(The Go Playground):
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
for range ch {
}
fmt.Println("Done.")
}
这将清空 channel 。
注意:您应该关闭
channel 或者您应该使用break
语句来完成该循环。
2- 当您处理更多 channel 时,您可以使用 select
,像这样 (The Go Playground):
for {
select {
case <-pause:
fmt.Println("pause")
select {
case <-play:
fmt.Println("play")
case <-quit:
wg.Done()
return
}
case <-quit:
wg.Done()
return
default:
work()
}
}
3- 使用 nil 和关闭 channel ( The Go Playground ):
package main
import "fmt"
func main() {
var quit chan struct{} // nil
select {
case <-quit:
fmt.Println("1")
default:
fmt.Println("2") // This runs
}
quit = make(chan struct{}, 1)
select {
case <-quit:
fmt.Println("10")
default:
fmt.Println("20") // This runs
}
quit <- struct{}{} // send
select {
case <-quit:
fmt.Println("100") // This runs
default:
fmt.Println("200")
}
close(quit)
select {
case <-quit:
fmt.Println("1000") // This runs
default:
fmt.Println("2000")
}
select {
case <-quit:
fmt.Println("10000") // This runs
default:
fmt.Println("20000")
}
}
输出:
2
20
100
1000
10000
A "select" statement chooses which of a set of possible send orreceive operations will proceed. It looks similar to a "switch"statement but with the cases all referring to communicationoperations.
A case with a RecvStmt may assign the result of a RecvExpr to one ortwo variables, which may be declared using a short variabledeclaration. The RecvExpr must be a (possibly parenthesized) receiveoperation. There can be at most one default case and it may appearanywhere in the list of cases.
“select”语句的执行分几个步骤进行:
For all the cases in the statement, the channel operands of receiveoperations and the channel and right-hand-side expressions of sendstatements are evaluated exactly once, in source order, upon enteringthe "select" statement. The result is a set of channels to receivefrom or send to, and the corresponding values to send. Any sideeffects in that evaluation will occur irrespective of which (if any)communication operation is selected to proceed. Expressions on theleft-hand side of a RecvStmt with a short variable declaration orassignment are not yet evaluated. If one or more of the communicationscan proceed, a single one that can proceed is chosen via a uniformpseudo-random selection. Otherwise, if there is a default case, thatcase is chosen. If there is no default case, the "select" statementblocks until at least one of the communications can proceed. Unlessthe selected case is the default case, the respective communicationoperation is executed. If the selected case is a RecvStmt with a shortvariable declaration or an assignment, the left-hand side expressionsare evaluated and the received value (or values) are assigned. Thestatement list of the selected case is executed. Since communicationon nil channels can never proceed, a select with only nil channels andno default case blocks forever.
关于go - 选择单个案例 block ,添加默认值 : unblocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39107003/
在我的计算机上运行任何脚本时,我突然开始收到此警告: Run only scripts that you trust. While scripts from the internet can be u
iPhone 上有一款很受欢迎的游戏,叫做 Unblock Me。目标是移除红色方 block 前面的所有障碍物,以畅通导出: 为该游戏生成随机棋盘的明智方法是什么?我正在考虑这些方面的事情: 将红色
我想知道如果 Meteor 方法已经是非阻塞的,我是否需要在 Meteor 方法中使用 this.unblock()。 这是一个人为的例子: Meteor.methods({ myMethod()
对于类似于 Unblock Me 的游戏,什么是合适的关卡生成算法? 我的第一次尝试是从已解决的关卡开始,然后倒退。我从棋盘右侧导出旁边的红色水平矩形开始。最初,棋盘上有零个其他棋子。所以我试着伪随机
我有一个经过验证的方法: export const updateSuitClass = new ValidatedMethod({ name: 'presets.suitClass.update'
ObjectInputStream 在创建时会阻塞,直到收到串行输入流并对其进行验证。我试图通过它使用套接字来制作我的第一个程序并发现了这个。我使用了一个虚拟对象,这样它就不会阻塞。代码在这里: im
在用这样的东西测试一些代码时: // ch := make(chan error) for { select { case <- ch: println("h
我有一个调用 powershell 脚本并运行它的批处理文件。 Powershell.exe -ExecutionPolicy RemoteSigned -File %1 %1 参数是 file_na
我有一个 MySQL ISAM 表正在访问我的多个 php 实例。现在我正在使用 WRITE 锁来序列化对此表的访问。 我的问题是如何确保以先到先得的方式提供 PHP 实例?或者这是默认行为? 官方M
我刚刚介绍了 Instagram Api 的文档;但是没有 api 支持的阻止或解除阻止服务。但是有一些应用程序可以获取用户列表,我可以阻止跟随我的用户。那么我如何才能阻止来自 instagram a
这是我的代码: 服务器.js var fs = Npm.require('fs'); Meteor.methods({ "test":function(a){ this.unblo
当我将我的程序从我的网站下载到我的 Windows 2003 机器时,它上面有一个块,您必须右键单击 exe,然后单击属性,然后选择“取消阻止”按钮。 我想在我的安装程序中添加检测文件何时被阻止,因此
当我使用 ExecutorService 进行异步调用时,它返回 Future 对象。根据它返回的 boolean 值,我必须记录异步调用的状态。 但是当我尝试从 future 对象调用方法 get
我在 Linux 下使用管道时遇到问题。我想填充管道以进一步阻止写入的调用。另一个进程应该能够从应该允许另一个进程写入的管道中读取一些字符。 示例代码: #include #include #in
是否可以将 this.unblock() 与 percolate:synced-cron 一起使用?我希望 PJ2_1、PJ2_2、PJ2_3 都能快速打印出来,而不是等待 Meteor.call()
当我运行连接到 mysql 的 python 代码时,我看到了这个错误; “错误 1129:由于许多连接错误,主机 '' 被阻止;使用 'mysqladmin flush-hosts' 解除阻止”。
我是一名优秀的程序员,十分优秀!