문제

내가 지금까지 본 모든 예는 결과를 얻기 위해 차단하는 것과 관련이 있습니다 ( <-chan 운영자).

내 현재의 접근 방식은 구조물에 포인터를 전달하는 것과 관련이 있습니다.

type goresult struct {
    result resultType;
    finished bool;
}

Goroutine이 완료시 작성합니다. 그런 다음 간단한 점검 문제입니다 finished 편리 할 때마다. 더 나은 대안이 있습니까?

내가 실제로 목표로하는 것은 QT 스타일 신호 슬롯 시스템입니다. 나는 해결책이 거의 사소하게 보일 것입니다 (chanS가 있습니다 많이 탐험되지 않은 잠재력)이지만, 나는 그것을 알아낼 수있는 언어에 대해서는 아직 익숙하지 않습니다.

도움이 되었습니까?

해결책

"Comma, Ok"패턴을 사용할 수 있습니다 (페이지 참조 "효과적인 이동"):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.

다른 팁

명세서를 선택하십시오 커뮤니케이션이 기다리는 중 임의의 지점을 취하면서 한 번에 여러 채널을 확인할 수 있습니다.

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

"Select"명령문의 모든 보내기 및 수신 표현에 대해, 채널 표현식은 상단에서 바닥 간 순서로 보내기 표현의 오른쪽에 나타나는 모든 표현식과 함께 평가됩니다. 결과 작업 중 하나가 진행될 수 있으면 하나가 선택되고 해당 커뮤니케이션 및 진술이 평가됩니다. 그렇지 않으면, 기본 케이스가있는 경우, 실행되는 경우; 그렇지 않은 경우, 명령문은 통신 중 하나가 완료 될 때까지 차단됩니다.

채널 버퍼를 들여다 보면 LEN을 사용하여 무엇이든 포함되어 있는지 확인할 수도 있습니다.

if len(channel) > 0 {
  // has data to receive
}

이것은 채널 버퍼와 달리 터치하지 않습니다 foo, gotValue := <- ch 언제 값을 제거합니다 gotValue == true.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top