首页 > 其他分享 >11_流程控制

11_流程控制

时间:2023-10-08 13:22:59浏览次数:43  
标签:11 控制 name int 流程 999 case range select

一、条件语句 select

1.1 select 介绍

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s);
    /* 你可以定义任意数量的 case */
    default : /* 可选 */
       statement(s);
} 

select { //不停的在这里检测
    case <-chanl :    //检测有没有数据可以读
    //如果chanl成功读取到数据,则进行该case处理语句
    case chan2 <- 1 : //检测有没有可以写
    //如果成功向chan2写入数据,则进行该case处理语句
    //假如没有default,那么在以上两个条件都不成立的情况下,就会在此阻塞//一般default会不写在里面,select中的default子句总是可运行的,因为会很消耗CPU资源
    default:
    //如果以上都没有符合条件,那么则进行default处理流程
} 

​ select 语句类似于 switch 语句,但是 select会随机选择一个可运行的 case,如果没有 case可以运行,那么它将一直阻塞直到有 case可用。select 语句中的每个 case 都必须是一个通信操作,要么是发送要么是接收,如果有多个 case 都可以运行,Select 会随机公平地选择出一个执行,其它的不会执行;如果有 default 子句,那么执行该语句;如果没有 default 子句,那么 select 将阻塞,直到某个通信可以运行。

//实例
func main() {
	var c1, c2, c3 chan int
	var i1, i2 int
	select {
	case i1 = <-c1:
		fmt.Printf("received ", i1, "from c1\n")
	case c2 <- i2:
		fmt.Printf("sent ", i2, "to c2\n")
	case i3, ok := (<-c3):
		if ok {
			fmt.Printf("received ", i3, "from c3\n")
		} else {
			fmt.Printf("c3 is closed\n")
		}
		default:
			fmt.Println("no communication\n")
	}
}
//output
no communication

1.2 select 典型用法

1.2.1 超时判断

//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行
var resChan = make(chan int)
// do request
func test() {
    select {
    case data := <-resChan:              //接收到数据
        doData(data)
    case <-time.After(time.Second * 3):  //超时
        fmt.Println("request time out")
    }
}

func doData(data int) {
    //...
}

1.2.2 线程/协程 退出

//主线程(协程)中如下:
var shouldQuit=make(chan struct{})
fun main(){
    {
        //loop
    }
    //...out of the loop
    select {
        case <-c.shouldQuit:
            cleanUp()
            return
        default:
        }
    //...
}

//再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
close(shouldQuit)

1.2.3 判断channel是否阻塞

//在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
ch := make (chan int, 5)
//...
data:=0
select {
	case ch <- data:
	default:
    	//做相应操作,比如丢弃data。视需求而定
} 

二、循环语句 range

//例1
func main() {
    a := [3]int{0, 1, 2}

    for i, v := range a { // index、value 都是从复制品中取出。

        if i == 0 { // 在修改前,我们先修改原数组。
            a[1], a[2] = 999, 999
            fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。
        }

        a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。

    }

    fmt.Println(a) // 输出 [100, 101, 102]。
}  

//output
[0 999 999]
[100 101 102]   
func main() {
    s := []int{1, 2, 3, 4, 5}

    for i, v := range s { // 复制 struct slice { pointer, len, cap }。

        if i == 0 {
            s = s[:3]  // 对 slice 的修改,不会影响 range,这里不是对底层数据的修改,所以无影响
            s[2] = 100 // 对底层数据的修改。
        }

        println(i, v)
    }
}  
//output
0 1
1 2
2 100
3 4
4 5

​ 对数组使用 range-for 会复制一份底层数组,index、value均从复制品中取出;slice 作为引用类型被 range-for 时不会复制底层数据,对于底层数据的修改会影响到 range 循环。

type student struct {
    name string
    age  int
}

func main() {
    m := make(map[string]*student)
    stus := []student{
        {name: "pprof.cn", age: 18},
        {name: "测试", age: 23},
        {name: "博客", age: 28},
    }

    for _, stu := range stus {
        m[stu.name] = &stu     //这里每次取复制对象的地址,都是同一个地址,取得最后循环到的对象的值
    }
    for k, v := range m {
        fmt.Println(k, "=>", v.name)
    }
} 

