Go por Exemplo: Goroutines

Uma goroutine é uma thread leve de execução.

package main
import "fmt"
func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}
func main() {

Suponha que temos uma função de chamada f(s). Aqui está como nós chamamos ela da maneira usual, executando sincronicamente.

    f("direto")

Para chamar essa função em uma goroutine, use go f(s). Essa nova goroutine executará simultaneamente com a que foi chamada.

    go f("goroutine")

Você pode também iniciar uma goroutine para uma função de chamada anônima.

    go func(msg string) {
        fmt.Println(msg)
    }("indo")

Nossas duas goroutines são executadas de forma assíncrona em goroutines separadas agora, assim a goroutine cai até aqui. Esse código Scanln exige que pressionamos uma tecla antes de sair do programa.

    var input string
    fmt.Scanln(&input)
    fmt.Println("pronto")
}

Quando executarmos esse programa, nós vemos primeiramente a saída da chamada bloqueada, então a saída intercalada das duas goroutines. Essa intercalação reflete a execução simultânea das goroutines pelo tempo de execução do Go.

$ go run goroutines.go
direto : 0
direto : 1
direto : 2
goroutine : 0
indo
goroutine : 1
goroutine : 2
<enter>
pronto

A seguir, veremos os complementos das goroutines nos programas simultâneos do Go: canais.

Próximo exemplo: Canais.