繁体   English   中英

我应该将请求对象传递给 goroutine 以阻止来自通道的 for-select 循环吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM