Можно ли передавать слайс в разные горутины

«Можно ли передавать слайс в разные горутины» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, но нужно быть осторожным с конкурентным доступом. Слайс — это ссылочный тип, и его передача в горутины означает, что все горутины работают с одним и тем же базовым массивом. Если горутины изменяют слайс, возможны гонки данных (data race).

Пример с проблемой:

func main() {
    s := []int{1, 2, 3}
    for i := range s {
        go func() {
            s[i] *= 2 // Data race!
        }()
    }
    time.Sleep(time.Second)
    fmt.Println(s) // Результат непредсказуем
}

Решение:

  1. Использовать мьютексы (sync.Mutex).
  2. Передавать копию слайса или отдельных элементов.
  3. Использовать каналы для безопасной передачи данных.

Безопасный вариант:

func main() {
    s := []int{1, 2, 3}
    var wg sync.WaitGroup
    for i := range s {
        wg.Add(1)
        go func(val int) {
            defer wg.Done()
            fmt.Println(val * 2) // Без гонок
        }(s[i])
    }
    wg.Wait()
}