c:控制两个子协程的执行顺序
c2:控制子协程和main的执行顺序
var c2 chan int
func main() {
c:=make(chan int)
c2=make(chan int)
go p1(c,"hello worldasdasdsa12312sad",true)
go p1(c,"阿斯顿很好奇啊实打实阿萨的",false)
// time.Sleep(1000*time.Millisecond)
if <-c2==0{
fmt.Println("\nover")
}
}
func p1(c chan int,s string,b bool){
if b{
//读数据,读不到就会阻塞
<-c
}
for _,v:=range s{
fmt.Printf("%c",v)
time.Sleep(10*time.Millisecond)
}
//写数据
if !b{c<-5}
if b{c2<-0}
}
输出:
阿斯顿很好奇啊实打实阿萨的hello worldasdasdsa12312sad
over
func main() {
c:=make(chan int,3)
x:=5
go func(){
for i:=0; i<x; i++ {
c<-i
time.Sleep(10*time.Millisecond)
fmt.Println(len(c),cap(c))
}
}()
time.Sleep(1000*time.Millisecond)
for i:=0; i<x; i++ {
fmt.Println("read <-c : ",<-c)
}
}
输出:
1 3
2 3
3 3
read <-c : 0
read <-c : 1
read <-c : 2
read <-c : 3
0 3
read <-c : 4
分析:
容量为3,写入0/1/2后在c<-i阻塞,
<-c读取0/1/2,c<-i写入3后立刻被<-c读取,
c<-i写入4后立刻被<-c读取并结束程序
func main() {
c := make(chan int)
i := 1
go func() {
for {
c <- i
i++
if i == 11 {
close(c)
break
}
}
}()
for {
if j, ok := <-c; ok {
fmt.Println("read <-c : ", j)
}else{
fmt.Println(ok)
break
}
}
}
输出如下:
read <-c : 1
read <-c : 2
read <-c : 3
read <-c : 4
read <-c : 5
read <-c : 6
read <-c : 7
read <-c : 8
read <-c : 9
read <-c : 10
false