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) }
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) }
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) }
Top comments (0)