!!!!!!go中管道的理解之---遍历管道+管道关闭+select=====三种断言方式

本文介绍了Go语言中管道遍历的三种方式,强调在遍历结束时需要关闭管道以避免panic。推荐使用方式1(for循环内遍历单个管道)和方式3(使用select同时遍历多个管道)。此外,文章讨论了类型断言的使用,以及并发控制中的channel、waitgroup和context等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.管道遍历有3种方式见下贴图

每种方式都要求没有数据的时候,管道是关闭的,不然试图读取空管道会panic

遍历的本质-循环-go中只有for: [要遍历的对象]+ [遍历出来的东西存放的容器]+ [ 遍历的 条件]

这三种方式,遍历1个管道,我推荐1,一个for中同时遍历多个管道,并使用,我推荐3,好像也只能使用3吧。

当然方式1,2也可以在for外部构建一个容器,每次把每层循环的数据倒那个容器内。总之for出来的数据必须有个容器装;

共同点:都需要反复读-for,读到空的会panic

区别:方式1,2只能在循环体内使用数据,局部变量出了循环,就不认,最关键的,只能同时遍历1个,注意是1个;方式3,比较灵活,循环体内体外皆可使用,最关键的,可以同时遍历多个,注意是多个。

方法3的灵活应用见我写的,https://blog.csdn.net/u013755520/article/details/89552275 go实现归并排序

【一】for v:=range p{//遍历出来的数据,每一层创建一个容器v,v作用域是一层循环,一层结束后释放,下一层再建
		fmt.Println(v)//循环的条件是   p中有数据
	  }

【二】	for{//无条件循环,最后通过break跳出循环   注意循环不会造成栈溢出,因为一层结束后释放本层资源
			if v,ok:=<-p;ok{//每一层遍历都创建 v ok,同第一种方式
				fmt.Println(v)
			}else{
				break
			}
		}
【三】v,ok:=<-p
	 for ok{//循环条件是 ok为真 //循环出来的数据放在循环体外
		fmt.Println(v)
		v,ok=<-p
	 }
【三也可以这样写】
      v,ok ;= <-p
      for{
         if ok{
           fmt.Println(v)
		   v,ok=<-p
         }else{
           break
         }       
      }
【共同点:都需要循环!!!!。】
    //再举个最普通的例子  觉得我真是个人才,钻太深了~~~~
    
    for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
	fmt.Println("===再来两种方式====")
	i := 0
	for i < 10 {
		fmt.Println(i)
		i++
	}

三种判断:
    //判断key是否存在
    value, ok := map[111]


    var slice []interface{}     空接口类型的切片
    value,ok=slice[2].(int) 类型断言,只能针对空接口

    if num, isOk := <-ch; isOk == true{}
 


uintptr是基础数据类型吗,能转成什么类型,一般应用在什么场合

它是基本数据类型,在go的builtin/builtin.go中的数据类型和内置函数中出现.可以转任意的类型,一般用于需要计算指针的万能指针转换场合

类型断言:必须是接口类型:

1.v,ok := i.(int)  2.i.(type)

 

并发控制的实现:channel,waitgroup,context,人家还有,一直堵到最后,我问,人家才说,原子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值