最近刚入门golang 学到了channel 自己仿照模板在main函数里写了一个单向通道的小demo 但是跑不出想要的效果 想请教各位大佬 帮我看看是哪个地方出现了问题
代码如下
c := make(chan int)
go func(out chan<- int) {
fmt.Println("product func")
mutex.Lock() //加锁保证对通道的占用
for i:=0 ; i<= 5;i++{
out <- i
}
mutex.Unlock()
fmt.Println("product func end")
}(c)
go func(in <-chan int ) {
fmt.Println("consumer function")
for num := range in{
fmt.Println(num)
}
fmt.Println("consumer function end")
}(c) //把双向channel传入 单向channel作为参数的函数 中
运行结果啥也没有
--------------------------------分割线------------------------------------------
经过前两楼的大佬的指定 ,知道了之前的原因是main goroutine挂的太快 但是我结合3l大哥的回复想了一下,在自己的程序里 “无缓冲通道+锁” 按道理应该会造成 “写段阻塞”报错 但实际运行起来却没有问题,有老哥能帮忙分析一下是什么原因吗? 修改以后的代码
c := make(chan int)
go func(out chan<- int) {
fmt.Println("product func")
defer close(c)
mutex.Lock() //加锁保证对通道的占用
for i:=0 ; i<= 5;i++{
out <- i
}
mutex.Unlock()
fmt.Println("product func end")
}(c)
go func(in <-chan int ) {
fmt.Println("consumer function")
for num := range in{
fmt.Println(num)
}
fmt.Println("consumer function end")
}(c) //把双向channel传入 单向channel作为参数的函数 中
time.Sleep(5*time.Second)
/*
主线程挂了之后,程序会直接退出,你启动的两个协程还没来得及运行,程序已经退出了。在最后面加个sleep 或者用sync.WaitGroup
*/