y0u_bat
[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)
}
'프로그래밍 > Go언어' 카테고리의 다른 글
[Go언어] 9. 고루틴 (쓰레드?) (0) | 2016.01.11 |
---|---|
[Go언어] 8. 인터페이스 (0) | 2016.01.10 |
[Go언어] 7. 구조체 (0) | 2016.01.08 |
[Go언어] 6. 포인터 (0) | 2016.01.08 |
[Go언어] 5. 클로저,지연호출,패닉과 복구 (0) | 2016.01.08 |