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...")
}