Sobes.tech
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.