이번 편의 목표: 연체료 계산을 다른 고루틴에서 실행하고, 채널로 그 정수를 받아 출력합니다.

go 뒤에 함수 호출을 적으면 그 호출이 현재 함수와 동시에 진행됩니다. 채널은 고루틴 사이로 값을 전달합니다. 버퍼가 없는 채널은 보내는 쪽과 받는 쪽이 만날 때까지 기다립니다.

Go
package main

import "fmt"

func fee(days int, out chan int) {
	if days <= 0 {
		out <- 0
		return
	}
	out <- days * 100
}

func main() {
	out := make(chan int)
	go fee(3, out)
	fmt.Println(<-out)
}

출력은 300입니다. fee가 300을 채널에 넣고, main의 <-out이 그 값을 꺼냅니다. main이 받는 줄에서 기다리므로, 고루틴이 끝나기 전에 프로그램이 종료되지 않습니다. 받는 쪽이 없는데 보내기만 하면 그 고루틴은 만남이 올 때까지 기다립니다.

이 편은 값 하나만 주고받습니다. 여러 값을 계속 보낼 때는 보내는 쪽이 채널을 닫고, 받는 쪽이 닫힘을 확인합니다. 닫지 않은 채널을 끝까지 읽는 반복은 이 연재에서 쓰지 않습니다.

직접 해 보기

go fee(4, out)으로 바꿔 출력이 400인지 확인하세요.

해설

4일은 0보다 크므로 채널에 400이 들어갑니다. main은 그 값 하나를 출력합니다.