从this file开始,我不明白为什么函数startWorker的编写如下:
func (p *WorkerPool) dispatch() {
for i := 0; i < p.maxWorkers; i++ {
p.taskQueue[i] = make(chan func())
go startWorker(p.taskQueue[i])
}
}
func startWorker(taskChan chan func()) {
go func() {
var task func()
var ok bool
for {
task, ok = <-taskChan
if !ok {
break
}
// Execute the task.
task()
}
}()
}
如果我是开发人员,则将这样编写此函数:
func startWorker(taskChan chan func()) {
var task func()
var ok bool
for {
task, ok = <-taskChan
if !ok {
return
}
// Execute the task.
task()
}
}
答案 0 :(得分:-1)
根据Francesc Campoy Flores的Go Best Practices,您的陈述正确无误。启动goroutine也将启动另一个goroutine是多余的。
func (p *WorkerPool) dispatch() {
for i := 0; i < p.maxWorkers; i++ {
p.taskQueue[i] = make(chan func())
go startWorker(p.taskQueue[i])
}
}
这是库中使用它的方式。在startWorker中删除go例程很有意义。
正如彼得在这里提到的,也可以将go startWorker()
行更改为startWorker()
。