DEV Community

Yan.ts
Yan.ts

Posted on

4 1

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

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay