(Go : basic) 22. 채널 - 2

Posted by : at

Category : Go


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)
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links