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)