Sobes.tech
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