Go 并行功能

goroutine是一个轻量级的线程。

  1. package main
  2. import "fmt"
  3. func f(from string) {
  4. for i := 0; i < 3; i++ {
  5. fmt.Println(from, ":", i)
  6. }
  7. }
  8. func main() {
  9. // 假设我们有一个函数叫做f(s)
  10. // 这里我们使用通常的同步调用来调用函数
  11. f("direct")
  12. // 为了能够让这个函数以协程(goroutine)方式
  13. // 运行使用go f(s)
  14. // 这个协程将和调用它的协程并行执行
  15. go f("goroutine")
  16. // 你也可以为匿名函数开启一个协程运行
  17. go func(msg string) {
  18. fmt.Println(msg)
  19. }("going")
  20. // 上面的协程在调用之后就异步执行了,所以程序不用等待它们执行完成
  21. // 就跳到这里来了,下面的Scanln用来从命令行获取一个输入,然后才
  22. // 让main函数结束
  23. // 如果没有下面的Scanln语句,程序到这里会直接退出,而上面的协程还
  24. // 没有来得及执行完,你将无法看到上面两个协程运行的结果
  25. var input string
  26. fmt.Scanln(&input)
  27. fmt.Println("done")
  28. }

运行结果

  1. direct : 0
  2. direct : 1
  3. direct : 2
  4. goroutine : 0
  5. goroutine : 1
  6. goroutine : 2
  7. going
  8. ok
  9. done