Должен ли я передать объект запроса в goroutine при блокировке для выбора l oop из канала? - PullRequest
1 голос
/ 07 февраля 2020

У меня есть следующая структура 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 для l oop переменных итераторов часть общих ошибок также применимо к моему случаю и почему это применимо / не применимо здесь

1 Ответ

3 голосов
/ 07 февраля 2020

Нет ( здесь не применяется ), у вас есть новая переменная (адрес памяти) на каждой итерации l oop:

 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 в каждой итерации l oop отличается):

1 0xc0000b8000
2 0xc0000b8008
1 0xc0000b8000
2 0xc0000b8008

См .: 0xc0000b8000! = 0xc0000b8008

...