Middle
Šta se može, a šta ne može raditi sa sigurnošću toka u kanalima u Go?
sobes.tech АИ
Одговор од АИ
Може:
- Испоручити и примити податке. Свако читање и упис у канал је атомарна операција.
- Затворити канал. Затварање сигнализира да је завршено слање података.
- Користити оператор
selectза неблокирајућу интеракцију са више канала. - Користити канал са буфером и без буфера за различите сценарије синхронизације.
Не може:
- Затворити канал из више горутина истовремено без додатне синхронизације. Ово може довести до панике.
- Затворити већ затворени канал. Ово ће такође довести до панике.
- Послати податке у затворени канал. Ово ће изазвати панику.
- Чекати читање из нултог (неиницијализованог) канала. Ово ће блокирати горутину.
- Чекати запис у нулти (неиницијализовани) канал. Ово ће блокирати горутину.
Пример коришћења канала:
// Креирање небуферираног канала за int
messages := make(chan int)
// Горутин за слање података
go func() {
messages <- 1 // Пошаљи 1 у канал
messages <- 2 // Пошаљи 2 у канал
close(messages) // Затвори канал након слања
}()
// Читање података из канала
firstMessage := <-messages
secondMessage := <-messages
// Читање из затвореног канала враћа нулеву вредност и ok=false
value, ok := <-messages