1 兩個channel 版本
package mainimport ("fmt""sync")var wg sync.WaitGroup
var c1 chan int
var c2 chan intfunc A(){defer wg.Done()for i:=0;i<10;i++ {<-c1fmt.Println(2*i)c2<-1 //牽引協程}
}
func B(){defer wg.Done()for i:=0;i<10;i++ {<-c2fmt.Println(2*i+1)c1<-1}
}
func main () {wg = sync.WaitGroup{} //初始化c1 = make(chan int, 1) //有緩存,不然會死鎖c2 = make(chan int)wg.Add(2)go A() //協程執行函數go B()c1<-1 //啟動協程wg.Wait()fmt.Println("hello https://tool.lu/")
}
無緩沖的通道(unbuffered channel)是指在接收前沒有能力保存任何值的通道。
這種類型的通道要求發送 goroutine 和接收 goroutine同時準備好,才能完成發送和接收操作。
如果都使用無緩沖通道,需要小修一下B()函數,避免死鎖。
package mainimport ("fmt""sync")var wg sync.WaitGroup
var c1 chan int
var c2 chan intfunc A(){defer wg.Done()for i:=0;i<10;i++ {<-c1fmt.Println(2*i)c2<-1}
}
func B(){defer wg.Done()for i:=0;i<10;i++ {<-c2fmt.Println(2*i+1)if i < 9 { //臨結束時候,不再寫入c1<-1}}
}
func main () {wg = sync.WaitGroup{}c1 = make(chan int)c2 = make(chan int)wg.Add(2)go A()go B()c1<-1wg.Wait()fmt.Println("hello https://tool.lu/")
}
2? 1個通道版本
- 奇偶打印條件過濾
- 管道自牽引
package mainimport ("fmt""sync")var wg sync.WaitGroup
var c1 chan intfunc A(){defer wg.Done()for i:=0;i<10;i++ {<-c1if i%2 == 0 {fmt.Println(i)}}
}
func B(){defer wg.Done()for i:=0;i<10;i++ {c1<-1if i%2 == 1 {fmt.Println(i)}}
}
func main () {wg = sync.WaitGroup{}c1 = make(chan int)wg.Add(2)go A()go B()wg.Wait()fmt.Println("hello https://tool.lu/")
}
3 不使用 channel
package mainimport ("fmt""sync")var wg sync.WaitGroup
var i intfunc A(){defer wg.Done()for ;i<10; {if i%2 == 0 {fmt.Println(i)i++}}
}
func B(){defer wg.Done()for ;i<10; {if i%2 == 1 {fmt.Println(i)i++}}
}
func main () {wg = sync.WaitGroup{}i = 0wg.Add(2)go A()go B()wg.Wait()fmt.Println("hello https://tool.lu/")
}