最近刚入门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
*/
有疑问加站长微信联系(非本文作者)

主线程挂了之后,程序会直接退出,你启动的两个协程还没来得及运行,程序已经退出了。在最后面加个sleep 或者用sync.WaitGroup
非缓冲通道,还加锁保证通道占用,先不谈运行结果
感谢~
谢谢指正!
你没理解我的意思,这个锁可以加但没必要,你始终只有一个协程在写
改成这样,你才能让他阻塞,2个协程去抢同一把锁才会阻塞,你只有一个协程拿锁,不会阻塞的。
这样你程序就只会打印
然后5秒自己退出
是的。 您的意思是锁是解决多个进程之间对同一个资源写和写的冲突。 我这里本来想着是 用锁实现一批数据的先写后读 但是没有考虑到缓冲的问题,在您提醒以后,我突然意识到了这一点。 但是我试着运行了一下又发现可以运行, 按道理,如果加了锁,我还往无缓冲chan里一直写,岂不是会造成 “ 写端的阻塞”
膜拜膜拜! 确实如您所说一样,而且如果把无缓冲chan改成缓冲chan就能达到想要的效果!感谢您!
无缓冲其实就是阻塞通道。假如你往里写入1而不读取,就会一直阻塞,只有你读取了1,才能继续写入2,所以锁根本没有起作用
channel 自身会有锁机制,不用额外加锁
@1034992601 谢谢老哥!