channel定义

make(chan Type) //等价于make(chan Type, 0),无缓冲channel
make(chan Type, capacity) //capacity,缓冲值

channel使用

channel <- value //传递值给channel
<-channel //接收channel值,并丢弃
x := <-channel //接收搜channel值
x,ok := <-channel //接收channel值,同时检查channel是否结束或为空

无缓冲channel

image.png

有缓冲channel

image.png

关闭channel

image.png

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. channel := make(chan int, 2)
  7. //创建一个goroutine
  8. go func() {
  9. defer fmt.Println("goroutine 结束")
  10. for i := 0; i < 4; i++ {
  11. channel <- i
  12. fmt.Println("goroutine 开始存值", i)
  13. }
  14. close(channel)
  15. }()
  16. for {
  17. //同上功能,但会检查返回的channel值是否为空或传递是否结束
  18. if v, ok := <-channel; ok {
  19. fmt.Println("接收完成", v)
  20. }else{
  21. break
  22. }
  23. }
  24. fmt.Println("main结束")
  25. }

channel与range

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. channel := make(chan int, 2)
  7. //创建一个goroutine
  8. go func() {
  9. defer fmt.Println("goroutine 结束")
  10. for i := 0; i < 4; i++ {
  11. channel <- i
  12. fmt.Println("goroutine 开始存值", i)
  13. }
  14. close(channel)
  15. }()
  16. for v := range channel {
  17. fmt.Println("接收完成", v)
  18. }
  19. fmt.Println("main结束")
  20. }

channel与select

单流程在channel只能监听一个channel状态,select可以监听多个channel状态,如果多个case同时满足会随机选择一个执行,当select无case时会阻塞

  1. package main
  2. import "fmt"
  3. func test(channel1, channel2 chan int) {
  4. x, y := 1, 1
  5. for {
  6. select {
  7. case channel1 <- x:
  8. x = y
  9. y = x + y
  10. case <-channel2:
  11. fmt.Println("quit")
  12. return
  13. }
  14. }
  15. }
  16. func main() {
  17. channel1 := make(chan int)
  18. channel2 := make(chan int)
  19. go func() {
  20. for i := 0; i < 10; i++ {
  21. fmt.Println(<-channel1)
  22. }
  23. channel2 <- 0
  24. }()
  25. test(channel1,channel2)
  26. }

实现work_pool

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func work(i int, jobs <-chan int, results chan<- int) {
  7. for job := range jobs {
  8. fmt.Println("work", i, "start")
  9. results <- job * 2
  10. fmt.Println("work", i, "end")
  11. time.Sleep(1*time.Second)
  12. }
  13. }
  14. func main() {
  15. jobs := make(chan int, 10)
  16. results := make(chan int, 10)
  17. for i := 0; i < 3; i++ {
  18. go work(i, jobs, results)
  19. }
  20. for i := 0; i < 5; i++ {
  21. jobs <- i
  22. }
  23. for i := 0; i < 5; i++ {
  24. <-results
  25. }
  26. }