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
selectdo 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