Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Semak dengan Cekap sama ada Saluran Go Buffered Telah Penuh?

Bagaimanakah Saya Boleh Semak dengan Cekap sama ada Saluran Go Buffered Telah Penuh?

Linda Hamilton
Linda Hamiltonasal
2024-12-14 11:14:10425semak imbas

How Can I Efficiently Check if a Go Buffered Channel is Full?

Cara Semak sama ada Saluran Penimbal Telah Penuh

Dalam Go, saluran penimbal mempunyai kapasiti terhad untuk menyimpan data. Apabila saluran penuh, menghantar data kepadanya akan menyekat pengirim. Walau bagaimanapun, jika anda ingin menggugurkan data dan bukannya menyekat, bagaimana anda boleh menentukan sama ada saluran itu penuh?

Penyelesaian menggunakan Pernyataan Pilih

Satu cara untuk menyemak sama ada saluran penimbal penuh adalah untuk menggunakan pernyataan pilih dengan kes lalai. Jika tiada kes boleh dilaksanakan, seperti menghantar data ke saluran penuh, kes lalai akan dilaksanakan.

package main

import "fmt"

func main() {
    ch := make(chan int, 1)

    // Fill it up
    ch <- 1

    select {
    case ch <- 2: // Put 2 in the channel unless it is full
    default:
        fmt.Println("Channel full. Discarding value")
    }
}

Output:

Channel full. Discarding value

Kod ini mencipta saluran penimbal bersaiz 1 dan menghantar nilai untuk mengisinya. Pernyataan pilih kemudian cuba menghantar nilai lain ke saluran. Jika saluran penuh, kes lalai akan dilaksanakan, mencetak mesej dan membuang nilai.

Semak tanpa Menghantar

Sebagai alternatif, anda boleh menyemak bilangan elemen beratur dalam saluran menggunakan len(ch). Ini membolehkan anda menentukan sama ada saluran penuh tanpa cuba menghantar data.

if len(ch) == cap(ch) {
    // Channel was full, but might not be by now
} else {
    // Channel wasn't full, but might be by now
}

Walau bagaimanapun, ambil perhatian bahawa keputusan perbandingan mungkin menjadi tidak sah apabila anda memasuki blok if disebabkan aliran data serentak .

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Semak dengan Cekap sama ada Saluran Go Buffered Telah Penuh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn