kok202
[2019.03.08] Go lang (Channel, Close)

2019. 3. 8. 19:32[공부] 영상/GoLanguage

Channel


package main

import "fmt"

func foo(channelBufer chan int, num int) {
    channelBuffer <- num * 10
}

func main() {
    const loopNum = 5
    const bufferSize = 20

    fooChannelBuffer := make(chan int, bufferSize)
    for i := 0; i < loopNum; i++ {
        go foo(fooChannelBuffer, i)
    }

    var numByChannelArr [loopNum]int
    for i := 0; i < loopNum; i++ {
        numByChannelArr[i] = <-fooChannelBuffer
    }

    for i := 0; i < loopNum; i++ {
        fmt.Println(numByChannelArr[i])
    }
}


40
20
30
0
10


fooChannelBuffer 는 foo channel의 결과가 담길 Queue형 Buffer 다.

fooChannelBuffer := make(chan int, 5) 는 버퍼 사이즈는 5, int 데이터를 나르는 채널 버퍼를 만들겠다는 의미다.

channelBuffer <- 데이터 는 데이터를 channel Buffer 에 넣는 행위를 의미한다

데이터 <- channelBuffer 는 channel Buffer에서 데이터를 빼는 행위를 의미한다.






채널을 이용한 메세지 통신


package main

import "fmt"
import "time"


const loopNum
= 5

const bufferSize = 20

func messageProducer(messageChannelBuffer chan string, message string) {
    for i := 0; i < loopNum; i++ {
        messageChannelBuffer <- message
        time.Sleep(time.Millisecond * 100)
    }
}

func messageConsumer(messageChannelBuffer chan string) {
    for i := 0; i < loopNum; i++ {
        messageFromChannel := <- messageChannelBuffer
        fmt.Println(messageFromChannel)
    }
}

func main() {
    messageChannelBuffer := make(chan string, bufferSize)
    go messageProducer(messageChannelBuffer, "Hello")
    messageConsumer(messageChannelBuffer)
}

Consumer 는 channel에 데이터가 들어올 때 까지 기다린다.






Close

채널을 닫기 위한 키워드

채널이 동작중인데 close 해버리면 에러가 발생한다.

채널이 마무리 된 다음에 호출해야한다. (= 채널의 종료를 모두 기다려야한다 = sync를 맞춰야한다.)

그래서 보통 waitGroupt과 같이 사용함

package main

import "fmt"
import "sync"

var waitGroup sync.WaitGroup

func foo(numByChannel chan int, num int) {
    defer waitGroup.Done()
    numByChannel <- num * 10
}

func main() {
    const loopNum = 5
    const bufferSize = 20

    fooChannelBuffer := make(chan int, bufferSize)
    for i := 0; i < loopNum; i++ {
        waitGroup.Add(1)
        go foo(fooChannelBuffer, i)
    }

    waitGroup.Wait()
    close(fooChannelBuffer)

    for result := range fooChannelBuffer {
        fmt.Println(result)
    }
}


40
0
10
20
30