Middle
Ko var un ko nevar darīt ar plūsmas drošību kanālos Go?
sobes.tech AI
Atbilde no AI
Var:
- Sūtīt un saņemt datus. Katrs lasījums un rakstīšana kanālā ir atomiska operācija.
- Aizvērt kanālu. Aizvēršana signalizē, ka datu sūtīšana ir pabeigta.
- Izmantot
selectoperatoru nevainojamai mijiedarbībai ar vairākiem kanāliem. - Izmantot buferētus un nebuferētus kanālus dažādiem sinhronizācijas scenārijiem.
Nav atļauts:
- Aizvērt kanālu no vairākām gorutīnām vienlaicīgi bez papildu sinhronizācijas. Tas var novest pie panikas.
- Aizvērt jau aizvērtu kanālu. Tas arī izraisīs paniku.
- Sūtīt datus uz aizvērtu kanālu. Tas izraisīs paniku.
- Gaidi lasījumu no nulles (neinitializēta) kanāla. Tas bloķēs gorutinu.
- Gaidi rakstīšanu uz nulles (neinitializēta) kanāla. Tas bloķēs gorutinu.
Piemērs kanālu izmantošanai:
// Izveidot bezbuferu kanālu int
messages := make(chan int)
// Gorutīna datu sūtīšanai
go func() {
messages <- 1 // Nosūtīt 1 uz kanāla
messages <- 2 // Nosūtīt 2 uz kanāla
close(messages) // Aizvērt kanālu pēc sūtīšanas
}()
// Datu lasīšana no kanāla
firstMessage := <-messages
secondMessage := <-messages
// Lasīšana no aizvērta kanāla atgriež null vērtību un ok=false
value, ok := <-messages