//output
pprof.cn => 博客
测试 => 博客
博客 => 博客

标签:11,控制,name,int,流程,999,case,range,select
From: https://www.cnblogs.com/istitches/p/17748647.html

相关文章

  • Python入门示例系列11 数据类型
    Python入门示例系列11数据类型标准数据类型Python3中有六个标准的数据类型:   Number(数字)   String(字符串)   List(列表)   Tuple(元组)   Set(集合)   Dictionary(字典)Python3的六个标准数据类型中:   不可变数据immutable(3个):Number(数字)、String(字符串)、......
  • 题解:洛谷P1119 灾后重建
    题解:洛谷P1119灾后重建题目传送门前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来,跑N次floyed,当然由于每次点数时递增的,所以实际复杂度远远小于O(N^4),算了下大概200个点跑了4e8多一......
  • npm发包流程
    npm发包流程:一、登陆npm1)保证镜像切回npm2)输入npmconfigsetregistryhttp://registry.npmjs.org3)npmlogin4)输入npm用户名、密码、邮箱、双因素身份验证码然后这个文件配置需要注意点,有些是必须的,不然发布失败。二、packjson文件配置说明{"name":"mxdm-ui",//包名......
  • Jasper模板使用记录十——控制元素显示
    控制元素显示PrintWhenExpression1.通过设置PrintWhenExpression属性,来控制元素是否显示2.PrintWhenExpression应设置为一个表达式,表达式的结果为布尔类型的值,值为true时显示元素3.表达式使用java语法(此语法与模板的属性language有关)即可,如$F{flag}.equals("1")、$F{f......
  • Sovit2D在线组态设计 构建LNG加气站Web Scada控制系统
    前言天然气是最清洁的化石能源,天然气使用安全、应用广泛,在炊事、供热、发电、交通等领域扮演重要角色。LNG(液化天然气)作为一种市场化的全球能源,能够很好的解决天然气的可及性问题。建设背景在LNG行业迅速发展的同时,加气站的监管难度加大,加之许多地方管理工作相对薄弱滞后、控......
  • 【Mysql】不要用int类型存储11位手机号
    一、遇到问题今天在做添加数据的时候,发现手机号存储错误,报错信息是:Cause:com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:Datatruncation:Outofrangevalueforcolumn'f_phone'atrow1;Datatruncation:Outofrangevalueforcolumn'f_phone'atrow1;ne......
  • P1003 [NOIP2011 提高组] 铺地毯
    第一思路:开一个N*N的数组,每次都扫一遍地毯范围并标记编号然后你会发现:喜提MLE为什么呢?我们来看看数据范围0≤n≤1e4n的范围是1e4,数组总大小为1e16,大约需要4000TB的内存空间服务器也不带这么玩的正解:将地毯信息用结构体存储structnode{ intx1,y1,x2,y2;//x1......
  • 微信小程序备案流程
     2.添加主体信息3.小程序信息         这样就结束了等腾讯电话就行,有修改的他会告诉你4.管局验证(工信部)管局审核通过后。工信部会发短信给你,注意要24小时内核验完成,法人和管理员都会收到短信都要验证管局地址传送门:https://beian.miit.gov.cn/......
  • 2023-2024-1 20231411 《计算机基础与程序设计》第二周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第一周作业这个作业的目标初步熟悉课本以及对所学内容有所思考作业正文https://www.cnblogs.com/123lyx/p/17747569.html教材学习内容总......
  • Linux---0.11---asm.s硬件中断类型介绍
    _divide_error这是一个标记,通常用于表示与除法错误相关的处理程序或函数。当发生除以零的错误时,处理器可能会跳转到与此标记关联的处理程序,以处理该错误。_debug_debug:这是一个标记,通常用于表示与调试相关的处理程序或函数。调试处理程序通常用于在调试模式下捕获和处理调试事......