Sobes.tech
Junior — Middle

Je možné súčasne zapisovať údaje do kanála bez použitia vyrovnávacej pamäte?

sobes.tech AI

Odpoveď od AI

V jazyku Go môžu byť kanály s bufferom alebo bez bufferu. Pri kanáli bez bufferu sa zápis (odoslanie) zablokuje, kým iná gorutina ne prečíta hodnotu z kanála.

Súčasný zápis do kanála bez bufferu nie je možný, pretože odoslanie sa zablokuje do prijatia, a len jeden odosielateľ môže súčasne preniesť dáta.

Ak je potrebné vykonať súčasný zápis bez blokovania, používajú sa kanály s bufferom, kde odosielateľ môže vložiť dáta do bufferu bez čakania na okamžité prijatie.

Príklad kanála bez bufferu:

ch := make(chan int) // kanál bez bufferu

// Odoslanie sa zablokuje, kým niekto nečíta
ch <- 1

Pre súčasný zápis bez blokovania je potrebný buffer:

ch := make(chan int, 2) // buffer na 2 prvky
ch <- 1 // neblokuje
ch <- 2 // neblokuje

Zhrnutie: bez bufferu nie je možné súčasné zápisy vykonávať.