Go语言之流程控制

在Go语言中,总结后的流程控制语句主要有ifforswitchgoto。其中常用的为iffor
接下来讲依次记录这几种流程控制,并以代码进行说明。

if流程控制

if条件语句的一般格式如示例所示:

/*
当第一个表达式为true时,执行第一个逻辑块,否则判断第二个表达式;第二个表达式为true时执行第二个逻辑块,
否则执行第三个逻辑块。
*/
if 表达式 {
	逻辑块
} else if 表达式 {
	逻辑块
} else {
	逻辑块
}

注意:在Go中关于if有个硬性规定,与if匹配的{必须和if与表达式在同一行,{放在其他位置在编译的时候会报错;与else匹配的{也必须写在同一行,并且else与它对应的if}也要在同一行。
示例:

func ifDemo() {
	age  := 25
	if age >= 65 {
		fmt.Println("美滋滋地退休生活...")
	} else if age <= 18 {
		fmt.Println("美滋滋的地学生生活...")
	} else {
		fmt.Println("苦逼的上班社畜0.0")
	}
}

此外,if语句还可以在表达式之前写一个执行语句,用隔开,之后再根据条件进行判断真假
示例:

func ifDemo() {	
	if age  := 25; age >= 65 {
		fmt.Println("美滋滋地退休生活...")
	} else if age <= 18 {
		fmt.Println("美滋滋的地学生生活...")
	} else {
		fmt.Println("苦逼的上班社畜0.0")
	}
}

这种在if后面定义的变量,其作用域为整个if流程,出了if流程之后age变量便失去了作用。

for控制流程

在Go中的控制循环实现用for

for循环的基本格式

如下示例:

for 初始语句;条件语句;结束语句 {
	循环块语句
}

条件语句返回true时循环会一直进行下去,循环块会一直执行,直到条件语句返回false时退出循环

变种1:在Go中for循环的初始语句可以忽略
示例:

func forDemo() {
	i := 0
	for ; i < 9; ++i {
		fmt.Printf("%d ",i)
	}
}

变种2:在Go中for循环的初始语句结束语句都可以忽略
示例:

func forDemo() {
	i := 0
	for ; i < 9; {
		fmt.Printf("%d ",i)
		i++
	}
}

死循环:可以通过breakgotoreturnpanic强制退出循环来结束死循环

for 的键值循环

在Go中可以通过使用for range来遍历数组、切片、字符串、map等。其中,在遍历数组、切片和字符串的时候,其遍历返回索引和值;在遍历map时返回键、值;在遍历channel时只返回通道值。

switch case控制流程

通过使用switch+case来对大量的if语句进行简化代码,示例:

func switchDemo() {
	age := 25
	switch {	//case使用表达式的时候在switch后不写变量
	case age < 12:
		fmt.Println("童年")
	case age < 18:
		fmt.Println("少年")
	case age < 30:
		fmt.Println("青年")
	case age < 60:
		fmt.Println("中年")
	default:	//default在一个switch中只能有一个
		fmt.Println("老年")
	}
}

注意:在Go中,匹配到case后执行对应的语句块后会直接跳出switch语句,不必写break来跳出switch流程。
变种1case后可跟数字、字母,且switchcase的数据类型必须相同
示例:

func switchDemo() {
	age := 2
	switch age {	//age与1、2、3、4都是相同的数据类型
	case 1:
		fmt.Println(1)
	case 2:
		fmt.Println(2)
	case 3:
		fmt.Println(3)
	case 4:
		fmt.Println(4)
	default:	
		fmt.Println(5)
	}
}

变种2 :通过使用fallthrough来执行满足case条件的下一个case,示例:

func switchDemo() {
	age := 25
	switch {
	case age < 12:
		fmt.Println("童年")
	case age < 18:
		fmt.Println("少年")
	case age < 30:
		fmt.Println("青年")
		fallthrough
	case age < 60:
		fmt.Println("中年")
	default:
		fmt.Println("老年")
	}
}

会打印出"青年"跟"中年"两个字符串

goto控制流程

goto语句通过标签在代码间的进行无条件跳转。比较有效的用于多层循环退出时,示例:

//双循环不使用goto时需要设置一个退出标签来跳出循环,多层时需要更多的标签
func gotoDemo1() {
	var breakFlag bool
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				breakFlag = true
				break
			}
			fmt.Printf("%v-%v\n", i, j)
		}
		// 外层for循环判断
		if breakFlag {
			break
		}
	}
}

//使用goto直接跳出双循环
func gotoDemo2() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 标签
breakTag:
	fmt.Println("结束for循环")
}

break控制流程

break语句可以结束forswitchselect的代码块。示例:

//break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块
func breakDeme() {
//要求标签必须在对应的语句的代码块上
breakDemo:
	for i:= 0; i < 10; i++ {
		if i == 8 {
			break breakDeme
		}
		fmt.Println(i)
	}
	fmt.Println("Demo is over...")
}

continue控制流程

continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用

func breakDeme() {
//在 continue语句后添加标签时,表示开始标签对应的循环。
continueDemo:
	for i:= 0; i < 10; i++ {
		if i == 8 {
			continue continueDemo
		}
		fmt.Println(i)
	}
	fmt.Println("Demo is over...")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值