Goroutines

Goroutines #

// Uma _goroutine_ é uma leve _thread_ de execução.

package main

import (
	"fmt"
	"time"
)

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

func main() {

	// Supondo que se pretenda chamar a função `f(s)`.
	// Aqui está como seria feito para rodar a função
	// sincronamente.
	f("direct")

	// Para invocar esta função de maneira assíncrona,
	// em uma goroutine, usa-se `go f(s)`. Esta Goroutine
	// irá executar de maneira concorrente.
	go f("goroutine")

	// Também é possível iniciar uma goroutine a partir
	// de uma chamada de função anônima.
	go func(msg string) {
		fmt.Println(msg)
	}("going")

	// As duas chamadas de funções estão rodando assincronamente em
	// goroutines separadas. Para uma apresentação mais detalhada,
	// veja [WaitGroups](waitgroups).
	time.Sleep(time.Second)
	fmt.Println("done")
}
# Ao rodar este programa, primeiro é visualizada a saída
# das chamadas bloqueantes, síncronas, e só então a saída 
# das duas goroutines. A saída de goroutines podem ser
# exibidas em ordem diversa da disposta no código,
# justamente porque goroutines são executadas 
# concorrentemente pelo runtime de Go.
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

# Em seguida veremos um complemento às goroutines
# em programas Go que utilizam concorrência: canais.