Sobes.tech
Middle

Co można, a czego nie można robić z bezpieczeństwem przepływu w kanałach w Go?

sobes.tech AI

Odpowiedź od AI

Można:

  • Wysyłać i odbierać dane. Każde odczytanie i zapis do kanału jest operacją atomową.
  • Zamknąć kanał. Zamknięcie sygnalizuje zakończenie wysyłania danych.
  • Używać operatora select do nieblokującej interakcji z wieloma kanałami.
  • Używać kanałów buforowanych i bez bufora do różnych scenariuszy synchronizacji.

Nie można:

  • Zamknąć kanału z wielu gorutyn jednocześnie bez dodatkowej synchronizacji. Może to prowadzić do paniki.
  • Zamknąć już zamknięty kanał. To również spowoduje panikę.
  • Wysyłać dane do zamkniętego kanału. Spowoduje to panikę.
  • Oczekiwać odczytu z kanału zerowego (niezainicjalizowanego). To zablokuje gorutynę.
  • Oczekiwać zapisu do kanału zerowego (niezainicjalizowanego). To zablokuje gorutynę.

Przykład użycia kanałów:

// Tworzymy niebuforowany kanał dla int
messages := make(chan int)

// Gorutyna do wysyłania danych
go func() {
	messages <- 1 // Wysyła 1 do kanału
	messages <- 2 // Wysyła 2 do kanału
	close(messages) // Zamknięcie kanału po wysłaniu
}()

// Odczyt danych z kanału
firstMessage := <-messages
secondMessage := <-messages

// Odczyt z zamkniętego kanału zwraca wartość zero i ok=false
value, ok := <-messages