协程(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”只打印了前三个字母

网友评论