2014-02-20 7 views
3

는 I 매개 변수로하는 함수로 채널을 통과하는 두 시도를하지만, 둘 다 (교착) 실패 :함수에 채널을 매개 변수로 전달하는 방법은 무엇입니까?

시도 1

func done(signal *chan bool) { 
    *signal <- true 
} 

func main() { 
    signal := make(chan bool) 
    done(&signal) 
    <-signal 
    fmt.Println("completed") 
} 

시도 2 ​​: 음

func done(signal chan bool) { 
    signal <- true 
} 

func main() { 
    signal := make(chan bool) 
    done(signal) 
    <-signal 
    fmt.Println("completed") 
} 

나는 아이디어가 없다. 함수에 채널을 전달하는 적절한 방법은 무엇입니까?

+3

거의 모든 경우에서 chan, map 또는 slice 또는 함수 값에 포인터를 전달할 이유는 내부적으로 포인터를 포함하는 모든 참조 유형이므로 해당 값을 전달할 이유가 없습니다. 호출 대상에서 참조하는 데이터 대신 참조 유형 헤더를 변경하려는 경우는 예외입니다. 여기서는 그렇지 않습니다. – krait

답변

3

done(&signal)가 동 기적으로 호출됩니다 채널의 값의 여지가 있다면 채널은 차단하지 않습니다. 어쩌면 당신이 원하는 것은 비동기로 호출하는 것입니다. 그렇게 할

는 수행 기능은 채널에 기록 될 때까지 차단 함수 호출

go done(&signal) 

메인 스레드의 앞에 키워드 go을 넣어. 그리고 done 메소드는 메인 쓰레드가 채널을 읽을 때까지 채널 쓰기를 차단합니다.

14

채널은 기본적으로 버퍼링되지 않으므로 채널을 보낼 때 그 사람이 값을 수신 할 때까지 해당 전송은 을 차단합니다. 여기 코드에서 분명히 드러납니다. 사용자가 signal <- true을 수행하고있는 지점에 동일한 채널에서 수신 할 수 있거나 수신 할 수있는 사람이 없습니다. 당신은, 주에서 그런 식으로 실행 (전송을하는 goroutine)를 만들 수 있습니다

는 계속 값을 수신하는 사람이있을 것이다 : 등등 전송,

go done(signal) 

또는 당신이 버퍼 채널을 생성 할 수 있습니다

signal := make(chan bool, 1) 
관련 문제