(18条消息) Go语言自学系列 | golang并发编程之协程_COCOgsta的博客-CSDN博客_golang 协程 并发



Go语言自学系列 | golang并发编程之协程

COCOgsta 已于 2022-04-09 21:01:57 修改 400 收藏
分类专栏: 视频学习笔记 文章标签: golang go

视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:​​​​​​​Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客


Golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了Goroutines作为并发处理操作的一种方式。

创建一个协程非常简单,就是在一个任务函数前面添加一个go关键字:

Go task()

实例1

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "time"
  6. 6
    )
  7. 7
  8. 8
    func show(msg string) {
  9. 9
    for i := 1; i < 5; i++ {
  10. 10
    fmt.Printf("msg: %v\n", msg)
  11. 11
    time.Sleep(time.Millisecond * 100)
  12. 12
    }
  13. 13
    }
  14. 14
  15. 15
    func main() {
  16. 16
    go show("java")
  17. 17
    show("golang") // 在main协程中执行,如果它前面也添加go,程序没有输出
  18. 18
    fmt.Println("end...") // 主函数退出,程序就结束了
  19. 19
    }
  20. 20

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    msg: golang
  3. 3
    msg: java
  4. 4
    msg: golang
  5. 5
    msg: java
  6. 6
    msg: java
  7. 7
    msg: golang
  8. 8
    msg: golang
  9. 9
    msg: java
  10. 10
    end...

查看go关键去掉的运行结果

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "time"
  6. 6
    )
  7. 7
  8. 8
    func show(msg string) {
  9. 9
    for i := 1; i < 5; i++ {
  10. 10
    fmt.Printf("msg: %v\n", msg)
  11. 11
    time.Sleep(time.Millisecond * 100)
  12. 12
    }
  13. 13
    }
  14. 14
  15. 15
    func main() {
  16. 16
    show("java")
  17. 17
    show("golang") // 在main协程中执行,如果它前面也添加go,程序没有输出
  18. 18
    fmt.Println("end...") // 主函数退出,程序就结束了
  19. 19
    }
  20. 20

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\tempCodeRunnerFile.go"
  2. 2
    msg: java
  3. 3
    msg: java
  4. 4
    msg: java
  5. 5
    msg: java
  6. 6
    msg: golang
  7. 7
    msg: golang
  8. 8
    msg: golang
  9. 9
    msg: golang
  10. 10
    end...

实例2

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "io/ioutil"
  6. 6
    "log"
  7. 7
    "net/http"
  8. 8
    "time"
  9. 9
    )
  10. 10
  11. 11
    func responseSize(url string) {
  12. 12
    fmt.Println("Step1: ", url)
  13. 13
    response, err := http.Get(url)
  14. 14
    if err != nil {
  15. 15
    log.Fatal(err)
  16. 16
    }
  17. 17
  18. 18
    fmt.Println("Step2: ", url)
  19. 19
    defer response.Body.Close()
  20. 20
  21. 21
    fmt.Println("Step3: ", url)
  22. 22
    body, err := ioutil.ReadAll(response.Body)
  23. 23
    if err != nil {
  24. 24
    log.Fatal(err)
  25. 25
    }
  26. 26
    fmt.Println("Step4: ", len(body))
  27. 27
    }
  28. 28
  29. 29
    func main() {
  30. 30
    go responseSize("https://www.duoke360.com")
  31. 31
    go responseSize("https://baidu.com")
  32. 32
    go responseSize("https://jd.com")
  33. 33
    time.Sleep(10 * time.Second)
  34. 34
    }
  35. 35

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    Step1: https://jd.com
  3. 3
    Step1: https://baidu.com
  4. 4
    Step1: https://www.duoke360.com
  5. 5
    Step2: https://jd.com
  6. 6
    Step3: https://jd.com
  7. 7
    Step2: https://baidu.com
  8. 8
    Step3: https://baidu.com
  9. 9
    Step4: 343987
  10. 10
    Step4: 141131
  11. 11
    Step2: https://www.duoke360.com
  12. 12
    Step3: https://www.duoke360.com
  13. 13
    Step4: 32281


yg9538 2022年7月22日 22:48 266 收藏文档