DEV Community

Yan.ts
Yan.ts

Posted on

Channels no go

Channel no Go é uma forma de declarar um canal de comunicação entre os projetos que estão rodando

para declarar um channel podemos usar apenas o msg := make(chan string) e para passar mensagens para ele podemos utilizar o operador <-, então por exemplo msg <- "olá" passa o valor "olá" para o channel msg e para tirar esse valor do channel tambem usamos o mesmo operador então vai ficar por exemplo result := <-msg

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

    go func() {
        msg <- "Hello World"
    }()

    result := <-msg
    fmt.Println(result)
}
Enter fullscreen mode Exit fullscreen mode

Essa função main quando executada vai escrever no console "Hello World"

ps: o channel só pode receber um novo valor depois de ser "esvaziado", para esvaziar um channel é como faço ao atribuir o valor dele para result

Comunicando entre routines

Como eu havia dito antes o channel é uma forma de termos comunicação entre go routines. Uma forma de demonstrar isso é a seguinte

func main() {
    channel := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            channel <- i
        }
    }()

    go func() {
        for {
            fmt.Println(<-channel)
        }
    }()
    time.Sleep(time.Second)
}
Enter fullscreen mode Exit fullscreen mode

Nesse caso além de estarmos passando o valor de uma função para a outra sem gerar race conditions, ainda temos uma dependência entre as funções pois a primeira função só pode continuar atribuindo valor para o channel quando ele for esvaziado enquanto que a segunda função é responsável por esvaziar ele.

É como se fosse uma corrida de revezamento, onde um depende do outro, no caso na corrida o corredor precisa que o seu parceiro chegue até ele, já no channel a primeira função precisa que o channel seja esvaziado

ps: é importante lembrar de usar o close(channel) depois de terminar de usar o channel

Deadlock

O deadlock acontece quando criamos um channel e atribuimos um valor a ele sem que o channel rode dentro de uma go routine

func main() {
    channel := make(chan int)
    // channel <- 10 DEADLOCK !!
    go func() {
        channel <- 10
    }()
    fmt.Println(<-channel)
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)