Golang Concurrency - Channel

2022. 8. 8. 22:04개발/Golang

728x90
반응형

 

채널이란 ?  고루틴끼리 주고 받으려고 사용하는 통신 매커니즘

몇가지 규칙이 있습니다.

 

1. 각 채널마다 특정한 데이터타입으로만 데이터를 교환할 수 있음 그것을 원소타입이라고 불름

2. 채널이 정상적으로 작동하려면 채널로 데이터를 보내는 상대방이 있어야 함

3. 채널을 새로 선언하는 문장은 chan 키워드로 표시하고, 채널을 닫으려면 close() 함수를 호출한다.

4. 채널를 매개변수로 사용 할 때 반드시 채널의 방향, 보낼 채널인지.. 받을 채널인지 명시해야 한다.

 

1. 채널의 사용법

# 채널 생성
c := make(chan int)
 
# 채널 쓰기
c <- x

# 채널 읽기
x <- c

채널을 쓰려면 <- 표시에 따라 쓰기 읽기가 가능하다.

 

package main

import (
	"fmt"
	"time"
)

func writeToChannel(c chan int, x int) {
	fmt.Println("1", x)
    // 채널을 쓰기
	c <- x
    // 채널을 닫음
	close(c)
	fmt.Println("2", x)
}

func main() {
	c := make(chan int)
	go writeToChannel(c, 10)
	time.Sleep(1 * time.Second)
	fmt.Println("Read: ", <-c)
	time.Sleep(1 * time.Second)

	// 채널을 읽음
	_, ok := <-c

	if ok {
		fmt.Println("channel is open!")
	} else {
		fmt.Println("channel is close")
	}
}

 

< 결과 >

# go run main.go 
1 10
Read:  10
2 10
channel is close

 

2. 채널 파라미터

# 채널 생성
c := make(chan int)

# 쓰기용 채널
func writech (c chan<-) {}

# 읽기용 채널
func readch (c <-chan) {}

채널을 쓰기용, 읽기용으로 사용이 가능하다. 만약에 타입에 맡게 지정후 사용하지않으면 에러가 발생한다.

 

 

 

728x90
반응형