Middle
Ի՞նչ տեսակների ալիքներ կան Go-ում: Խոսեք բուֆերային և բուֆերային չլինած ալիքների մասին։
sobes.tech AI
Պատասխան AI-ից
Go լեզվում, ալիքները (channels) հիմնականում երկու տեսակ են՝ բուֆերային և բուֆերային չլինող:
-
Բուֆերային չլինող ալիքներ՝ դա առանց ներքին բուֆերի ալիքներ են: Դրանց վրա տվյալ ուղարկումը բլոկվում է, մինչև որ մյուս goroutine-ները չկարդան արժեքը ալիքից, և հակառակը՝ ընթերցումը բլոկվում է, մինչև որ արժեքը հայտնվի: Սա ապահովում է սինխրոնիզացիա goroutine-ների միջև:
-
Բուֆերային ալիքներ ունեն ֆիքսված չափի ներքին բուֆեր: Տվյալ ուղարկումը բլոկվում է միայն այն ժամանակ, երբ բուֆերը լցված է, և ընթերցումը՝ երբ բուֆերը դատարկ է: Սա որոշակի անսինխրոնություն է թույլ տալիս ուղարկողի և ստացողի միջև:
Օրինակ ստեղծում և օգտագործում:
ch := make(chan int) // բուֆերային չլինող ալիք
chBuf := make(chan int, 3) // բուֆերային ալիք 3 տարրով
// Չլինող ալիք պահանջում է սինխրոնիզացիա:
ngo func() {
ch <- 42 // բլոկվում է, մինչև որ մեկը կարդա
}()
արժեք := <-ch
// Բուֆերային ալիք թույլ է տալիս ուղարկել մինչև 3 տարր առանց բլոկավորման:
chBuf <- 1
chBuf <- 2
chBuf <- 3
// Երբ փորձեն ուղարկել 4-րդ տարր, այն բլոկվելու է, մինչև որ այն չկարդան
արժեքBuf := <-chBuf
Այսպիսով, ալիքների տեսակը ընտրելը կախված է սինխրոնիզացիայի և կատարողականության պահանջներից։