Um gourotine pode ser entendida como uma rotina ou função executada em uma thread. Podemos
executar N goroutines de forma assíncrona com uso da palavra reservada go.
Sintaxe 1: função
go nome_funcao(parametros)
Sintaxe 2: função anônima
go func(parametros){
//corpo
}(parametros)
No exemplo abaixo, temos uma função, goroutine anônima e uma goroutine sendo invocadas
nesta ordem. A saída desse exemplo pode variar.
Exemplo 1
package main
import (
"fmt"
"time"
)
func imprimir(str string) {
for idx := 0; idx < 5; idx++ {
fmt.Printf("%s: %d\n", str, idx)
//time.Sleep(time.Second)
}
}
func main() {
go func(str string) {
for idx := 0; idx < 5; idx++ {
fmt.Printf("%s: %d\n", str, idx)
}
}("go")
go imprimir("routines")
imprimir("lang")
time.Sleep(time.Second)
fmt.Println("ok")
}
Saída
lang: 0
lang: 1
lang: 2
lang: 3
lang: 4
go: 0
routines: 0
routines: 1
routines: 2
routines: 3
routines: 4
go: 1
go: 2
go: 3
go: 4
ok
Como pode ser observado na saída do exemplo acima, a função imprimir invocada após a função
anônima é executada primeiro, seguida da goroutine anônima que é interrompida após a impressão
do índice 0 para a execução da goroutine imprimir, que após seu término, a goroutine anônima
tem sua execução concluída.