제공된 코드에서 시간 초과 사례는 select 문과 time.After() 호출을 사용하여 구현됩니다. 그런데 timeout 경우는 실행되지 않습니다.
이유는 time.After() 함수가 호출될 때마다 새로운 채널을 생성하기 때문입니다. select 문이 c1 채널(첫 번째 for 루프)에서 값을 수신하면 기존 time.After() 채널이 삭제됩니다. 따라서 시간 초과 사례에는 값을 받을 기회가 없습니다.
이 문제를 해결하려면 for 루프 외부에서 time.After() 채널을 한 번만 생성하세요. 이렇게 하면 실행 전반에 걸쳐 동일한 채널이 타임아웃 케이스에 사용됩니다.
수정된 코드는 다음과 같습니다.
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
이 수정을 통해 타임아웃 케이스는 2초 후에 성공적으로 실행됩니다. , 해당 기간 내에 c1 채널에서 값이 수신되지 않는 한.
위 내용은 채널을 사용할 때 Golang 시간 초과 사례가 트리거되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!