Golang! Canais assincronos e Go Routines! - Prática
Antes de irmos a prática de uma vez. Vou explicar resumidamente o que é um channel e como ele funciona com Golang.
Channels são uma forma de comunicação entre uma thread (Go routine) e outra, isto é, se você quer transitar valores e dados entre uma thread e outra, é essencial usar threads pois fornecem uma ótima semantica e entendimento para o código.
Vamos ao exemplo prático.
package main
import (
"fmt"
"time"
)
//criando uma função que recebe como parametro um channel de um inteiro
func routine(times chan int) {
for i := range times { //iterando no valor que times recebe
fmt.Printf("this function was executed %d times \n", i)
time.Sleep(1 * time.Milliseconds) //aguardando milesegundos para cada iteração
}
}
func main() {
times := make(chan int) //criando um tipo channel de um inteiro.
go routine(times) //para sinalizar ao compilador que queremos utilizar uma go routine, usamos go na frente da assinatura da função.
//criando um loop onde "times <- i" indica que a cada iteração, o valor de **i**
//é enviada para o canal times onde esta estabelecida no parametro da
//função routine que consome esses dados.
for i := 0; i < 10000; i++ {
times <- i
}
}
Bem simples né, esta é a forma com que a linguagem troca informações entre a thread principal e as Go routines, trouxe este exemplo simples para que consigam digerir tranquilamente a funcionalidade dos canais na teoria e na prática, no entanto, pretendo trazer mais conteúdos sobre quando devemos ou não utilizar go routines e channels, explicar sobre mutex (mutual exclusion), waitgroups e deadlocks. Se você gostou ou achou que faltou alguma coisa comente por favor! Isso me ajuda a melhorar e correr atras das correções. Obrigado pela atenção e até a próxima!