Ответ
Да, можно, но нужно быть осторожным с конкурентным доступом. Слайс — это ссылочный тип, и его передача в горутины означает, что все горутины работают с одним и тем же базовым массивом. Если горутины изменяют слайс, возможны гонки данных (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) // Результат непредсказуем
}
Решение:
- Использовать мьютексы (
sync.Mutex). - Передавать копию слайса или отдельных элементов.
- Использовать каналы для безопасной передачи данных.
Безопасный вариант:
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()
}