channel 通道错误的使用例子
1.向已经关闭的通道发送值,引起panic错误
package main import "fmt" func recv(c chan int) { ret := <-c fmt.Println("接收成功", ret) } func main() { ch := make(chan int) go recv(ch) // 启用goroutine从通道接收值 ch <- 10 close(ch) ch <- 9 fmt.Println("发送成功") }
2.首先向通道发送值,然后在启动接受通道值的协程,引起deadlock错误
package main import "fmt" func recv(c chan int) { ret := <-c fmt.Println("接收成功", ret) } func main() { ch := make(chan int) ch <- 10 go recv(ch) // 启用goroutine从通道接收值 fmt.Println("发送成功") }
3.向没有接受者的无缓存的通道发送值,引起deadlock错误
package main import "fmt" func main() { ch := make(chan int) ch <- 10 fmt.Println("发送成功") }
4.关闭已经关闭的通道,引起panic错误
package main import "fmt" func recv(c chan int) { ret := <-c fmt.Println("接收成功", ret) } func main() { ch := make(chan int) go recv(ch) // 启用goroutine从通道接收值 ch <- 10 close(ch) close(ch) fmt.Println("发送成功") }
5.从未关闭的通道取值,引起deadlock错误
package main import ( "fmt" "sync" ) func main() { ch := make(chan int, 10) for i := 1; i <= 10; i++ { ch <- i } // 遍历时,如果channel没有关闭,则会出现deadlock错误 //close(ch) // 注释掉,不关闭 // channel遍历 fmt.Println("start...") wg := &sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() for v := range ch { fmt.Println("v: ", v) // 输出1、2后就会阻塞 } }() wg.Wait() fmt.Println("end...") }
posted on 2023-10-10 10:26 running-fly 阅读(24) 评论(0) 编辑 收藏 举报