GO入门——3. 控制语句

1 if

  • 条件表达式没有括号
  • 支持一个初始化表达式(可以是并行方式)
  • 左大括号必须和条件语句或else在同一行
  • 支持单行模式
  • 初始化语句中的变量为block级别,同时隐藏外部同名变量

    a := 1
        if a > 0 {
                fmt.Println("yes") //输出该结果
        }
        //加初始表达式
        if b := 2; a < b {
                fmt.Println("a<b")   //输出该结果
        }
        //加并行初始表达式
        if b, c := 0, 2; a > b && c > a {
                fmt.Println("a>b && c>a") //输出该结果
        }
        //同名变量外部将隐藏
        if a := 2; a > 0 {
                fmt.Println(a)  //输出2
        }
        fmt.Println(a)  //输出1

2 for

  • Go只有for一个循环语句关键字,但支持3种形式
  • 初始化和步进表达式可以是多个值
  • 条件语句每次循环都会被重新检查,因此不建议在条件语句中

    使用函数,尽量提前计算好条件并以变量或常量代替

  • 左大括号必须和条件语句在同一行
     i := 0
        //死循环
        for {
                fmt.Println("进入死循环,一般用break退出")
                break
        }
        //while循环
        for i < 10 {
                fmt.Println("相当于while循环")
                i++ //go中++只能出现在等式的左边,且没有++i这种
        }
        //正常for循环,并行赋值
        for i, j := 1, 2; i < 5; i++ {
                fmt.Println(i, j)
        }

3 switch

  • 可以使用任何类型或表达式作为条件语句
  • 不需要写break,一旦条件符合自动终止
  • 如希望继续执行下一个case,需使用fallthrough语句,使用后下一个case一定会执行不管条件是否满足
  • 支持一个初始化表达式(可以是并行方式),右侧需跟分号
  • 左大括号必须和条件语句在同一行
a := 0
        //普通的switch
        switch a {
        case 0:
                fmt.Println("0")
                fallthrough
        case 1: //此时这个case一定会执行
                fmt.Println("1")
        case 2: //不执行
                fmt.Println("2")
        default:
                fmt.Println("default")
        }
        //相当于if,case中一定要是条件
        switch {
        case 0 != 0:
                fmt.Println("0")
        case 1 > 2:
                fmt.Println("1")
        case 2 == 2:    //执行
                fmt.Println("2")
                fallthrough
        default:        //执行
                fmt.Println("default")
        }
        //带初始化表达式的switch
        switch a := 6; a {
        case 6:         //执行,switch中声明的变量会隐藏调外部变量
                fmt.Println(a)
        case 1:
                fmt.Println("1")
        case 2:
                fmt.Println("2")
        default:
                fmt.Println("default")
        }

4 goto,break,continue

  • 三个语法都可以配合标签使用
  • 标签名区分大小写,若不使用会造成编译错误
  • break与continue配合标签可用于多层循环的跳出
  • goto是调整执行位置,与其它2个语句配合标签的结果并不相同
     //label加continue
LABEL:
        for i := 0; i < 5; i++ {
                for {
                        fmt.Println("二层for", i) //输出5次
                        continue LABEL
                }
        }
        //label加break
LABEL1:
        for i := 0; i < 5; i++ {
                for {
                        fmt.Println("二层for", i)
                        break LABEL1
                }
        }
        //label加goto,如果不用count判断则是一个无限循环
        count := 0
LABEL2:
        if count > 2 {
                goto LABEL3
        }
        for i := 0; i < 5; i++ {
                for {
                        count++
                        fmt.Println("无限循环", count)
                        goto LABEL2
                }
        }
LABEL3:
        fmt.Println("over")