概念簡介
Go語言的協程(goroutine)從執行上來說是輕量級的線程。
例程代碼
package main
import "fmt"
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
// 假設我們有一個函數叫做 `f(s)`。一般會這樣同步(synchronously)調用
f("direct")
// 使用 `go f(s)` 在一個 Go 協程中調用這個函數。
// 這個新的 Go 協程將會並發(concurrently)執行這個函數。
go f("goroutine")
// 你也可以為匿名函數啟動一個 Go 協程。
go func(msg string) {
fmt.Println(msg)
}("going")
// 現在這兩個 Go 協程在獨立的 Go 協程中異步(asynchronously)運行,所以
// 程序直接運行到這一行。這裏的 `Scanln` 代碼需要我們
// 在程序退出前按下任意鍵結束。
fmt.Scanln()
fmt.Println("done")
}
執行&輸出
# 當我們運行這個程序時,將首先看到阻塞式調用的輸出,然後是
# 兩個 Go 協程的交替輸出。這種交替的情況表示 Go 運行時是以
# 並發的方式運行協程的。
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done
接下來我們將學習在並發的 Go 程序中的 Go 協程的輔助特性:通道(channels)。
課程導航
學習上一篇:Go語言教程:錯誤處理 學習下一篇:Go語言教程:通道
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/goroutines