協程(goroutine) 是輕量級的執行線程,由關鍵字go
定義
一個例子
package main
import (
"fmt"
"time"
)
func f(from string) {
for i := 0; i < len(from); i++ {
fmt.Println(from, ":", string(from[i]), time.Now().Format("15:04:05.000"))
//time.Sleep(time.Second)
}
}
func f2(from string) {
for i := 0; i < len(from); i++ {
fmt.Println(from, ":", string(from[i]), time.Now().Format("15:04:05.000"))
time.Sleep(time.Second)
}
}
func main() {
//go f("direct")
f("ok")
go f2("inter")
go f2("hhh")
time.Sleep(5 * time.Second) //如果沒有這句話,go運行的兩個f2("inter")和f2("hhh")不會打印語句
}
特別注意:如果沒有time.Sleep(5 * time.Second),不會執行到f2函數,因爲主進程(main函數)已經執行完了
結果
從上圖可以看出
- 阻塞執行完
f("ok")
後,併發執行f2("inter")
和f2("hhh")
-
f2("inter")
和f2("hhh")
同時執行,順序打印字母
一點改動
如果把time.Sleep(5 * time.Second)
改成time.Sleep(3* time.Second)
,從下圖可以看出,“inter”只打印了前三個字母