zoukankan      html  css  js  c++  java
  • 【go语言学习】流程控制

    流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。
    程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。

    • 顺序结构:从上向下,逐行执行。
    • 选择结构:条件满足,某些代码才会执行。0-1次
      分支语句:if,switch,select,goto
    • 循环结构:条件满足,某些代码会被反复的执行多次。0-N次
      循环语句:for

    一、条件语句

    1、if语句

    语法格式

    if 布尔表达式 {
        执行代码块
    }
    
    if 布尔表达式 {
        执行代码块
    } else {
        执行代码块
    }
    
    if 布尔表达式 {
        执行代码块
    } else if 布尔表达式 {
        执行代码块
    } else {
        执行代码块
    }
    

    if语句的特殊写法

    if 执行语句;布尔表达式 {
        执行代码块
    }
    
    2、switch语句

    switch是一个条件语句。

    switch v {
        case v1:
            执行代码块
        case v2:
            执行代码块
        default:
            执行代码块
    }
    

    switch 语句用于基于不同条件执行不同动作。
    每一个 case 分支都是唯一的,从上到下逐一测试,直到匹配为止。
    匹配成功后不会向下执行其他case分支,而是跳出整个switch。
    go语言中每一个匹配项后面不需要再加break。
    default语句可有可无,但是最多只能有一个。
    使用fallthrough可以强制执行下面的一个case分支。

    n := 10
    switch n {
        case 10:
            fmt.Println(10)
            fallthrough
        case 20:
            fmt.Println(20)
        case 30:
            fmt.Println(30)
        default:
            fmt.Println("啥也不是")
    }
    

    运行结果

    10
    20
    

    如果switch没有表达式,它会匹配true。

    score := 95
    switch {
        case score >= 90:
            fmt.Println("优秀")
        case score >= 80 && score < 90:
            fmt.Println("优良")
        case score >= 70 && score < 80:
            fmt.Println("良好")
        case score >= 60 && score < 70:
            fmt.Println("及格")
        default:
            fmt.Println("不及格!")
    }
    

    运行结果

    优秀
    

    一个case后面可以添加多个条件,以逗号分开。

    month := 8
    switch month {
        case 1, 3, 5, 7, 8, 10, 12:
            fmt.Println("31天")
        case 4, 6, 9, 11:
            fmt.Println("30天")
        case 2:
            fmt.Println("我也不知道啊")
        default:
            fmt.Println("没有的事儿~")
    }
    

    运行结果

    31天
    

    二、循环语句

    1、for语句

    所有的循环均可以通过for语句完成。

    for 表达式1(循环变量初始化); 表达式2(判断条件); 表达式3(更新循环变量) {
        循环体语句
    }
    
    for i := 0; i < 10; i++ {
        fmt.Printf("%v	", i)
    }
    

    运行结果

    0  1  2  3  4  5  6  7  8  9
    

    for循环变体
    for的表达式1、表达式2、表达式3三个均是可选的。
    for循环的循环变量初始化可以被忽略,但是循环变量初始化语句后的分号必须要写,例如:

    i := 0
    for ; i < 10; i++ {
        fmt.Printf("%v	", i)
    }
    

    for循环的循环变量初始化语句和更新循环变量语句都可以省略,例如:

    i := 0
    for i < 10 {
        fmt.Printf("%v	", i)
        i++
    }
    

    三个都省略,无限循环:

    i := 0
    for {
        fmt.Printf("%v	", i)
        i++
        if i == 10 {
            break
        }
    }
    

    for range
    Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律:

    • 数组、切片、字符串返回索引和值。
    • map返回键和值。
    • 通道(channel)只返回通道内的值。
    s := "hello 世界"
    for k, v := range s {
        fmt.Printf("%v-%v
    ", k, v)
    }
    

    运行结果

    0-h
    1-e
    2-l
    3-l
    4-o
    5- 
    6-世
    9-界
    
    2、break语句

    break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环。

    for i := 0; i < 10; i++ {
        fmt.Printf("%v	", i)
        if i == 5 {
            break
        }
    }
    

    运行结果

    0  1  2  3  4  5
    
    3、continue语句

    continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用。
    在 continue语句后添加标签时,表示开始标签对应的循环。

    label :
            for i := 0; i < 3; i++ {
                    for j := 0; j < 5; j++ {
                            fmt.Printf("i = %v	j = %v
    ", i, j)
                            if j == 2 {
                                    continue label
                            }
                    }
            }
    

    运行结果

    i = 0 j = 0
    i = 0 j = 1
    i = 0 j = 2
    i = 1 j = 0
    i = 1 j = 1
    i = 1 j = 2
    i = 2 j = 0
    i = 2 j = 1
    i = 2 j = 2
    

    三、goto语句

    goto:可以无条件地转移到过程中指定的行。

    for i := 0; i < 5; i++ {
        fmt.Println(i)
        if i == 3 {
            goto breakTag
        }
    }
    breakTag: 
        fmt.Println("循环结束")
    

    运行结果

    0
    1
    2
    3
    循环结束
    

    注意事项
    break、goto、return、panic语句都可以强制退出循环。但需要注意:

    • break是结束当前循环
    • goto结束整个循环,转移至指定行运行,只执行tag标签后面的语句
    • return结束整个函数,其后的语句都不再执行
    • panic结束整个程序,其后的语句都不再执行
    package main
    
    import "fmt"
    
    func main() {
    	for i := 0; i < 2; i++ {
    		for j := 0; j < 3; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				break
    			}
    		}
    	}
    	fmt.Println("hello")
    }
    

    运行结果

    0 0
    0 1
    1 0
    1 1
    hello
    
    package main
    
    import "fmt"
    
    func main() {
    	for i := 0; i < 2; i++ {
    		for j := 0; j < 3; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				goto breakTag
    			}
    		}
    	}
    	fmt.Println("hello")
    breakTag:
    	fmt.Println("循环结束")
    }
    

    运行结果

    0 0
    0 1
    循环结束
    
    package main
    
    import "fmt"
    
    func main() {
    	for i := 0; i < 2; i++ {
    		for j := 0; j < 3; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				return
    			}
    		}
    	}
    	fmt.Println("hello")
    }
    

    运行结果

    0 0
    0 1
    
    package main
    
    import "fmt"
    
    func main() {
    	for i := 0; i < 2; i++ {
    		for j := 0; j < 3; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				panic("系统崩溃了")
    			}
    		}
    	}
    	fmt.Println("hello")
    }
    

    运行结果

    0 0
    0 1
    panic: 系统崩溃了
    
    goroutine 1 [running]:
    main.main()
            E:/golang/go_project/main.go:10 +0x191
    exit status 2
    
  • 相关阅读:
    jq幻灯片2013-8-31
    jq设置样式
    KindEditor编辑器常用操作
    深入理解JavaScript模拟私有成员
    后台常见报错处理和注意问题(二)
    从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
    在MySQL中使用子查询和标量子查询的基本用法
    HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
    SQL中的cast()函数
    模糊搜索:concat各种函数详解、like操作符、通配符
  • 原文地址:https://www.cnblogs.com/everydawn/p/13872250.html
Copyright © 2011-2022 走看看