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,人家还有,一直堵到最后,我问,人家才说,原子