이번 편의 목표: 연체료 계산을 다른 고루틴에서 실행하고, 채널로 그 정수를 받아 출력합니다.
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은 그 값 하나를 출력합니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.