1、讀寫
package main
import (
"fmt"
"time"
)
func WriteData(intChan chan int) {
for i:=1;i<=50;i++{
intChan<-i
fmt.Println("寫:",i)
time.Sleep(time.Millisecond*100)
}
close(intChan) //寫完后關閉管道
}
func ReadData(intChan chan int,exitChan chan bool) {
for{
v,ok:=<-intChan
if !ok{
fmt.Println("讀取完畢")
break
}
fmt.Println("讀:",v)
}
//設置全局標志 告訴main 讀取完畢了 main主線程可以關閉了
exitChan<-true
close(exitChan)
}
func main() {
intChan :=make(chan int,50)
exitChan:=make(chan bool,1)
go WriteData(intChan)
go ReadData(intChan,exitChan)
//阻塞主線程
for ok:=range exitChan{
fmt.Println(ok)
}
}
2、管道實現定時通知
func Notice(d time.Duration) chan bool {
c := make(chan bool, 1)
go func() {
time.Sleep(d) //定時
c <- true
}()
close(c)
return c
}
func main() {
log.Println("one")
<-Notice(time.Second) //管道沒有寫則阻塞
log.Println("tow")
<-Notice(time.Second)
log.Println("three")
}
3、管道實現互斥鎖
package main
import (
"log"
"time"
)
var counter=0
func Increase1000(id int,done chan bool,mutex chan bool){
for i:=0;i<1000;i++{
mutex<-true //加鎖
counter+=1
time.Sleep(time.Microsecond)
<-mutex //解鎖
}
done<-true
}
func main() {
mutex,done:=make(chan bool,1),make(chan bool)
go Increase1000(1,done,mutex)
go Increase1000(2,done,mutex)
<-done;<-done
log.Println(counter)
}