Middle
Ką galima ir ko negalima daryti su srauto saugumu kanaluose Go?
sobes.tech AI
Atsakymas iš AI
Gali:
- Siųsti ir gauti duomenis. Kiekvienas skaitymas ir rašymas į kanalą yra atominė operacija.
- Uždaryti kanalą. Uždarymas signalizuoja, kad duomenų siuntimas baigtas.
- Naudoti
selectoperatorių neblokuojančiai sąveikai su keliais kanalais. - Naudoti buferinius ir nebūferinius kanalus skirtingiems sinchronizacijos scenarijams.
Negalima:
- Uždaryti kanalą iš kelių gorutinių vienu metu be papildomos sinchronizacijos. Tai gali sukelti paniką.
- Uždaryti jau uždarytą kanalą. Tai taip pat sukels paniką.
- Siųsti duomenis į uždarytą kanalą. Tai sukels paniką.
- Laukti skaitymo iš nulio (neinicijuoto) kanalo. Tai užblokuos gorutina.
- Laukti rašymo į nulio (neinicijuotą) kanalą. Tai užblokuos gorutina.
Pavyzdys naudojant kanalus:
// Sukurti bebuferinį kanalą int
messages := make(chan int)
// Gorutina duomenų siuntimui
go func() {
messages <- 1 // Siųsti 1 į kanalą
messages <- 2 // Siųsti 2 į kanalą
close(messages) // Uždaryti kanalą po siuntimo
}()
// Skaityti duomenis iš kanalo
firstMessage := <-messages
secondMessage := <-messages
// Skaitymas iš uždaryto kanalo grąžina nulines reikšmes ir ok=false
value, ok := <-messages