[Go] 채널

채널은 고루틴듀끼리 정보λ₯Ό 주고받은 μΌμ’…μ˜ ν†΅λ‘œλ‹€.

μ±„λ„μ˜ 생성은 make ν•¨μˆ˜μ™€ chan ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
make(chan νƒ€μž…)
chan T μžμ²΄κ°€ T의 채널 νƒ€μž… ν‘œν˜„μ΄λ‹€.

μƒμ„±λœ 채널 λ³€μˆ˜μ— μ ‘κ·Όν• λ•ŒλŠ” μ•„λž˜μ™€ 같이 ν•œλ‹€.
λ³€μˆ˜<-κ°’ (λŒ€μž…: μ†‘μ‹ μž)
<-λ³€μˆ˜ (κ°’ νšλ“: μˆ˜μ‹ μž)

μ €κΈ°μ„œ 값을 λŒ€μž…ν•˜λŠ” 고루틴은 μ†‘μ‹ μžκ°€ 되고 νšλ“ν•˜λŠ”κ±΄ μˆ˜μ‹ μžκ°€ λœλ‹€. 그리고 μˆ˜μ‹ μžλŠ” μ†‘μ‹ μžκ°€ 값을 λ³΄λ‚Όλ•ŒκΉŒμ§€ μžλ™μœΌλ‘œ λΈ”λŸ­ν•΄μ„œ-동기화λ₯Ό ν•œλ‹€.

μˆ˜μ‹ μžμ™€ μ†‘μ‹ μžλŠ” 무쑰건 λŒ€μ‘μ΄ λ˜μ–΄μ•Ό ν•œλ‹€. μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ˜μ§„λ‹€.
그리고 ν•œλ†ˆμ΄ λ˜μ§„ λ°μ΄ν„°λŠ” ν•œλ†ˆλ§Œ λ°›λŠ”λ‹€. λ§Œμ•½ μˆ˜μ‹ μžκ°€ μ—¬λŸΏμΈλ° ν•œλ†ˆμ΄ λ˜μ§€λ©΄ ν•œλ†ˆλ§Œ λ°›κ³  λ‚˜λ¨Έμ§€ μˆ˜μ‹ μžλŠ” μ „λΆ€ λΈ”λŸ­μƒνƒœλ‘œ μœ μ§€λœλ‹€.

μ•„λž˜λŠ” 고루틴 λ‘˜μ΄μ„œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κ°„λ‹¨ν•œ μ½”λ“œλ‹€. image

image

μœ„μ—μ„  κ³ λ£¨ν‹΄κ°„μ—λ§Œ 채널 μ†‘μˆ˜μ‹ μ„ ν–ˆμ§€λ§Œ main도 ν•˜λ‚˜μ˜ main 고루틴이라 ν•  수 μžˆμœΌλ―€λ‘œ.. μ†‘μ‹ μ΄λ‚˜ μˆ˜μ‹ μ„ ν• μˆ˜μžˆλ‹€. image

image


@채널 μˆ˜μ‹ μ€ 사싀 2개의 값을 λ¦¬ν„΄ν•œλ‹€.
(κ°’, μˆ˜μ‹ μ„±κ³΅μ—¬λΆ€)의 ν˜•νƒœλ‹€. 채널이 λ‹«ν˜€μ„œ 더이상 값이 μ˜€μ§€ μ•ŠλŠ”λ‹€λ©΄ λ‘λ²ˆμ§Έ λ°˜ν™˜κ°’μœΌλ‘œ falseκ°€ λ“€μ–΄μ˜¨λ‹€.


@채널 λ³€μˆ˜λŠ” close λ‚΄μž₯ν•¨μˆ˜λ‘œ 닫을 수 μžˆλ‹€.
λ‹«νžŒ 채널은 솑신은 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ μˆ˜μ‹ μ€ κ°€λŠ₯ν•˜λ‹€.


@채널 λ³€μˆ˜λŠ” range의 순회 λŒ€μƒμ΄ 될 수 μžˆλ‹€.
range 채널 λ°˜λ³΅λ¬Έμ€ 채널이 λ‹«νžλ•ŒκΉŒμ§€ λ¬΄ν•œλ£¨ν”„λ₯Ό λˆλ‹€.


@selectλ¬Έμ΄λΌλŠ” 게 μžˆλ‹€. νŠΉμ • κ³ λ£¨ν‹΄μ—μ„œ μ—¬λŸ¬κ°œμ˜ 채널을 μˆ˜μ‹ ν•  경우 μ‚¬μš©ν•œλ‹€.
case에 채널 μˆ˜μ‹ λ¬Έμ„ μ—¬λŸ¬κ°œ λ‹€λŠ”λ°, μˆ˜μ‹ μ΄ 였길 기닀리닀가 κ°€μž₯ λ¨Όμ € μˆ˜μ‹ λœ 채널 caseλ₯Ό μ‹€ν–‰ν•˜κ³  μ’…λ£Œλœλ‹€.
defaultκ°€ μžˆλ‹€λ©΄ μˆ˜μ‹ μ΄ 였길 기닀리지 μ•Šκ³  λ°”λ‘œ 그게 μ‹€ν–‰λœλ‹€.
select {
case <-채널1: ...
case <-채널2: ...
case λ³€μˆ˜3:= <-채널3: ...
}


http://golang.site/go/article/22-Go-%EC%B1%84%EB%84%90