golang_channel: channel的用法介绍

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87883521
通道(channel)

一种数据类型

goroutine 奉行 通过通信来共享内存,而不是共享内存来通信.

作用:

1.存放数据用来作缓存
2.数据同步

语法:

通过make()定义channel

c := make(chan 数据类型,容量)
​ 容量=0,不能储存数据
​ 容量>0,可以储存数据,储存到容量上限就阻塞

c <- value //将value写入通道c
<- c //接收并将其丢弃
x := <- c //从c中接受数据,并赋值给x
x, ok := <- c //接收并赋值,同时检查通道是否已经关闭或者为空

通道阻塞的2种情况:

1.通道中的值没有被取走,写端阻塞
2.通道中没有值,读端阻塞

关闭通道

语法:close() 通道关闭后就不再阻塞
​ 1.close()不是必须的,如果读取端循环读取数据必须要调用close(),否则会出现死锁
​ 2.只有在写端才能关闭
​ 3.关闭不能写入只能读取

单向通道

​ 双向通道 chan int
​ 写通道 chan <- int
​ 读通道 <- chan int
声明:
​ var c_w chan <- int = c //写通道
​ var c_r <- chan int = c //读通道
​ 自动推导类型
​ c_w := make(chan <- int) c_w = c
​ c_r := make(<- chan int) c_r = c

注意: 通道的传递是地址传递、通道是队列的模式

生产者和消费者模型

单向channel最典型的应用就是“生产者消费者模型”,一个模块(函数)负责生产数据(生产者),另一个模块负责处理数据(消费者),生产者和消费者之间有一个缓冲区,生产者将数据放入缓冲去,消费者从缓冲中取出数据。

1542763751247

生产者作用:写数据

消费者作用:读数据

缓冲区作用:存放数据 (容量越大,并发行越好)

单向通道的应用:

//写通道
func producer(w chan <- int){
	for i := 0; i < 4; i++{
		w <- i
	}
	close(w)
}

//读通道
func consumer(r <-chan int){
	for n := range r {
		fmt.Println("n =",n)
	}
}

func main() {
	//创建一个双向通道
	ch := make(chan int)

	//生产者,写数据
	go producer(ch)

	//消费者,读数据
	consumer(ch)
}

Output:

n = 0
n = 1
n = 2
n = 3

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87883521
今日推荐