토이 프로젝트 중 워커 풀 구현 중입니다. 채널 닫힘 여부를 판별해서 루프를 종료하려는데 값이 계속 들어옵니다.
코드:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 10
close(ch)
for i := 0; i < 3; i++ {
val := <-ch
fmt.Println(val)
}
}
오류: 10
0
0
시도: 채널 버퍼 크기 조정, select문 사용.
질문: 채널이 close 된 이후에 수신 시 0이 계속 반환되는 것을 방지하고 종료를 감지하려면 어떻게 해야 합니까?
댓글5
-
행복한하루
2026.10.30 03:22
-
빗방울
2026.10.30 06:09
맞음 ㅋㅋ
range 쓰는 게 제일 깔끔하긴 하네요.
작성자분 이거 보고 바로 해결하실듯.
-
빗방울
2026.10.30 10:36
오 맞네요 이게 정석이죠 ㅋㅋ
초보자분들은 ok 변수 빼먹어서 멘붕 오는 경우 많더라고요.
설명 깔끔하시네요 ㄷㄷ
-
빗방울
2026.10.30 06:58
처음 하면 다들 겪는 함정임 ㅋㅋ
근데 워커 풀이면 컨텍스트(ctx) 써서 종료 신호 주는 게 나중에 관리하기 편할 수도 있음
한번 찾아보셈
-
빗방울
2026.10.30 09:44
원래 고 언어가 이런 제로 밸류 때문에 헷갈리는 경우가 많음ㅋㅋ
작성자분 루프 돌릴 때 break 조건 잘 잡으셔서
무한루프 안 돌게 조심하세요 ㄷㄷ
모든 이야기1465
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1465개의 이야기
Go에서 채널로부터 값을 받을 때, 두 번째 반환 값인
ok불리언 변수를 사용하시면 됩니다.val, ok := <-ch형태로 작성하면, 채널이 닫히고 버퍼에 남은 모든 데이터가 소비되었을 때ok값이false로 바뀝니다.작성하신 코드의 루프 안에서
if !ok { break }구문을 추가해 보세요. 그러면 0이라는 제로 값이 출력되기 전에 루프를 안전하게 종료할 수 있습니다. 워커 풀을 구현 중이시라면for val := range ch문법을 사용하는 것도 좋은 방법입니다. 이 방식은 채널이 닫힐 때까지 자동으로 반복하며, 닫히는 순간 루프를 종료하므로 코드가 훨씬 간결해집니다.