我在代码中具有以下for-select结构:
go func(runCh chan Caller, shutdownSignal chan bool) {
for {
select {
case request := <-runCh:
go func() {
w.Run(&request)
}()
case <-shutdownSignal:
w.Shutdown()
return
}
}
}(runCh, shutdownCh)
我会在这部分遇到一些问题吗?
case request := <-runCh:
go func() {
w.Run(&request)
}()
?
如果是,那为什么呢?
换句话说-Using goroutines on loop iterator variables part of Common Mistakes是否也适用于我的案例,为什么它不适用?
最佳答案
否(在这里不适用),您在每次循环迭代中都有新的变量(内存地址):
case request := <-runCh:
由于此
:=
创建了不同于先前变量的新变量,因此请证明:package main
import (
"fmt"
"time"
)
func main() {
runCh := make(chan int, 2)
runCh <- 1
runCh <- 2
for i := 1; i <= 2; i++ {
select {
case request := <-runCh:
go func() {
fmt.Println(request, &request)
time.Sleep(200 * time.Millisecond)
fmt.Println(request, &request)
}()
}
}
time.Sleep(500 * time.Millisecond)
}
输出(每个循环迭代中
request
的地址不同):1 0xc0000b8000
2 0xc0000b8008
1 0xc0000b8000
2 0xc0000b8008
请参阅:0xc0000b8000!= 0xc0000b8008
关于loops - 是否应该在阻止来自 channel 的for-select循环时将请求对象传递给goroutine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60109146/