zoukankan      html  css  js  c++  java
  • Go流程控制

    我们经常需要代码在满足一定条件时进行执行,或者需要重复执行代码多次,此时需要选择条件语句(if-else if- else)或选择语句(switch case)及循环语句(for)

    条件语句

    if

    当 if 表达式的结果为 true 则执行语句块内代码

        has := true
        if has {
           fmt.Println("买到水果")
        }
    

    if-else

    当 if 表达式结果为 true,则执行 if 语句块内代码,否则执行 else 语句块内代码

    	has := false
    	if has {
    		fmt.Println("买到水果")
    	} else {
    		fmt.Println("没有买到水果")
    	}
    

    else if

    当 if 表达式结果为 true,则执行 if 语句块内代码,否则依次从上到下判断 else if 表达式结果,若结果为 true 则执行对应语句块内代码并退出 if-else if-else 语句,若 if 和else if 表达式均为 false,则执行 else 语句块内代码

    	var score int = 88
    	if score >= 90 {
    		fmt.Println("A")
    	} else if score >= 80 {
    		fmt.Println("B")
    	} else if score >= 60 {
    		fmt.Println("C")
    	} else {
    		fmt.Println("D")
    	}
    

    初始化子语句

    可以在 if 语句中初始化语句块内的局部变量,多个语句之间使用逗号(;)分隔

    只能初始化true或false

    	if flag := true; flag {
    		fmt.Println("flag:", flag)	//flag: true
    	}
    
    	if flag := false; flag {
    		fmt.Println("flag if:", flag)
    	} else {
    		fmt.Println("flag else:", flag)	//flag else: false
    

    总结

    对于条件语句必须有 if 语句,可以有 0 个或多个 else if 语句,最多 1 个 else 语句,语句从上到下执行,执行第一个条件表达式为 true 的语句块并退出,否则执行 else 语句块退出

    选择语句

    根据输入条件的不同选择不同的语句块进行执行(多分支)

    switch-case单值

    swtich 语句后面跟接变量,此时选择与变量相同的 case 语句块执行并退出,若所有 case均不相同则执行 default 语句块,case 语句中可包含多个不同的值进行匹配

    	input := "y"
    	switch input {
    	case "yes","y":
    		fmt.Println("确认")
    	case "no","n":
    		fmt.Println("取消")
    	default:
    		fmt.Println("选项错误")
    	}
    

    switch 后不跟接变量,此时自上到下选择第一个表达式为 true 的 case 语句块执行并退出,若所有 case 表达式均为 false,则执行 default 语句块

    	input := 80
    	switch {
    	case input >= 90:
    		fmt.Println("A")
    	case input >= 80:
    		fmt.Println("B")
    	default:
    		fmt.Println("C")
    	}
    

    初始化子语句

    可以在 switch 语句中初始化语句块内的局部变量,多个语句之间使用逗号(;)分隔,注意初始化表达式时后面的逗号(;)不能省略

    	switch operate := "add"; operate {
    	case "add":
    		fmt.Println("添加")
    	case "delete":
    		fmt.Println("删除")
    	case "modify":
    		fmt.Println("修改")
    	case "query":
    		fmt.Println("查询")
    	default:
    		fmt.Println("操作错误")
    	}
    
    	switch score := 80; {
    	case score >= 90:
    		fmt.Println("A")
    	case score >= 80:
    		fmt.Println("B")
    	case score >= 60:
    		fmt.Println("C")
    	default:
    		fmt.Println("D")
    	}
    

    fallthrough

    switch-case 默认执行 case 语句后退出,若需要继续执行下一个 case 语句块,可以在 case语句块中使用 fullthrough 进行声明

    	switch score := 80; {
    	case score >= 90:
    		fmt.Println("A")
    	case score >= 80:
    		fmt.Println("B")
    		fallthrough
    	case score >= 60:
    		fmt.Println("C")
    	default:
    		fmt.Println("D")
    	}
    

    总结

    对于选择语句可以有 0 个或多个 case 语句,最多有 1 个 default 语句,选择条件为 true的 case 语句块开始执行并退出,若所有条件为 false,则执行 default 语句块并退出。可以通过 fallthrough 修改执行退出行为,继续执行下一条的 case 或 default 语句块

    循环语句

    for

    for  初始化语句; 条件语句; 后置语句 {}
    

    for 语句后有三个子语句分别为:初始化子语句,条件子语句和后置子语句

    执行顺序为:

    1、初始化子语句

    2、 条件子语句

    3、语句块

    4、后置子语句

    5、b->c->d

    6、…

    7、直到条件子语句为 false 结束循环

    	sum := 0
    	for i := 1; i <= 100; i++{
    		sum += i
    	}
    	fmt.Println(sum)
    

    break与continue语句

    break 用于跳出循环,当条件满足则结束循环

    continue 用于跳过本次循环,当条件满足这跳过本次循环进行后置或条件子语句执行

    	// continue
    	for i := 1; i <= 5; i++{
    		if i == 3 {
    			continue
    		}
    		fmt.Println(i)
    	}
    
    	// break
    	for i := 1; i <= 5; i++ {
    		if i == 3{
    			break
    		}
    		fmt.Println(i)
    	}
    

    for实现类while

    for 子语句可以只保留条件子语句,此时类似于其他语言中的 while 循环

    	sum := 0
    	i := 1
    	for i <= 100 {
    		sum += i
    		i++
    	}
    	fmt.Println(sum)
    

    无限循环

    for 子语句全部省略,则为无限循环(死循环),s 常与 break 结合使用

    	sum := 0
    	i := 1
    	for {
    		if i > 100 {
    			break
    		}
    		sum += i
    		i++
    	}
    	fmt.Println(sum)
    
    	i := 0
    	for {
    		i++
    		fmt.Println(i)
    	}
    	// ctrl+z或者ctrl+c终止程序运行
    

    for-range

    用于遍历可迭代对象中的每个元素,例如字符串,数组,切片,映射,通道等

    针对包含 Unicode 字符的字符串遍历是需要使用 for-range,range 返回两个元素分别为字节索引和 rune 字符,可通过空白标识符忽略需要接收的变量

    	text := "我爱中国"
    	for i, e := range text {
    		fmt.Printf("%d: %c\n", i, e)
    	}
    	for _, e := range text{
    		fmt.Printf("%c\n", e)
    	}
    /*结果
    0: 我
    3: 爱
    6: 中
    9: 国
    我
    爱
    中
    国
    */
    

    label与goto

    for、switch 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:)结尾的单词
    
    标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母
    
    使用标签和 Goto 语句是不被鼓励的:它们会很快导致非常糟糕的程序设计,而且总有更加可读的替代方案来实现相同的需求。
    

    可以通过 goto 语句任意跳转到当前函数指定的 label 位置

    	sum := 0
    	i := 1
    
    	START:	//定义标签
    	if i > 100 {
    		goto END //跳至END标签
    	} else {
    		sum += i
    		i++
    		goto START //跳至START标签
    	}
    	END: //定义标签
    	fmt.Println(sum)
    

    break 和 continue 后也可以指定 label 用于指定跳出或跳过指定 label 同层级的循环

    	OI:
    	for i := 0; i < 5; i++ {
    		for j := 0; j < 5; j++ {
    			if j == 3 {
    				continue OI // 跳过外层循环
    			}
    			fmt.Println(i, j, "=")
    		}
    	}
    
    	BI:
    	for i := 0; i < 5; i++{
    		for j := 0; j < 5; j++{
    			if j == 3{
    				break BI	//跳出外层循环
    			}
    			fmt.Println(i, j)
    		}
    	}
    
    每天进步一点点
  • 相关阅读:
    docker/kubernetes国内源/镜像源解决方式
    logstash的filter之grok
    基于ambari搭建hadoop生态圈大数据组件
    Hadoop整体概述
    flume的配置详解
    Zabbix错误”zbx_mem_malloc(): out of memory”解决方法
    Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
    基于 win7下虚拟机的 GNSS-SDR安装过程
    博客文章搬迁同步声明
    RTKLIB源码解析(一)——单点定位(pntpos.c)
  • 原文地址:https://www.cnblogs.com/Otiger/p/13701172.html
Copyright © 2011-2022 走看看