协程的基本创建和使用

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. "runtime"
  7. "time"
  8. )
  9. func main() {
  10. log.SetOutput(io.MultiWriter(os.Stdout))
  11. log.SetFlags(log.Lshortfile)
  12. log.Println("main 函数1")
  13. // 使用 go 关键字开启一个协程
  14. go func() {
  15. defer log.Println("A.defer")
  16. log.Println("匿名协程函数开始...")
  17. func() {
  18. defer log.Println("B.defer")
  19. log.Println("协程中的匿名函数, 这里主要演示的是,在协程中退出当前协程")
  20. log.Println("3秒后退出协程")
  21. time.Sleep(3 * time.Second)
  22. runtime.Goexit()
  23. }()
  24. }()
  25. log.Println("main 函数2")
  26. // 使用一个死循环阻塞主线程, 确保程序不会退出
  27. for {
  28. time.Sleep(1 * time.Second)
  29. }
  30. }

输出

  1. main.go:16: main 函数1
  2. main.go:34: main 函数2
  3. main.go:21: 匿名协程函数开始...
  4. main.go:25: 协程中的匿名函数, 这里主要演示的是,在协程中退出当前协程
  5. main.go:26: 3秒后退出协程
  6. panic.go:522: B.defer
  7. panic.go:522: A.defer

协程中的数据通信 channel