go 语言管道

go 语言管道

  • 有缓存,无缓冲管道,读,写,close测试
package main

import (
	"fmt"
	"time"
)

func main() {

	c := make(chan struct{}, 3)

	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c))
	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c))
	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c)) //cap(c)一直是3,len(c)当前管道里缓存的数量
	//c <- struct{}{} //有缓冲管道,管道满了就阻塞

	/*	var i int = 0
		for cc := range c { //遍历等价于<-c
			fmt.Printf("cc = %v\n", cc)
			if i == 1 {
				close(c) //在遍历时,如果channel没有关闭,则会出deadlock的错误
				//在遍历时,如果channel已经关闭,则会正常遍历管道的所以数据,遍历完后,就会退出遍历。
			}
			i++
		}*/

	close(c)
	_, ok := <-c
	fmt.Printf("ok=%v\n", ok) //管道里面的还存在数据,即使close管道,管道里面的数据还是可以正常读取
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok)
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok)
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok) //管道里面的数据都读完,并且close管道,ok才是fasle

	//c <- struct{}{} 向已经关闭的管道里面写数据,报panic

	noBuffChan := make(chan struct{})
		go func() {
		time.Sleep(6 * time.Second)
		<-noBuffChan
	}()

/*	go func() {
		time.Sleep(6 * time.Second)
		close(noBuffChan)
	}()*/

	go func() {
		time.Sleep(3 * time.Second)
		noBuffChan <- struct{}{}
	}()
	<-noBuffChan //阻塞直到管道被关闭,或者管道里面有数据开始写
	fmt.Println("after <-noBuffChan")
	noBuffChan <- struct{}{} //阻塞直到管道开始读,如果阻塞过程中管道被关闭,则报panic
	fmt.Println("end")

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值