Loops 我应该在阻塞来自通道的select循环时将请求对象传递给GOROUTE吗?
对于代码中的select结构,我有以下内容:Loops 我应该在阻塞来自通道的select循环时将请求对象传递给GOROUTE吗?,loops,go,goroutine,Loops,Go,Goroutine,对于代码中的select结构,我有以下内容: go func(runCh chan Caller, shutdownSignal chan bool) { for { select { case request := <-runCh: go func() { w.Run(&request) }()
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)
go func(runCh chan Caller,shutdownSignal chan bool){
为了{
挑选{
案例请求:=否(不适用于此处),在每个循环迭代中都有新变量(内存地址):
case request := <-runCh:
输出(每个循环迭代中请求的地址不同):
请参阅:0xc0000b8000!=0xc0000b8008否(不适用于此处),在每个循环迭代中都有新变量(内存地址):
case request := <-runCh:
输出(每个循环迭代中请求的地址不同):
请参阅:0xc0000b8000!=0xc0000b8008这是准确的,但有点误导性-:=
并不是它与使用循环变量的问题的区别,即使这些变量是使用:=
创建的。对于这里的每个goroutine调用,它都将是一个且只有一个新的请求
变量。如果您更改e:=
到simplerequest=实际上,如果您将其更改为request=当然是request=这是准确的,但有点误导-:=
并不是它与使用循环变量的问题的区别,即使这些变量是使用:=
创建的t将是这里唯一一个新的请求变量。如果您将更改为simplerequest=实际上如果您将它更改为request=当然是请求=
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)
}
1 0xc0000b8000
2 0xc0000b8008
1 0xc0000b8000
2 0xc0000b8008