저번시간에 배웠듯 Go는 너무나 똑똑해서 여러가지의 일을 동시에 진행할 수 있습니다.

 

아래 예시 코드입니다.

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan bool) //채널을 만드는데 리턴받을 값 타입을 정해줘야 한다.

	people := [2]string{"nico", "hyunwoo"}
	for _, person := range people {
		//여기서 isSexy 함수는 bool을 return하는데, 이걸
		//result := go isSexy(person) 형태로 받을 수 없다. 고루틴에서는 Channel을 사용해야 한다.
		go isSexy(person, c)

	}
	//채널에서 값이 올때까지 메인에서 기다리기 때문에 따로 해주는게 없어도 프로그램이 끝나지않고 기다린다.
	fmt.Println(<-c)
}

//채널을 파라미터로 받는다 chan (타입)
func isSexy(person string, c chan bool) {
	time.Sleep(time.Second * 5)
	//return true 이 방법으론 고루틴이 끝날 때 데이터를 보낼 수 없으므로, 밑의 채널방법을 쓴다.
	c <- true
}

 

 

또한 너무도 똑똑해서 채널을 여러개 받도록 해놓아도, 정해진 갯수 만큼의 채널을 받으면 프로그램을 종료시켜 버립니다.

 

여기서 채널이란?

고루틴은 일반 함수같이 return값을 정의한다고 리턴을 평범하게 받을 수 있는게 아니라

채널이라는 새로운 고 타입의 변수를 만들어주어야 받을 수 있습니다.

 

또한 이전시간에 고루틴을 실행하려면 메인펑션에서 하나의 함수나 기능은 돌고있어야 실행이 된다고 말씀 드렸는데요, 채널을 이용하면 돌고있을 필요없이 프로그램에서 펑션을 실행할때 채널을 리턴하도록 되어있다면, 프로그램이 돌 수 있게 됩니다.

 

그럼 여러개의 고루틴이 차례로 도는데 이 아이들은 알아서 따로 알고 지들 멋대로 잘 하나요? 하는

궁금증이 생겨서 똑같은 루틴을 두번 실행하고 채널을 출력 해봤습니다.

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan string) //채널을 만드는데 리턴받을 값 타입을 정해줘야 한다.

	people := [2]string{"nico", "hyunwoo"}
	for _, person := range people {
		//여기서 isSexy 함수는 bool을 return하는데, 이걸
		//result := go isSexy(person) 형태로 받을 수 없다. 고루틴에서는 Channel을 사용해야 한다.
		go isSexy(person, c)

	}
	//채널에서 값이 올때까지 메인에서 기다리기 때문에 따로 해주는게 없어도 프로그램이 끝나지않고 기다린다.
	fmt.Println("first msg", <-c)
	fmt.Println("second msg", <-c)

	for _, person := range people {
		//여기서 isSexy 함수는 bool을 return하는데, 이걸
		//result := go isSexy(person) 형태로 받을 수 없다. 고루틴에서는 Channel을 사용해야 한다.
		go isSexy(person, c)

	}

	fmt.Println("third msg", <-c)
	fmt.Println("forth msg", <-c)
}

//채널을 파라미터로 받는다 chan (타입)
func isSexy(person string, c chan string) {
	time.Sleep(time.Second * 5)
	//return true 이 방법으론 고루틴이 끝날 때 데이터를 보낼 수 없으므로, 밑의 채널방법을 쓴다.
	c <- person + " is sexy"
}

 

역시나 알아서 잘 되더군요..

똑똑해 고!

+ Recent posts