수신 연산자

수신 연산자

채널에서 값을 꺼내는 일은 고루틴끼리 데이터를 주고받는 가장 기본적인 순간이에요. 그런데 값을 '받는다'는 수신 연산이 실제로 어떻게 동작하는지, 특히 채널이 비어 있거나 닫혀 있을 때는 어떤 일이 일어나는지 한 번쯤은 헷갈리기 쉽죠. 이번에는 Go의 수신 연산자(Receive operator)가 값을 어떻게 받아들이고, 그 결과가 어떤 의미를 갖는지 차근차근 살펴볼게요.

출처: Go Specification

본문

채널 타입의 피연산자 ch에 대해, 수신 연산 <-ch의 값은 채널 ch에서 수신된 값이에요. 채널의 방향이 수신 연산을 허용해야 하고, 수신 연산의 타입은 채널의 요소 타입이 돼요. 이 표현식은 값이 준비될 때까지 블록(block)돼요. nil 채널에서 수신하면 영원히 블록돼요. 닫힌(closed) 채널에서의 수신 연산은 항상 즉시 진행될 수 있는데, 이전에 보내진 값들을 모두 수신한 뒤에는 요소 타입의 제로 값(zero value)을 산출해요.

v1 := <-ch
v2 = <-ch
f(<-ch)
<-strobe  // wait until clock pulse and discard received value

피연산자의 타입이 타입 파라미터(type parameter)라면, 그 타입 집합(type set) 안의 모든 타입이 수신 연산을 허용하는 채널 타입이어야 해요. 그리고 모두 같은 요소 타입을 가져야 하며, 그 요소 타입이 바로 수신 연산의 타입이 돼요.

수신 표현식을 대입문(assignment statement)이나 특별한 형태의 초기화에서 쓰면, 통신이 성공했는지 알려주는 추가적인 비타입(untyped) boolean 결과가 나와요.

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch

ok의 값은, 받은 값이 채널로의 성공적인 송신 연산에 의해 전달된 것이라면 true가 되고, 채널이 닫히고 비어 있어서 만들어진 제로 값이라면 false가 돼요.

더 알아보기