[Go언어] 10. 채널
채널
고루틴을 채널을 이용해서 데이터를 주고 받고 흐름제어도 가능함.
func sum(a int,b int,c chan int) {
c <- a+b
}
func main() {
c := make(chan int)
go sum(100,200,c)
a := <-c
fmt.Println(a)
}
결과: 300
채널 <- 값
- 해당채널에 해당값을 보낸다.
<-채널
- 이거는 채널에서 값이 올때까지 대기한다.
동기채널
func test(c chan int) {
for i :=0; i<10; i++ {
c <- i
time.Sleep(1*time.Second)
fmt.Println("test",i)
}
}
func main() {
c := make(chan int)
for i :=0; i<10;i++ {
<-c
fmt.Println("main",i)
}
}
채널버퍼 (비동기)
func main() {
c: make(chan bool,2) // 버퍼가 2
go func() {
for i:=0; i<10; i++ {
c <-true
fmt.Println("go",i)
}
}()
for i:=0; i<10;i++ {
<-c
fmt.Println("main",i)
}
}
셀렉트
func f1(c chan int) {
for {
c <- 10
time.Sleep(1*time.Second)
}
}
func f2(c chan string) {
for {
c <- "test"
time.Sleep(2*time.Second)
}
}
func f3(c1 chan int, c2 chan string)
{
for {
select {
case a := <-c1
fmt.Println(a)
case b := <-c2
fmt.Println(b)
}
}
}
func main() {
a := make(chan int)
b := make(chan string)
go f1(a)
go f2(b)
go f3(a,b)
}