Go语言 为什么人们在戈兰使用内部功能?

9o685dep  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(201)

我正在阅读一些开源的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):
                    }
            }
jq6vz3qz

jq6vz3qz1#

在第一个例子中,anonymous function加上go关键字后,就像goroutine一样运行,这是Go语言中的并发模式,所以匿名函数(goroutine)中的代码都是并发运行的。
在第二个例子中,排除goroutine意味着代码将按顺序运行。
匿名函数是一个不包含任何名字的函数。当你想创建一个内联函数时,它经常被使用。它可以形成一个闭包。匿名函数也被称为function literal

相关问题