当前位置 博文首页 > Golang学习笔记(三):控制流

    Golang学习笔记(三):控制流

    作者:admin 时间:2021-02-15 21:02

    控制结构分为: 条件+选择+循环

    IF

    1.说明

    复制代码 代码如下:

    条件表达式没有括号
    支持一个初始化表达式(可以是多变量初始化语句)
    初始化语句中定义的都是只能在block级别中使用的局部变量,不能在block之外使用
    左大括号必须和条件语句在同一行(必须与if/else在同一行)
    go没有三元运算符

    if判断语句条件不需要括号
    在判断语句里卖弄允许声明一个变量,其作用域只在逻辑块内,其他地方不起作用
    花括号一定存在,且必须与if/else在同一行

    2.语法

    复制代码 代码如下:

    //基本
    if a > 0 {  //无括号
         dosomething()
    } else if a == 0 { //必须用花括号
         doothertings()
    } else {
         donothing()
    }

    //单行模式
    if a > 0 { a += 100 } else { a -= 100 }

    3.示例

    复制代码 代码如下:

    package main

    func main(){
        a := 10

        if a > 0 {
            a += 100
        } else if a == 0 {
            a = 0
        } else {
            a -= 100
        }
        println(a)

        b := 101
        if b > 0 { b += 100 } else { b -= 100 }
        println(b)
    }

    //支持一个初始化语句
    if a:=1; a<10 { //允许在条件之前执行一个简单语句,由此语句定义的变量作用域仅在if/else范围内
        return a
    }
    if a, b := 1,2; a+b == 10 {
    }

    if x := computedValue(); x > 10 {
    } else {
    }

    4.结果

    复制代码 代码如下:

    110
    201

    注意,在有返回值的函数中,不允许将“最终的”return语句放到if ... else ... 结构中,否则编译失败

    复制代码 代码如下:

    func example(x int) int {
        if x == 0 {
            return 5
        } else {
            return x
        }
    }

    FOR

    for是go的"while", 只支持for关键字.有三种形式

    1.语法

    复制代码 代码如下:

    for init; condition; post {
        //init不支持逗号,只能平行赋值
        //condition每次循环开始都会检查,不建议在里面使用函数,建议用计算好的变量/常量代替
        //post后面必须跟花括号,每轮循环结束的时候调用
    }

    for i:=0; i<10; i++ {
    }

    -----------------------------

    for condition {
        dosomething()
    }

    i:=1
    for i<10 {
    }

    -----------------------------

    for { //无限循环
        dosomething()
    }

    for {
        a++
        if a > 10 {
            break
        }
    }

    -----------------------------

    2.说明

    复制代码 代码如下:

    a. 初始化和步进表达式可以使多个值:必须使用平行赋值
        i, j:=0,len(a)-1; i<j; i,j=i+1,j-1
    b.每次循环都会重新检查条件表达式

    3.示例

    复制代码 代码如下:

    package main

    func main(){
        ss := "abcd"
        for i:=0; i<len(ss); i++ {
            println(ss[i])
        }
    }


    得到:
    复制代码 代码如下:

    97
    98
    99
    100

    4.配合range

    for循环和保留字range一起使用,完成迭代器iterator操作

    string, array, slice, map, channel都可以用range进行迭代器操作

    range返回序号和值,若是不想要,可以用_

    复制代码 代码如下:

      for i, c := range "abc" {
          fmt.Printf("s[%d] = %c\n", i, c)
      }

    得到
    复制代码 代码如下:

      s[0] = a
      s[1] = b
      s[2] = c

    SWITCH

    python里面没有

    1.语法

    支持初始化表达式

    复制代码 代码如下:

    switch a:=5; a { //默认break,匹配成功后不会自动向下执行其他case,而是跳出整个switch
        case 0:         //普通
            println(a)
        case 1, 2:      //多个分支,逗号分隔
            println(a)
        case 100:       //什么都不做
        case 5:
            println(a)
            fallthrough   //进入后面的case 进行处理,而不是跳出block
        default:
            println(a)    //默认
    }
    注意,不需要break来明确退出一个case,一旦条件符合,自动终止,除非使用fallthough

    --------------

    可以不带表达式
    switch sExpr {
            case expr1: //sExpr和expr1必须类型一致,不限制为常量或者证书,可以用任何类型或表达式
                ...
    }

    switch {
        case 0 <= Num && Num <= 3:
            fmt.Printf("3")
    }

    几种形式:

    复制代码 代码如下:

    a := 1
    switch a {
        case 0:
            ...
    }

    a := 1
    switch {
        case a>=0:
            ....
        case a>1:
            ....
    }

    switch a:=1; {
        case a>=0:
            ...
        case a>1:
            ...
    }


    2.替代if...else if…else…

    不指定switch 条件表达式(没有条件表达式,在case语句中有),或者直接为true

    复制代码 代码如下:

      a := 5
      switch {     //两句可合并位 switch a:=5; {
          case a > 1:
              println("a")
          case a > 2:
              println("b")
          default:
              println("c")
      }
     

    goto break continue

    均可配合标签使用(标签区分大小写,若声明了没有使用会导致编译错误)

    break/continue可配合标签用于多重循环跳出
    goto是调整执行位置,与其他两个执行结果并不相同

    1.goto

    支持函数内部goto跳转

    请善用

    必须跳转到当前函数内定义的标签,标签名大小写敏感

    复制代码 代码如下:

    func myFunc() {
        i := 0
    Here:
        println(i)
        i++
        goto Here
    }

    2.continue

    进入下一次循环

    3.break

    终止循环

    复制代码 代码如下:

    for index := 10; index > 0; index -- {
        if index == 5 {
            break //continue
        }
    }

    示例
    复制代码 代码如下:

    package main
    func main(){
        a := 1
        LABEL1:
            println("inc a=", a)
            a += 1

        LABEL2:
            //println("here")

        for ; a < 6; {
            println(a)
            if a == 3 {
                a += 1
                continue LABEL2
            }
            if a == 5 {
                break
            }
            goto LABEL1
        }
    }

    结果:

    复制代码 代码如下:

    inc a= 1
    2
    inc a= 2
    3
    4
    inc a= 4
    5

    js
下一篇:没有了