[英]Should I pass request object to goroutine in blocking for-select loop coming from channel?
我在代码中有以下 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)
}()
?
如果是,那为什么?
换句话说 - 在循环迭代器变量上使用 goroutines on loop iterator variables 是否也适用于我的案例,为什么它在这里/不适用?
否(此处不适用),每次循环迭代都有新变量(内存地址):
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.