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)