2016-08-18 3 views
5

초기화되지 않은 채널을 보유하는 구조체가 있습니다.초기화되지 않은 채널은 어떻게 작동합니까?

내가 쓸 때 루틴이 예상대로 차단되지만 독자에게 파이프에 무엇이 있는지 알려주지 않습니다.

나는 오류가 없으며 무엇을하고 있는지 궁금합니다. Go.

다음 예에서는 pushed 또는 got it 메시지가 인쇄되지 않습니다. 여기

type MyStruct struct { 
    over chan bool 
} 

func main() { 
    nonInitialized := &MyStruct{} 
    // nonInitialized.over = make(chan bool) 
    go func() { 
     for i := 0; i < 10; i++ { 
      select { 
      case <-nonInitialized.over: 
       fmt.Println("got it") 
      default: 
       // proceed 
      } 
      fmt.Println("do some stuff") 
      time.Sleep(10 * time.Millisecond) 
     } 
     panic("took too long") 
    }() 
    // push on the non initialized channel 
    fmt.Println("pushing") 
    nonInitialized.over <- true 
    fmt.Println("pushed") 
} 

https://play.golang.org/p/76zrCuoeoh는이 질문의 목적 (내가 채널을 초기화해야 알 수없는

놀이터입니다합니다 (초기화 데이터 주석을 제거하고 매력처럼 작동합니다), 내가 알고 싶은 Go에서 초기화되지 않은 채널로 어떤 일이 일어나는지)

답변

7

에 "초기화되지 않은"필드 또는 변수가 nil 모든 채널 유형의 zero value이있을 것이다. 이제 채널에 대한 nil 채널의 작동 방식에 대해 살펴 보겠습니다.

그것은 하나 개의 포스트에 채널 공리를 수집 가치가있다 :

추론 (Spec: Receive operator) 제로 값을 리턴 채널 값 nil 인 경우, 하나에 대한 참조를 보유하지 않으므로 아무도 준비 것 그것으로부터받는 것 (우리가 보내고 싶은 것); 또는 그것에 무엇이든 보낼 수 있습니다.

자세한 추론 및 자세한 내용은 Dave Cheney: Channel Axioms에서 읽을 수 있습니다. 완전성

:

  • Closingnil 채널이 발생 run-time panic (단지 이미 폐쇄 된 채널을 폐쇄 등).
  • 채널은 0이고; 길이 및 용량이 0nil 슬라이스 및 맵에 따라

추론 "닫힘"상태이지만 nil 채널 (하나만 nil 채널 및 "폐쇄없는"채널 없음 "폐쇄"의 하나 하나가) 상태를 가질 수 없다. 그리고 nil 채널에 대기중인 요소가 없으므로 (len = 0) 버퍼 용량이 없습니다 (따라서 cap = 0).