Go 언어 채널 대하여 배워보기
오늘은 Go 언어의 채널에 대하여 작성하면서 배워보려 합니다.
package main
import (
"fmt"
)
func main() {
var a chan int
fmt.Println(a)
a = make(chan int)
fmt.Println(a)
}
int 채널을 선언하기만 하면 nil으로 표기되고, make로 초기화하면 주소값이 할당됩니다.
package main
import (
"fmt"
)
func ch(c chan int) {
c <- 1
}
func main() {
c := make(chan int)
go ch(c)
i := <- c
fmt.Println(i)
}
고루틴 함수에서 채널에 송신하고, 메인 함수에서 변수로 수신하는 예시입니다.
채널은 고루틴 함수에서 데이터를 전송하기 전까지 기다리게 하기 때문에 이전처럼 시간을 이용하지 않습니다.
package main
import (
"fmt"
)
func ch2(c chan <- int) {
c <- 1
}
func main() {
c2 := make(chan int)
go ch2(c2)
fmt.Println(<- c2)
}
송신만 전용으로 하게 채널 파라미터로 지정할 수 있습니다.
package main
import (
"fmt"
)
func ch(c chan <- int) {
c <- 1
}
func ch3(c2 <- chan int) {
i:=<-c2
fmt.Println(i)
}
func main() {
c3 := make(chan int)
go ch(c3)
go ch3(c3)
}
ch3 이라는 고루틴 함수의 태널 파라미터로 수신만 할수 있게 해보았습니다.
package main
import (
"fmt"
)
func ch4(c chan int) {
for i := 0; i < 5; i++ {
c <- i
}
close(c)
}
func main() {
c4 := make(chan int)
go ch4(c4)
for {
v, o := <-c4
if o == false {
break
}
fmt.Println(v, ok)
}
}
고루틴 함수에서 작업을 하다가 채널을 close로 닫으면 상태가 false로 변경되어 출력됩니다.
이를 이용하여 채널이 종료되는 것을 메인함수에서 감지할 수 있습니다.
Written on September 22, 2018