亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該將請求對象傳遞給 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 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號