package main
import (
"fmt"
"sync"
)
var wg = sync.WaitGroup{}
func main() {
c := make(chan int) //无缓冲
wg.Add(1)
go send(c)
for i := range c { //send()协程写完不close的话,当send()执行结束后,主协程会阻塞,至进程崩溃
fmt.Println(i)
}
//wg.Add(1)
//go recv(c)
wg.Wait()
}
//只能向chan里写数据
func send(c chan<- int) {
defer wg.Done()
for i := 0; i < 10; i++ {
c <- i
}
//close(c)
}
//只能取channel中的数据
func recv(c <-chan int) {
defer wg.Done()
for i := range c {
fmt.Println(i)
}
fmt.Println("out")
}
send()执行结束的话没有主动close, 主协程一直在读取c 中的数据,导致阻塞崩溃
package main
import (
"fmt"
"sync"
)
var wg = sync.WaitGroup{}
func main() {
c := make(chan int) //无缓冲
wg.Add(1)
go send(c)
//for i := range c { //send()协程写完不close的话,当send()执行结束后,主协程会阻塞,至进程崩溃
// fmt.Println(i)
//}
wg.Add(1)
go recv(c)
wg.Wait()
}
//只能向chan里写数据
func send(c chan<- int) {
defer wg.Done()
for i := 0; i < 10; i++ {
c <- i
}
//close(c)
}
//只能取channel中的数据
func recv(c <-chan int) {
defer wg.Done()
for i := range c {
fmt.Println(i)
}
fmt.Println("out")
}
同样会崩溃 ,recv()阻塞且没有释放条件 协程泄露,不执行wg.done(),导致主协程阻塞在wg.wait(),