package main
import (
"fmt"
"time"
)
func sendOnly(c chan<- int, cnt int) {
for i := 0; i < cnt; i++ {
c <- i
}
c <- 777
//fmt.Println(<-c) //수신 전용 채널에서 발신 처리 시 예외 발생
}
func receiveOnly(c <-chan int) {
for i := range c {
fmt.Println("received : ", i)
}
fmt.Println(<-c)
}
func main() {
//채널(Channel)
//함수 등의 매개변수에 수신 및 발신 전용 채널 지정 가능
//전용 채널 설정 후 방향이 다를 경우 예외 발생
//발신 전용 channel <- 데이터형
//수신 전용 <- channel
//매개 변수를 통해서 전용 채널 확인할 수 있다.
//채널 또한 함수의 반환 값으로 사용 가능
//예제1
c := make(chan int)
go sendOnly(c, 10) //발신전용
go receiveOnly(c) //수신전용
time.Sleep(2 * time.Second) //2초간 대기
}
package main
import (
"fmt"
)
func sum(cnt int) <-chan int {
sum := 0
tot := make(chan int)
go func() {
for i := 1; i < cnt; i++ {
sum += i
}
tot <- sum
}()
return tot
}
func main() {
//채널(Channel)
//채널 또한 함수의 반환 값으로 사용 가능
//예제1
c := sum(100)
fmt.Println("ex1 : ", <-c)
}
package main
import "fmt"
func receiveOnly(cnt int) <-chan int {
sum := 0
tot := make(chan int)
go func() {
for i := 1; i <= cnt; i++ {
sum += i
}
tot <- sum
tot <- 777
tot <- 777
close(tot)
}()
return tot
}
func total(c <-chan int) <-chan int {
tot := make(chan int)
go func() {
a := 0
for i := range c {
a = a + i
}
tot <- a
}()
return tot
}
func main() {
//채널(Channel)
//예제1
c := receiveOnly(100) //채널 반환
output := total(c) //채널 전달 후 반환
//output <- 777 //예외
fmt.Println("ex1 : ", <-output)
}
package main
import "fmt"
import "time"
func main() {
//채널(Channel) 셀렉트 구문
//채널 Select 구문 -> 채널에 값이 수신되면 해당 case 문 실행
//일회성 구문이므로, For(반복문)안에서 수행
//default 구문 처리 주의
//예제1
ch1 := make(chan int)
ch2 := make(chan string)
go func() {
for {
ch1 <- 77
time.Sleep(250 * time.Millisecond)
}
}()
go func() {
for {
ch2 <- "Golang Hi!"
time.Sleep(500 * time.Millisecond)
}
}()
go func() {
for {
select {
case num := <-ch1:
fmt.Println("ch1 : ", num)
case str := <-ch2:
fmt.Println("ch2 : ", str)
//default:
//fmt.Println("default test")
}
}
}()
time.Sleep(7 * time.Second)
}
package main
import "fmt"
import "time"
func main() {
//채널(Channel)
//예제1
ch1 := make(chan int)
ch2 := make(chan string)
go func() {
for {
num := <-ch1 //값 수신
fmt.Println("ch1 : ", num)
time.Sleep(250 * time.Millisecond)
}
}()
go func() {
for {
ch2 <- "Golang Hi!" //값 발신
time.Sleep(500 * time.Millisecond)
}
}()
go func() {
for {
select {
case ch1 <- 777: //발신용도
case str := <-ch2:
fmt.Println("ch2 : ", str)
}
}
}()
time.Sleep(7 * time.Second)
}