Go灵魂级选手之流程控制

流程控制

Go语言中最常用的流程控制有 if 和 for, 而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于拓展类的流程控制

if else(分支结构)

语法
if 表达式1{
    代码块1
}else if 表达式2 {
    代码块2
}else {
    代码块3
}

Go 语言规定与 if 匹配的左括号 { 必须与 if和表达式放在同一行,{放在其他位置会触发编译错误

特殊语法

if 条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断

func Demo() {
    if score := 65; score >= 90 {
        fmt.PrintLn('A')
    }else if score > 75 {
        fmt.PrintLn('B')
    }else {
        fmt.PrintLn('C')
    }
}

for (循环结构)

Go 语言中的所以循环类型均可以用 for 关键字来完成

for 循环的基本格式
for 初始语句; 条件表达式; 结束语句 {
    代码块
}

条件表达式返回 true 时循环体不停的进行循环,知道条件表达式返回 false 时退出循环

for i := 0; i < 10; i++ {
    fmt.PrintLn(i)
}

for 循环的初始语句可以被忽略,但是初始语句后的分号必须要写

var i = 0
for ; i < 10; i++ {
    fmt.PrintLn(i)
}

for 循环的初始语句和结束语句都可以省略 (类似 while)

var i = 0
for i < 10 {
    fmt.PrintLn(i)
    i++
}

无限循坏

for {
    代码块
}

for 循环可以通过 break goto return panic 语句强行退出

for range (键值循环)

Go 语言中可以使用 for range 遍历数组、切片、字符串、map及通道(channel

通过 for range 遍历的返回值有以下规律

  1. 数组、切片、字符串返回索引和值
  2. map返回键和值
  3. 通道(channel) 只返回通道内的值

switch case

使用 switch 语句可方便地对大量的值进行条件判断

func switchDemo1() {
	finger := 3
	switch finger {
	case 1:
		fmt.Println("大拇指")
	case 2:
		fmt.Println("食指")
	case 3:
		fmt.Println("中指")
	case 4:
		fmt.Println("无名指")
	case 5:
		fmt.Println("小拇指")
	default:
		fmt.Println("无效的输入!")
	}
}
>>>> Go 语言规定每个 swith 只能有一个 default 分支

一个分支可以有多个值,多个case值中间使用英文逗号分隔

func testSwitch3(){
    switch n := 7; n {
        case 1, 3, 5, 7, 9:
        	fmt.PrintLn('奇数')
        case 2, 4, 6, 8:
        	fmt.PrintLn('偶数')
    }
}

分支还可以用使用表达式,知识后 switch 语句后面不需要再跟判断变量

func switchDemo4(){
    age := 30
    switch{
        case age < 25:
        	fmt.Println('test1')
        case age > 25 && age < 35:
        	fmt.Println('test2')
        case age > 60:
        	fmt.Println('test3')
        default:
        	fmt.Println('finish!')
    }
}

fallthrough 语法可以执行满足条件的 case 的下一个 case, 是为了兼容C语言中的case设计的

func switchDemo5() {
    s := 'a'
    switch {
        case s == "a":
        	fmt.Println("a")
    		fallthrough
        case s == "b":
        	fmt.Println('b')
        case s == "c":
        	fmt.Println('c')
        default:
        	fmt.Println("finish!!!")
    }
}
result>>>>>
a
b

goto (跳转到指定标签)

goto 语句通过标签进行代码间的无条件跳转

goto 语句可以在款速跳出循环、避免重复退出上有一定的帮助

Go语言中使用 goto 语句能简化一些代码的实现过程

双层嵌套的for循环退出
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", i, j)
        }
    }
    return
    //标签
breakTag:
    fmt.Println("结束for循环")
}

break (跳出循环)

break 语句可以结束 forswitchselect 的代码块

break 语句可在语句后面添加标签,表示退出某个标签对应的代码块,标签要求定义在对应的 forswitchselect 代码块上

func breakDemo1() {
    BREAKDEMO1:
        for i := 0; i < 10; i++ {
            for j := 10; j < 10; j++ {
                if j == 2 {
                    break BREAKDEMO1
                }
                fmt.Printf("%v-%v\n", i, j)
            }
        }
    fmt.Println("....")
}

continue (跳过当前循环,开始下一次循环)

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

continue 语句后添加标签时,表示开始标签对应的循环

func continueDemo(){
    forloop1:
    for i := 0; i < 5; i++{
        // forloop2:
        for j := 0; j < 5; j++{
            if i == 2 && j == 2 {
                continue forloop1
            }
            fmt.Printf("%v-%v\n", i, j)
        }
    }
}
posted @ 2019-06-03 19:43  EthanChen95  阅读(105)  评论(0编辑  收藏  举报