loops - 是否应该在阻止来自 channel 的for-select循环时将请求对象传递给goroutine?

标签 loops go goroutine

我在代码中具有以下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/

相关文章:

c# - 在无效用户输入时跳出 for 循环

c - 将字符串的地址传递给 fscanf() 会阻止不相关的代码块运行

javascript - Typescript:替换每个出现的循环。字符串操作循环

go - 增加 GO 中的堆大小

multithreading - 如果一个 goroutine 已完成,控制 goroutine 关闭的规范方法是什么?

concurrency - 这个chan是怎么泄露的?

bash - 在 bash 脚本的循环中使用 nohup

json - 解码具有映射结构的 json 文件

session - Gorilla session 包混淆

go - 为什么此 channel 上的发送不会被阻塞?