>  기사  >  백엔드 개발  >  Golang은 선택을 사용할 수 없습니다

Golang은 선택을 사용할 수 없습니다

WBOY
WBOY원래의
2023-05-12 20:23:36586검색

Go 언어에서 select는 여러 채널에서 데이터 수신을 기다릴 수 있는 매우 유용한 언어 구조입니다. 채널 중 하나에 수신할 데이터가 있으면 즉시 해당 작업을 수행합니다. 하지만 Go 언어에서는 select 문을 사용할 수 없는 경우가 있습니다. 아래에서 이러한 상황을 분석해 보겠습니다.

  1. 채널 자체에서는 select를 사용할 수 없습니다

먼저 이해해야 할 점은 Go 언어로 채널을 선언할 때 채널의 유형을 지정해야 하며, select는 유형이 가능한 경우에만 사용할 수 있다는 것입니다. 비교하고 복사하고 닫을 수 있습니다. 예를 들어 아래에 정의된 채널은 다음과 같습니다.

c1 := make(chan int)
c2 := make(chan bool)

int 및 bool 유형은 비교할 수 있는 기본 유형이므로 모두 선택할 수 있습니다.

그러나 구조 유형의 채널을 정의하는 경우 select를 직접 사용할 수 없습니다. 예:

type MyStruct struct {
    x int
    y string
}

c := make(chan MyStruct)

Select는 MyStruct 유형을 비교할 수 없기 때문에 사용할 수 없으므로 채널 유형이 MyStruct인 채널에서는 사용할 수 없습니다. 선택하다.

  1. 기본문 처리가 필요합니다

select에는 특별한 경우가 있는데, 이는 기본문인데 모든 경우를 즉시 실행할 수 없을 때 실행하게 됩니다. select에서 default 문을 사용하면 어떤 경우에도 수신할 데이터가 있으면 default 문도 실행됩니다.

단, 기본 문을 사용할 때는 고려되지 않은 상황을 포함하여 선택 시 발생할 수 있는 모든 상황을 고려해야 합니다. 모든 상황을 고려하지 않으면 기본값을 사용할 수 없으며 그렇지 않으면 잠재적인 버그가 발생할 수 있습니다. 예를 들어, 다음 코드는

select {
case msg1 := <-c1:
    fmt.Println("received", msg1)
case msg2 := <-c2:
    fmt.Println("received", msg2)
default:
    fmt.Println("nothing received") // 未考虑到其他情况的default语句
}

이 예에서는 일부 데이터가 무시되거나 잘못 처리될 수 있는 다른 모든 상황을 고려하지 않았습니다. 그러므로 기본문을 사용할 때에는 가능한 모든 상황을 고려해야 합니다.

  1. 동기 통신 중에는 Select를 사용할 수 없습니다

기본문 외에 Go 언어에서도 동기 통신이 되는 상황이 있습니다. 즉, 채널 버퍼가 가득 차거나 가득 차면 데이터를 쓸 수 없고, 다른 고루틴이 데이터를 받을 때까지 기다려야 합니다. 이 경우 Select를 사용할 수 없습니다.

예를 들어 다음 코드는

c := make(chan int, 1)
c <- 1
c <- 2 // 缓冲区已满,此处会堵塞

이 예에서는 버퍼 크기가 1인 버퍼가 있는 채널을 정의합니다. 먼저 채널에 데이터 1을 쓴 다음 채널에 데이터 2를 씁니다. 이때 버퍼가 가득 차서 이 작업이 차단됩니다. select에서 이 채널로부터 데이터를 수신하려고 하면 버퍼가 가득 차서 이 작업도 차단되고 다른 작업을 수행할 수 없습니다.

따라서 select를 사용할 때는 교착 상태 상황을 피하고 채널의 읽기 및 쓰기 작업이 독립적으로 실행될 수 있는지 확인해야 합니다.

즉, Go 언어에서는 select를 올바르게 사용하는 것이 매우 중요하며 가능한 모든 상황을 고려하여 프로그래밍 오류 및 교착 상태와 같은 문제를 피해야 합니다. 동시에 우리는 부적절한 상황에서 select를 사용하여 시간과 자원을 낭비하는 것을 피하기 위해 몇 가지 특별한 상황을 인식해야 합니다.

위 내용은 Golang은 선택을 사용할 수 없습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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