go管道,在不同地方从空管道取值会有不一样的结果

1. 运行环境

go1.19

2. 问题描述?

初学者刚学习管道遇到的问题
下面是创建一个管道,在main函数中直接取值会报错

go管道,在不同地方从空管道取值会有不一样的结果
但是如果我把取值操作放到函数中,起一个协程执行的话就会阻塞等待,不报错

// read data
func readData(intChan chan int, isOver *bool) {
   for {
      v, ok := <-intChan
      if ok == false {
         break
      }
      fmt.Printf("readData %v\n", v)
   }
   *isOver = true
}

func main() {
    isOver := false
    go readData(intChan, &isOver)
}

不太理解为什么在协程下go不报错,在主线程go报错

最佳答案

file

1年前 评论
xiaodaji (楼主) 1年前
讨论数量: 7

file

1年前 评论
xiaodaji (楼主) 1年前

管道里面没数据就会产生堵塞

1年前 评论
xiaodaji (楼主) 1年前

程序检查发现会死锁,直接报错崩溃了

1年前 评论
xiaodaji (楼主) 1年前

新手加1 我也写了个channel 一起交流、同问为什么生产的时候要起一个协程写,不启动协程就会报错

是因为写入的时候必须有channel在读吗

package main

import (
    "fmt"
    "sync"
    "time"
)

func job(index int)int  {
    time.Sleep(time.Microsecond * 500)
    return index
}
// 优雅的关闭channel
func main()  {
    start := time.Now()
    num := 5
    c := make(chan int)
    var wg = sync.WaitGroup{}
    for i:=0;i<num;i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            c<-job(index)
        }(i)
    }

    // 等待上面的协程处理完毕、defer关闭channel
    go func() {
        defer close(c)
        wg.Wait()
    }()
    for item := range c {
        fmt.Println(item)
    }

    end := time.Since(start)
    fmt.Println(end.String())
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!