Una goroutine è di fatto un green thread che permette di rendere concorrente l’esecuzione del nostro programma. |
|
package main
|
|
import "fmt"
|
|
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
|
|
func main() {
|
|
Supponiamo di avere una chiamata di funzione |
f("direct")
|
Per invocare questa funzione in una goroutine, utilizza
|
go f("goroutine")
|
È possibile far partire una goroutine anche con una funzione anonima. |
go func(msg string) {
fmt.Println(msg)
}("going")
|
Le nostre due chiamte di funzione stanno eseguendo in modo asincrono,
su due goroutine separate. La funzione |
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
|
Quando si esegue questo programma si può notare prima l’output delle chiamate bloccanti. Successivamente si nota come le due goroutine lanciate producano dell’output “disordinato”. Questo disordine riflette l’esecuzione concorrente delle goroutine da parte del runtime di Go. |
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
<enter>
done
|
Adesso siamo pronti per analizzare la struttura complementare alle goroutine in Go: i channel. |
Prossimo esempio: Channel.