관리 메뉴

bright jazz music

Go - channel 2 (for loop 사용) 본문

Language/Go

Go - channel 2 (for loop 사용)

bright jazz music 2021. 2. 20. 19:36
package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan string)

	people := [2]string{"hojun", "oceanus"}
	for _, person := range people {
		go isSexy(person, c)
	}
	fmt.Println("Waiting for message")
	resultOne := <-c
	resultTwo := <-c
	//resultThree := <-c //데드락 에러

	fmt.Println("Received this message:", resultOne) //메시지 하나를 resultOne에 받고
	fmt.Println("Received this message:", resultTwo) //그 다음에 받는 게 무엇이든간에 resultTwo에 받는다.

}

func isSexy(person string, c chan string) {
	time.Sleep(time.Second * 10)
	c <- person + " is sexy"
}

//만약 고루틴 2개가 돌아가고 끝났다면 그 이상의 메시지를 받기 위해
//기다릴 수 없다. 만약 resultThree := <-c를 만든다면
//데드락 오류가 발생할 것이다. 남아 있는 고루틴이 없는데 메시지를 하염없이
//기다린다면 프로그램은 끝나지 않고 오류도 모를 것이기 때문이다.
//그렇다면 배열이 늘어날 때마다 <-c을 써줘야 하는 걸까? 원래는 그렇다.
//그러나 for loop 을 사용하면 된다.

 

 

 

 

for loop 사용하기

 

 

 

 

 

 

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan string) //채널을 통해 string 타입의 메시지를 주고 받을 것이다

	people := [5]string{"hojun", "oceanus", "dal", "japanguy", "larry"}
	for _, person := range people {
		go isSexy(person, c)
	}
	fmt.Println("Waiting for message")
	for i := 0; i < len(people); i++ {
		fmt.Println(<-c)
        //<-c는 채널로부터 메시지를 받는다는 의미를 가지며, blocking operation이다.
        
	}

}

func isSexy(person string, c chan string) {
	time.Sleep(time.Second * 10)
	c <- person + " is sexy" //person 역시 string type이다.
}

===

Waiting for message
larry is sexy
oceanus is sexy 
japanguy is sexy
dal is sexy     
hojun is sexy  

//완료된 순서가 배열의 순서와 다르다. 동시에 진행됐다는 의미이다.​

 

Comments