控制结构

控制结构

1.if语句

if err, file := os.Open("xxx"); err == nil {
        //do smoething
} else {
    return nil, err
}

if score >= 90 {
} else if score >= 80 {
} else {
}

2.switch语句

switch 语句会根据传入的参数检测并执行符合条件的分支.
switch 的语法特点如下:
    switch 和 if 语句一样, switch后面可以带一个可选的简单的初始化语句
    switch 后面的表达式也是可选的, 如果没有表达式, 则case子句是一个布尔表达式. 而不是一个值, 此时就相当于多重if else语句
    switch 条件表达式的值不像c语言那样必须限制为整数, 可以是任意支持相等比较运算的类型变量
    通过fallthough语句来强制执行下一个case子句(不再判断下一个case子句的条件是否满足)
    switch支持default语句, 当所有的case分支都不符合时,执行default语句,并且default语句可以放到任意位置,并不影响switch的逻辑判断
    swith和.(type)结合可以进行类型的查询, (//todo::)
    
    switch i := "y"; i { //switch后面可以带上一个初始化语句
    case "y", "Y": //多个case值使用逗号分隔
        fmt.Println("yes")
        fallthrough  //fallthrough会跳过接下来的case条件,
                     // 直接执行下一个case语句
    case "n", "N":
        fmt.Println("no")
    }
    
    switch {
    case score >= 90:
        grade = "A"
    case score >= 80:
        grade = "B"
    default:
        grade = "F"
    }

3.for语句

Go 语言仅支持一种循环语句,即for语句
for init; condition; post {}  //类似c里面的for循环语句
for condition {}   //  类似c里面的while循环语句
for {}  // 类似c里面的while(1)死循环语句
// 访问map
for key, value := range map {}
for key := range map{}
// 访问数据
for index, value := range array {}
for index := range array {}
for _, value := range array{}
// 访问切片
for index, value := range slice {}
for index := range slice {}
for _, value := range slice{}
// 访问通道
for value := range channel {}

4.标签和跳转

Go 语言使用标签(Lable)来标识一个语句的位置, 用于goto, break, continue语句的跳转, 标签的语法是:
Lable: Statement
标签的具体作用和使用见下面的goto、break、continue

goto
goto 语句用于函数的内部的跳转,需要配合标签一起使用,具体的格式如下:
    goto Lable  //goto Lable 的语义是跳转到标签名后的语句处执行,
    goto语句有以下几个特点:
        goto 语句只能在函数内跳转。
        goto 语句不能跳过内部变量声明语句,这些变量在goto语句 的标签语句处又是可见的。
            例如:
                goto L //BAD,  跳过了v := 3这条语句是不允许的
                v := 3
                L:
        goto语句只能跳到同级作用域或者上层作用域内,不能跳到内部作用域内。
            例如 : 
                if n%2 == 1 {
                    goto L1
                }
                for n > 0 {
                    f()
                    n--
                L1: 
                    f()
                    n--
                }
 
break
break 用于函数内跳出 for、 switch、 select 语句的执行,有两种使用格式:
    单独使用,用于跳出 break 当前所在的 for、 switch、 select 语句的执行。 
    和标签一起使用,用于跳出标签所标识的 for、 switch、 select 语句的执行,可用于跳出多重循环,但标签和 break 必须在同一个函数内。
        例如:
            L1:
                for i := 0; ; i++ {
                    for j := 0; ; j++ {
                        if i >= 5 {
                            break L1  // 跳出L1标签所在的for循环
                        }
                        if j > 10 {
                            break // 默认仅跳出离break最近的内层循环
                        }
                    }
                }
                
continue
continue 用于跳出 for 循环的本次选代,跳到 for 循环的下一次选代的 post 语句处执行,也有两种使用格式:
    单独使用,用于跳出 continue 当前所在的 for 循环的本次迭代 。
    和标签一起使用,用于跳出标签所标识的 for 语句的本次选代,但标签和 continue 必须 在同一个函数内。
        例如 :
            L1:
                for i := 0; ; i++ {
                    for j := 0; ; j++ {
                        if i >= 5 {
                            continue L1  // 跳出L1标签所在处的for循环
                        }
                        if j > 10 {
                            continue // 继续下次循环
                        }
                    }
                }

5.return和函数调用

re阳m i吾句也能引 发控制流程的跳转,用于函数和方法的退出。
函数和方法的调用也能引 发程序控制流的跳转,这些在后续章节中会详细介绍。