20.channel有缓冲和无缓冲同步问题
1.有缓冲
示例代码
package chapter15
import (
"fmt"
"time"
)
func RunChannel02() {
c := make(chan int, 3) // 带有缓冲的channel
fmt.Println("len(c) = ", len(c), ", cap(c) = ", cap(c))
go func() {
defer fmt.Println("子go程结束")
for i := 0; i < 4; i++ {
c <- i
fmt.Println("子go程正在运行,发送的元素=", i, "len(c) = ", len(c), ", cap(c) = ", cap(c))
}
}()
time.Sleep(2 * time.Second)
for i := 0; i < 4; i++ {
num := <-c //从c中接收数据,并赋值给num
fmt.Println("num = ", num)
}
fmt.Println("main 结束")
}
// 执行结果
len(c) = 0 , cap(c) = 3
子go程正在运行,发送的元素= 0 len(c) = 0 , cap(c) = 3
子go程正在运行,发送的元素= 1 len(c) = 1 , cap(c) = 3
子go程正在运行,发送的元素= 2 len(c) = 2 , cap(c) = 3
子go程正在运行,发送的元素= 3 len(c) = 3 , cap(c) = 3
子go程结束
num = 0
num = 1
num = 2
num = 3
main 结束
可能出现的执行结果现象

2.总结


浙公网安备 33010602011771号