channel通道常見使用場景


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)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM