send 문

send 문 (Send statements)

채널을 쓰는 가장 기본적인 동작, 바로 값을 보내는 문법이에요. 고루틴 사이에서 데이터를 주고받을 때 이 문장이 중심 역할을 하죠. 채널로 값을 보내는 방법과 그 조건, 그리고 주의할 점을 순서대로 살펴볼게요.

출처: Go Specification

본문

send 문은 채널에 값을 보내요. 채널로 쓰인 표현식은 채널 타입이어야 하고, 채널의 방향이 send 연산을 허용해야 하며, 보내는 값의 타입은 채널의 원소 타입에 **할당 가능(assignable)**해야 해요.

SendStmt = Channel "<-" Expression .
Channel  = Expression .

채널 표현식과 값 표현식은 모두 통신이 시작되기 전에 평가돼요. 통신은 send가 진행될 수 있을 때까지 블록되고요. 언버퍼드 채널은 수신자가 준비되어 있을 때 send가 진행돼요. 버퍼드 채널은 버퍼에 자리가 있을 때 진행되고, 닫힌 채널에 보내면 런타임 패닉(run-time panic)이 발생해요. 그리고 nil 채널에 보내는 것은 영원히 블록돼요.

ch <- 3  // send value 3 to channel ch

여기서 ch <- 3은 채널 ch에 값 3을 보내는 예시예요. 만약 채널 표현식의 타입이 **타입 파라미터(type parameter)**라면, 그 타입 집합에 속한 모든 타입이 send 연산을 허용하는 채널 타입이어야 하고, 모두 같은 원소 타입을 가져야 하며, 보내는 값의 타입이 그 원소 타입에 할당 가능해야 해요.

더 알아보기

  • 채널 자체에 대해 더 알고 싶다면 Channel types을 살펴보세요.
  • 값을 받는 쪽 문법(수신 연산)은 채널 통신의 반대편이에요. 통신과 관련된 다른 문장들을 함께 보면 구조가 더 잘 잡혀요.
  • nil 채널이 왜 통신을 하지 않고 블록되는지, 그 동작이 고루틴 스케줄링에서 어떤 의미를 갖는지 이해하면 채널을 안전하게 다루는 데 도움이 돼요.