例:统计~20000哪些是素数?

  1. 现有的知识点:for循环遍历判断 ```go package main

import “fmt”

// 求1~200000的素数

func main() { var lists []int for n:=1; n<=40000; n++{ for m:=2;m<n; m++ { if n % m != 0 { if n - m == 1 { lists = append(lists, n) } continue } break } } fmt.Println(lists) }

  1. 并发和并行
  2. 1. 多线程程序在单核上运行,就是并发
  3. - 多个任务作用在一个cpu
  4. - 从微观的角度看,在一个时间点上,其实只有一个任务在执行
  5. 2. 多线程程序在多核上运行,就是并行
  6. - 多个任务作用在多个cpu
  7. - 从微观的角度看,在一个时间点上,就是多个任务在同时执行。
  8. <a name="hGEFE"></a>
  9. # goroutine基本介绍
  10. <a name="7xeLf"></a>
  11. ## go协程和go主线程
  12. 1. go主线程(有程序员直接成为线程,也可以理解成进程);一个go线程上,也可以起多个协程,你也可以这样理解,协程是轻量级线程。
  13. 1. Go协程的特点
  14. - 有独立的栈空间
  15. - 共享程序堆空间
  16. - 调度由用户控制
  17. - 协程是轻量级线程
  18. <a name="HRgax"></a>
  19. # goroutine的调度模型
  20. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/425259/1637676343925-bc96a60b-36b6-4e5f-9baf-ae70a81d9d60.png#align=left&display=inline&height=440&margin=%5Bobject%20Object%5D&name=image.png&originHeight=440&originWidth=694&size=173701&status=done&style=none&width=694)
  21. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/425259/1637676666758-626bb4bc-848c-48cd-827d-3ac97797d36d.png#align=left&display=inline&height=560&margin=%5Bobject%20Object%5D&name=image.png&originHeight=560&originWidth=1048&size=428394&status=done&style=none&width=1048)
  22. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/425259/1637677310834-add1da45-19c0-4ea6-a146-a90a6d8acdd7.png#align=left&display=inline&height=690&margin=%5Bobject%20Object%5D&name=image.png&originHeight=690&originWidth=1435&size=665854&status=done&style=none&width=1435)
  23. <a name="7O3PT"></a>
  24. # 设置Golang运行的CPU数
  25. 1. go1.8之后,默认让程序运行在多个核上,可以不用设置
  26. 1. go1.8之前,需要自己设置
  27. ```go
  28. package main
  29. import (
  30. "fmt"
  31. "runtime"
  32. )
  33. func main() {
  34. cpuNu := runtime.NumCPU() // 获取电脑的cpu数量
  35. fmt.Println(cpuNu)
  36. // 可以自己设置使用多个cpu
  37. runtime.GOMAXPROCS(cpuNu-1)
  38. }

channel

  1. 只写管道

image.png

  1. 只写管道

image.png

  1. 入参设置只读

入参 channame <- chan string
image.png

  1. 函数传参只写

channame chan <- string
image.png
代码

  1. package main
  2. func readChan(genChan <- chan string) {
  3. <- genChan
  4. genChan <- "c"
  5. }
  6. func writeChan(genChan chan <- string) {
  7. genChan <- "ccc"
  8. <- genChan
  9. }
  10. func main() {
  11. // 传参只读
  12. generalChan := make(chan string, 2)
  13. generalChan <- "a"
  14. readChan(generalChan)
  15. // 传参只写
  16. writeChan(generalChan)
  17. }

select 遍历channel

  • 在不确定是否能关闭管道的时候,使用select ```go package main

import “fmt”

func main() { numChan := make(chan int, 10) for i:=1 ;i<=10; i++{ numChan <- i }

  1. for true {
  2. select {
  3. case v:= <- numChan:
  4. fmt.Printf("get number %d\n" ,v)
  5. default:
  6. fmt.Println("get over")
  7. return
  8. }
  9. }

} ```