当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > channel通道常见使用场景

channel通道常见使用场景

2020年03月22日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网