为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
烙印99 2022-05-17 10:33:47
我在代码中有以下 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


查看完整回答
反对 回复 2022-05-17
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信