🐾   [Golang] 채널(channel)에서 주의할 점

이전꺼 글 넣기 2022.10.05 - [Study/Go 언어] - [golang] 채널(channel) 기본 문법

주의할 점

1) 채널이 꽉 찼을 경우

예를 들어보자

	ch := make(chan int, 3)
	ch <- 1
	ch <- 2
	ch <- 3
	ch <- 4

	fmt.Println("finish")

위에 만든 채널에 1, 2, 3을 넣었다. 그래서 채널이 꽉 찼다. 이 상태에서 4를 넣으면 어떻게 될까?

image

결괏값

fatal error: all goroutines are asleep - deadlock!

채널이 꽉 차서 4는 send를 하기 위해서 계속 대기를 한다.
그래서 finish가 출력되지 않고 프로그램이 비정상적으로 종료된다.

2) 채널이 비어 있는 경우

예를 들어보자

ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3

<-ch
<-ch
<-ch
<-ch //채널에 값을 가져올 수 없어서 무한 대기

fmt.Println("finish")

채널에 1, 2, 3을 넣는다. 그리고 채널을 4번 뺀다. 그럼 어떻게 될까?

image 결과값
fatal error: all goroutines are asleep - deadlock!

4번째 호출을 했을 때 채널 안에 값이 없어서 가져올 수 없는 상황이다.
그래서 무한 대기를 타다가 비정상적으로 종료가 된다.

참조

https://github.com/YooGenie/go-study/issues/42

​ ​ ​