Junior — Middle
Ma'lumotlarni uzatish uchun bufferli kanal ishlatiladigan voqeani misol qilib keltira olasizmi?
sobes.tech AI
AIdan javob
Go'da bufferli kanal, goroutine'lar arasında ma'lumot uzatish uchun ishlatiladi, lekin yuboruvchi hozirda ma'lumotlarni qabul qilishga tayyor bo'lmasa, darhol bloklanmaydi. Masalan, ishlab chiqaruvchi ma'lumotlarni iste'molchidan tezroq ishlab chiqarayotgan holatda, bufferli kanal bir nechta elementlarni yig'ishga imkon beradi va ishlab chiqaruvchini kutishga majbur qilmaydi.
Misol:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 3) // 3 ta elementli buffer
// Ishlab chiqaruvchi
go func() {
for i := 1; i <= 5; i++ {
fmt.Printf("Yuborilmoqda: %d\n", i)
ch <- i // buffer to'ldirilmaguncha bloklanmaydi
}
close(ch)
}()
// Iste'molch
time.Sleep(time.Second) // kechikishni simulyatsiya qilamiz
for val := range ch {
fmt.Printf("Qabul qilindi: %d\n", val)
time.Sleep(500 * time.Millisecond) // sekin ishlov berish
}
}
Bu misolda, ishlab chiqaruvchi bufferli kanalga birinchi 3 qiymatni bloklamasdan yuborishi mumkin va keyin iste'molchidan joy bo'shatilishini kutadi.