Golang:代码执行流程控制

Posted 保暖大裤衩LeoLee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang:代码执行流程控制相关的知识,希望对你有一定的参考价值。

分支控制

if-else

基本语法:

var age int8
age = 18
//if的语法可以省略
if age > 18 {
	fmt.Println("成年人")
} else if age == 18 {
	fmt.Println("刚刚成年")
} else {
	fmt.Println("未成年")
}

在条件判断语句中声明变量:

if age2 := 20; age2 > 18 {
	fmt.Println("成年人")
}

switch

  • case后的表达式可以是多个,用逗号分开
  • 表达式可以是常量、变量、或者是一个有返回值的函数都可以,甚至可以是一个运算表达式。只要返回一个结果即可。
  • case的代码块最后不需要显式的写上break,默认会有break关键字

基本语法:

week := 5
switch week + 1 {
case 1:
	fmt.Println("一")
case 1 - 1:
	fmt.Println("零")
case 2:
	fmt.Println("二")
case 3:
	fmt.Println("三")
case 4, 5:
	fmt.Println("四或者五")
default:
	fmt.Println("???")
}

Golang代码格式化后,case缩进到与switch一列,怪怪的。

switch后可以不写表达式,当作if-else使用

switch {
case a == 1:
	fmt.Println("aaa")
case b == 18:
	fmt.Printf("bbb")
default:
	fmt.Println("相当于else")
}

switch后可以直接声明一个变量,分号结束

这样做没有什么意义的

switch c := 1; {
case c == 1:
	fmt.Println("cccc")
default:
	fmt.Println("这是什么鬼语法")
}

fallthrough穿透

当前case执行完成后,强制执行下一个case中的代码块,甚至是default中

d := 1
switch d {
case 1:
	fmt.Println(1)
	fallthrough
case 2:
	fmt.Println(2)
	fallthrough
case 3:
	fmt.Println(3)
	fallthrough
default:
	fmt.Println("fallthrough穿透")
}

需要注意:

switch 'a' {
case 'a' :
    fmt.Println("编译通过")
}
-------------------------------------
func get(b byte) byte {
	return b + 1
}

var bbb byte = 'a'
switch get(bbb) + 1 {
case 'a':
	fmt.Println("编译通过")
}

循环控制

基本语法:

for i := 0; i < 10; i++ {
	fmt.Printf("第%d次循环\\n", i + 1)
}
-------------------------------------
i := 1
for i <= 10 {
	fmt.Printf("第%d次循环\\n", i)
	i++
}
-------------------------------------
//死循环,等价于 for ;; {},通常需要break跳出
for {
}
-------------------------------------
//for range,增强型for循环,与java中类似
str := "Hello world"
for i := 0; i < len(str); i++ {
	fmt.Printf("str[%d]=%q\\n", i, str[i])
}
//for range方式
for idx, value := range str {
	fmt.Printf("str[%d]=%q\\n", idx, value)
}

break

count := 1
var num int
for {
	//设置随机种子
	rand.Seed(time.Now().UnixNano())
	num = rand.Intn(100) + 1
	if num == 99 {
		fmt.Println("随机到了99")
		break
	}
	count++
}

需要注意的是:当嵌套for循环时,break默认只跳出当前所在循环体对应的for循环

break跳出指定label所对应的循环体

label1:
	for i := 0; i < 5; i++ {
		for j := 0; j < 10; j++ {
			if j == 3 {
                //此时跳出label1对应的最外层for循环
				break label1
			}
			fmt.Println("j=", j)
		}
	}

continue

//continue用于结束本次循环,下一次循环还会继续执行
for i := 0; i < 10; i++ {
	if i == 4 {
		fmt.Println("i=4的循环结束")
		continue
	}
	fmt.Println("i=", i)
}

continue结束当前循环,到指定here标签处开始下一次循环

here1:
for i := 0; i < 2; i++ {
	for j := 0; j < 4; j++ {
		if j == 2 {
			continue here1
		}
		fmt.Println("i=%d,j=%d", i, j)
	}
}

while和do while

Golang没有whtile和do while,用for代替,break跳出。

goto

  • Golang的goto可以无条件的将执行位置转移到指定行
  • goto通常与条件语句配合使用,可用来实现条件转移,跳出循环体等功能
condition := 1
fmt.Println("step1")
if condition == 1 {
	goto point1
}
fmt.Println("step2")
point2:
fmt.Println("step3")
condition = 4
point1:
fmt.Println("step4")
if condition != 4 {
	condition = 3
}
fmt.Println("step5")
if condition == 3 {
	goto point2
}
fmt.Println("step6")

以上是关于Golang:代码执行流程控制的主要内容,如果未能解决你的问题,请参考以下文章

Golang-程序流程控制 ifswitch

go语言-golang基础-流程控制

Golang程序的流程控制

Golang两种执行流程以及区别

golang goroutine例子[golang并发代码片段]

Golang入门到项目实战 | golang流程控制关键字goto