我在代码中有以下 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 是否也适用于我的案例,为什么它在这里适用/不适用?
1 回答
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
不(不适用于此处),每次循环迭代都有新变量(内存地址):
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
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报
0/150
提交
取消