-
首先观察以下代码,判断输出内容或是否报错:
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 发布