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)
		}
	}
posted @ 2020-09-20 17:56  rxg456  阅读(82)  评论(0)    收藏  举报