加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

笔记 - 在合适之处关闭channel

发布时间:2020-12-16 19:00:24 所属栏目:大数据 来源:网络整理
导读:/*摘自: https://code.google.com/p/go/source/browse/2013/advconc/buffer/buffer.go?repo=talks*/package mainimport ("fmt")func main() {in,out := make(chan int),make(chan int)go buffer(in,out)for i := 0; i 10; i++ {in - i}close(in) // in == ni
/*
摘自: 
https://code.google.com/p/go/source/browse/2013/advconc/buffer/buffer.go?repo=talks
*/
package main

import (
	"fmt"
)

func main() {
	in,out := make(chan int),make(chan int)
	go buffer(in,out)

	for i := 0; i < 10; i++ {
		in <- i
	}
	close(in) // in == nil => false

	for i := range out { // 注:out如果不close()会持续循环下去,系统报错
		fmt.Println(i)
	}

}

func buffer(in <-chan int,out chan<- int) {
	var buf []int // 无限制的缓存

	for in != nil || len(buf) > 0 {
		var i int = 0
		var c chan<- int

		if len(buf) > 0 { // 如果缓存中还有数据,则取出发送。
			i = buf[0]
			c = out
		}

		// 此处会阻塞
		select {
		case c <- i: // 送出左端数据
			buf = buf[1:]
		case n,ok := <-in: // 取出in管道数据,放入缓存中。
			if ok {
				buf = append(buf,n)
			} else {
				in = nil // 消灭一个LOOP条件
			}

		}
	}
	close(out) // 在合适之处关闭channel
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读