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ť.