我正在阅读一些开源的go项目,发现有很多代码实现如下:
for id, s := range subscribers {
go func(id string, s *helloSaidSubscriber) {
select {
case <-s.stop:
unsubscribe <- id
return
default:
}
select {
case <-s.stop:
unsubscribe <- id
case s.events <- e:
case <-time.After(time.Second):
}
}(id, s)
}
在上面的代码中,内部函数go func...(id, s)
看起来是不必要的。换句话说,如果我写下面的代码,会有什么不同:
for id, s := range subscribers {
select {
case <-s.stop:
unsubscribe <- id
return
default:
}
select {
case <-s.stop:
unsubscribe <- id
case s.events <- e:
case <-time.After(time.Second):
}
}
1条答案
按热度按时间jq6vz3qz1#
在第一个例子中,anonymous function加上
go
关键字后,就像goroutine一样运行,这是Go语言中的并发模式,所以匿名函数(goroutine)中的代码都是并发运行的。在第二个例子中,排除goroutine意味着代码将按顺序运行。
匿名函数是一个不包含任何名字的函数。当你想创建一个内联函数时,它经常被使用。它可以形成一个闭包。匿名函数也被称为function literal。