<-를 채널 변수 오른쪽에 작성하면 채널에 값을 전송하고, <-를 채널 변수 왼쪽에 작성하면 채널로부터 값을 수신한다. 채널에 값을 전송하거나 수신할 때 채널이 준비되지 않으면 준비될 때까지 대기한다. 즉, 채널이 비어 있지 않으면 전송되지 않고, 채널에 값이 들어오기 전에는 수신되지 않는다.
5.1 고루틴에서 작성한 예제를 채널을 사용하여 다음과 같이 수정해 보자.
package main import ( "fmt" "time" ) func main() { fmt.Println("main 함수 시작", time.Now()) done := make(chan bool) go long(done) go short(done) <-done <-done fmt.Println("main 함수 종료", time.Now()) } func long(done chan bool) { fmt.Println("long 함수 시작", time.Now()) time.Sleep(3 * time.Second) // 3초 대기 fmt.Println("long 함수 종료", time.Now()) done <- true } func short(done chan bool) { fmt.Println("short 함수 시작", time.Now()) time.Sleep(1 * time.Second) // 1초 대기 fmt.Println("short 함수 종료", time.Now()) done <- true }
함수로 done 채널을 전달하고, 각 함수에서는 처리를 완료한 후 done 채널로 완료 메시지를 전달한다. 메인 함수에서는 done 채널로부터 메시지를 받고 프로그램을 종료한다. 다음은 실행 결과이다.
실행 결과
main 함수 시작 2009-11-10 23:00:00 +0000 UTC
long 함수 시작 2009-11-10 23:00:00 +0000 UTC
short 함수 시작 2009-11-10 23:00:00 +0000 UTC
short 함수 종료 2009-11-10 23:00:01 +0000 UTC
long 함수 종료 2009-11-10 23:00:03 +0000 UTC
main 함수 종료 2009-11-10 23:00:03 +0000 UTC