• golang流程控制



    1 if 条件判断

    整个语句没有标点符号

    • 只要出现if,那么{必须与之在同一行
    • 只要出现else,那么}必须与之在同一行

    因此为了确保不翻车,保持所有括号与关键字在同一行即可

    if 表达式1 {
        分支1
    } else if 表达式2 {
        分支2
    } else {
        分支3
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    另外,在条件判断表达式之前还能做一个变量赋值语句,比如 if score := 65; score >= 90 {

    2 switch case 多条件判断

    条件冒号

    case N:
    default:
    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("无效的输入!")
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3 for循环

    • for 语句; 条件; 语句 {
    • for; 条件; 语句 {
    • for 条件 {

    3.1 基本

    1. 左括号必须与关键字同一行
    for 初始语句; 条件表达式; 结束语句 {
        循环体语句
    }
    
    func forDemo() {
            for i := 0; i < 10; i++ {
                    fmt.Println(i)
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 初始语句可以被忽略,但是初始语句后的分号必须要写,此时分号后面的内容才被判定为条件
    for ; 条件表达式; 结束语句 {
        循环体语句
    }
    
    func forDemo2() {
            i := 0
            for ; i < 10; i++ {
                    fmt.Println(i)
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 初始语句和结束语句可以同时省略,两者同时省略时则没有分号,只剩一个条件
    for 条件表达式 {
        循环体语句
    }
    
    
    func forDemo3() {
            i := 0
            for i < 10 {
                    fmt.Println(i)
                    i++
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.2 无限循环

    可以通过breakgotoreturnpanic语句强制退出循环

    for {
        循环体语句
    }
    
    • 1
    • 2
    • 3

    3.3 break打断循环

    3.4 continue继续循环

    3.5 for range 遍历

    使用for range遍历数组、切片、字符串、map 及通道(channel)

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

    遍历二维数组a:for x, y := range a

    // 遍历数组
    func main() {
       a := [...]int{1, 3, 5, 7, 8}
       for x, y := range a {
          fmt.Printf("%v,%v \n", x, y)
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.6 实现99乘法表

    func main(){
            for i := 1; i < 10; i++ {
                    for j := 1; j < 10; j++ {
                            if i >= j {
                                    fmt.Printf("%v*%v=%v\t ", j, i, i*j)
                            }
                    }
                    fmt.Println()
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    \t 用于对齐

    不加\t的效果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OGdzkscc-1660041523111)(https://f0hdj04rkg.feishu.cn/space/api/box/stream/download/asynccode/?code=ZjI4NWY3MjdkZmZjNjFiZGUwNDM1N2Q5NmVmN2I0NjRfYTZzZ1U5bUhrTFJ1cWJlTHM3bDRiejhzQTJTT2R3aTFfVG9rZW46Ym94Y25Rb08xRXEwZ0lsVVRGemJHNVA2eGZlXzE2NTI3OTA0MTg6MTY1Mjc5NDAxOF9WNA)]

    \t的效果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZwhtAvZc-1660041523112)(https://f0hdj04rkg.feishu.cn/space/api/box/stream/download/asynccode/?code=YjRmNzA1MTkwZTA3ODAzZTZiZDNkYTk1YWI5NGQ1YzNfNnk4QXFXOUsxc1lvT0dtRklKMHF3dnRXaUJCaU1HQlJfVG9rZW46Ym94Y25BUFhtVE9qeW55WVR0aXNXYkVzdTZnXzE2NTI3OTA0MTg6MTY1Mjc5NDAxOF9WNA)]

    4 goto定点跳转

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

    比如:要求一旦j==2就跳出整个循环

    4.1 常规实现

    func main() {
       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
          }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.2 goto实现

    func main() {
       // var breakFlag bool
       for i := 0; i < 10; i++ {
          for j := 0; j < 10; j++ {
             if j == 2 {
                goto breakTag
             }
             fmt.Printf("%v-%v\n", i, j)
          }
       }
    // 跳出外层for
    breakTag:
       fmt.Println("结束for循环")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    emacs配置教程
    在欧美超过一半的购物者知道 FSC 标志
    Selenium上传文件有多少种方式?不信你有我全!
    Q-learning算法实战
    差分方程模型:国民总收入(GDP)的乘数-加速数模型
    迁移学习笔记4:ACML-Sinno Jialin Pan
    Python进阶:上下文管理器
    代码的坏味道(二)——为什么建议使用模型来替换枚举?
    Docker容器内时区相差8小时
    Spring Data Redis + RabbitMQ - 基于 string + hash 实现缓存,计数(高内聚)
  • 原文地址:https://blog.csdn.net/qq_35396734/article/details/126253596