-
首先观察以下代码,判断输出内容或是否报错:
package main import "fmt" func main() { var ch chan int var count int go func() { ch <- 1 }() go func() { count++ close(ch) }() <-ch fmt.Println(count) }该代码会报错,原因是 ch 没有初始化。报错如下:

-
修改代码,增加对 ch 初始化,判断此时代码的输出情况:
package main import "fmt" func main() { var ch chan int ch = make(chan int, 1) var count int go func() { ch <- 1 }() go func() { count++ close(ch) }() <-ch fmt.Println(count) }继续报错,提示
send on closed channel。意思是向以关闭的通道 channel 传值,报错如下:
-
继续修改代码,去掉
<- ch,判断输出是否报错。package main import "fmt" func main() { var ch chan int ch = make(chan int, 1) var count int go func() { ch <- 1 }() go func() { count++ close(ch) }() fmt.Println(count) }此时不报错,输出 0。因为主程序没有阻塞,协程和主程序的执行互不干扰。

-
继续修改代码,将已删除的
<- ch重新添加回来。删除第二个协程,判断此时的输出情况。package main import "fmt" func main() { var ch chan int ch = make(chan int, 1) var count int go func() { ch <- 1 }() <-ch fmt.Println(count) }此时正常输出 0。

-
继续修改代码,将第二个协程添加回来,删除第一个协程判断此时的输出情况。
package main import "fmt" func main() { var ch chan int ch = make(chan int, 1) var count int go func() { count++ close(ch) }() <-ch fmt.Println(count) }此时输出 1。

记录 go 协程和 channel 中有意思的一个问题
最新推荐文章于 2024-11-07 12:00:57 发布
本文通过一系列Go语言代码示例,探讨了并发编程中常见的错误,包括未初始化的通道使用、向已关闭通道发送数据的问题,以及如何正确处理协程和通道以避免运行时错误。
445

被折叠的 条评论
为什么被折叠?



