Назад к вопросам
Junior — Middle
73
Можно ли осуществлять конкурентное чтение данных из среза в языке программирования?
Ответ от нейросети
sobes.tech AI
В Go срезы (slices) являются ссылочными типами, которые указывают на массив в памяти. Конкурентное чтение из среза безопасно, если при этом никто не изменяет содержимое среза или базового массива. То есть, если несколько горутин только читают данные из одного среза без записи, то это не приведёт к гонкам данных.
Однако, если хотя бы одна горутина изменяет элементы среза, а другие читают или пишут одновременно, то возникает гонка данных, и поведение не определено.
Пример безопасного конкурентного чтения:
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
fmt.Println(slice[0])
}()
go func() {
defer wg.Done()
fmt.Println(slice[1])
}()
wg.Wait()
Если же нужно одновременно читать и писать, следует использовать синхронизацию (например, mutex) или другие механизмы безопасности.