>백엔드 개발 >Golang >Go 버퍼링된 채널이 가득 찼는지 효율적으로 확인하려면 어떻게 해야 합니까?

Go 버퍼링된 채널이 가득 찼는지 효율적으로 확인하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-14 11:14:10425검색

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

버퍼 채널이 꽉 찼는지 확인하는 방법

Go에서 버퍼 채널은 데이터를 저장할 수 있는 용량이 제한되어 있습니다. 채널이 가득 차면 해당 채널로 데이터를 보내면 보낸 사람이 차단됩니다. 그런데 차단하는 대신 데이터를 삭제하려는 경우 채널이 꽉 찼는지 어떻게 확인할 수 있나요?

Select 문을 사용한 솔루션

확인하는 한 가지 방법 버퍼링된 채널이 꽉 찼을 때 기본 사례로 select 문을 사용하는 것입니다. 전체 채널로 데이터를 보내는 등 실행할 수 있는 사례가 없으면 기본 사례가 실행됩니다.

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")
    }
}

출력:

Channel full. Discarding value

이 코드는 크기 1의 버퍼링된 채널을 생성하고 이를 채울 값을 보냅니다. 그런 다음 select 문은 채널에 다른 값을 보내려고 시도합니다. 채널이 가득 차면 기본 케이스가 실행되어 메시지를 인쇄하고 값을 버립니다.

보내지 않고 확인

또는 요소 수를 확인할 수 있습니다. len(ch)을 사용하여 채널에 대기합니다. 이를 통해 데이터 전송을 시도하지 않고도 채널이 꽉 찼는지 확인할 수 있습니다.

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

단, 동시 데이터 흐름으로 인해 if 블록을 입력하는 순간 비교 결과가 무효화될 수 있다는 점에 유의하세요. .

위 내용은 Go 버퍼링된 채널이 가득 찼는지 효율적으로 확인하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.