Go语言流程控制

目录

  • 顺序控制
  • 分支控制
    • switch
  • 循环控制
    • for
    • break
    • continue
    • goto

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。

  • 顺序控制
  • 分支控制
  • 循环控制

顺序控制

程序从上到下逐行的执行,中间没有任何判断和跳转。

分支控制

让程序有选择的执行,分支控制有三种:

(1)单分支

if 条件表达式 {
    //执行代码块
}

(2)双分支

if 条件表达式 {
    //执行代码块
} else {
    //执行代码块
}

(3)多分支

if 条件表达式1 {
    //执行代码块
} else if 条件表达式2 {
    //执行代码块
} else {
    //执行代码块
}

注意:

(1) {}是必须有的,就算你只写一行代码;

(2) 条件表达式不需要小括号括起来

(3)块内声明的变量的作用域只在该块内

(4)golang支持在if中,直接定义一个变量

if age := 20; age > 18 {
    //代码块
}

(5)if语句的条件表达式不能是赋值语句

if b = false { //错误

}

(6)if语句的条件表达式的结果必须是bool值

n := 4
if n { //错误

}

switch

switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配位置。

匹配项后面也不需要再加break

基本语法:

switch 表达式 {
    case 表达式1,表达式2, ... :
        语句块
    case 表达式3,表达式4, ... :
        语句块
    case 表达式5:
        语句块
    default:
        语句块
}

流程图

  1. switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块,然后退出switch控制,如果一个都匹配不到,则执行default。
  2. default语句不是必须的。
  3. 如果switch的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块。执行后退出switch的控制。
  4. golang的case后的表达式可以有多个,使用逗号间隔。
  5. golang中的case语句块不需要写break,因为默认会有,即在默认情况下,当程序执行完case语句块后,就直接退出该switch控制结构。
  6. fallthrough:与下面的一个case条件属于逻辑或的关系,相等于给下面的一个case增加了一个逻辑或的条件

  7. case后面的各个表达式的值的数据类型,必须和switch的表达式数据类型一致
    package main
    
    import "fmt"
    
    func main() {
    
        var num1 int32 = 20
        var num2 int64 = 20
    
        switch num1 {
    
        case num2:
            fmt.Println("相等呢")
        case 30:
            fmt.Println("哈哈")
    
        }
    }
    //运行时报错
    invalid case num2 in switch on num1 (mismatched types int64 and int32)

    但是如果里面是一个数字,则可以的,因为数字本身是不带类型的

    package main
    
    import "fmt"
    
    func main() {
    
        var num1 int32 = 20
    
        switch num1 {
    
        case 20.0:
            fmt.Println("相等呢")
        case 30:
            fmt.Println("哈哈")
    
        }
    }
  8. golang中switch后面的表达式甚至不是必须的

  9. Type switch

    switch语句还可以被用于type-switch来判断某个interface变量中实际存储的变量类型。

    Type Switch语法格式如下:

    switch x.(type) {
     case type:
         statement(s);
        case type:
         statement(s);
         //你可以定义任意个数的case
        default: /*可选*/
         statement(s);
    }

    示例:

    package main
    
    import "fmt"
    
    func main() {
    
        var x interface{}
    
        switch i := x.(type) { //x.()格式是类型断言
        case nil:
            fmt.Printf("x 的类型是: %T", i)
        case int:
            fmt.Printf("x 的类型是: int")
        case float64:
            fmt.Printf("x的类型是: float64")
        case func(int) float64:
            fmt.Printf("x的类型是: func(int)")
        case bool, string:
            fmt.Printf("x的类型是: bool或string")
        default:
            fmt.Printf("未知型")
        }
    }
    //以上代码的执行结果为:
    x 的类型是: <nil>
  10. case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
  11. case后面的表达式如果是常量值(字面量),则要求不能重复
    package main
    
    import "fmt"
    
    func main() {
    
        var n1 int32 = 5
        var n2 int32 = 20
        var n3 int32 = 5
        switch n1 {
    
            case n2, 10, 5:
                fmt.Println("case1")
            case 5: //这里不允许重复出现数字5,但是如果我们把5替换成变量n3就不会报错
                fmt.Println("case2")
        }
    }
  12. switch后面也可以直接声明/定义一个变量,分号结束,不推荐
    switch grade := 90; {
        case grade > 90:
        fmt.Println("成绩优秀...")
        case grade >= 60 && grade <= 90:
        fmt.Println("成就优良")
        default:
        fmt.Println("不及格")
    }
  13. switch和if的比较

    如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型,建议使用switch语句,简洁高效。

    其他情况:对区间判断和结果为bool类型的判断,使用if,if使用的范围更广

循环控制

Go语言中的循环语句只支持for关键字,不支持while和do-where结构。

for

语法:

Go语言的for循环有三种形式,只有其中的一种使用分号。

  • 和C语言的for一样:

    for init; condition; post {}
  • 和C的while一样:
    for condition {}
  • 和C的for(;;)一样:
    for {}
    • init:一般为赋值表达式,给控制变量赋初值;
    • condition:关系表达式或逻辑表达式;循环控制条件
    • post:一般为赋值表达式,给控制变量增量或减量。

      for循环的range格式可以对slice、map、数组、字符串等进行迭代循环。格式如下:

      for key, value := range oldMap {
          newMap[key] = value
      }

在Go语言中,仅仅可以用一个for不加任何条件的执行循环,如果for循环内部没有break语句,它会一直循环下去

Go语言的关键字也可以实现其它编程语言里while的功能,比如定义一个变量a,当a>=20时就跳出循环,否则一直循环下去。

细节说明:

如果我们在遍历一个字符串时,字符串中含有中文,那么传统的遍历字符串方式for(i :=0; i<len(str);i++)是错误的,会出现乱码。原因是传统的对字符串的遍历是按照字节来遍历,而一个汉字在utf8编码是对应3个字节。

如何解决?

1.需要将str转成[]rune切片

2.对应for-range遍历方式而言,是按照字符方式遍历的。因此如果字符串中有中文,也是可以的。

break

break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch语句。break是跳出整个循环。

break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块。

package main

import "fmt"

func main() {

    //label1:
    for i := 0; i < 4; i++ {
        label2:
        for j := 0; j < 5; j++ {
            if j == 2 {
                //break  //break默认会跳出最近的循环
                //break label1;
                break label2;
            }
            fmt.Println("j = ", j)
        }
    }
}

continue

continue语句用于结束本次循环,继续执行下一次循环。

continue语句出现在多层嵌套的循环语句体中时,可以通过标签知名要跳过的是哪一层循环,这个和前面的break + 标签的使用规则一样。

goto

  • Go语言的goto语句可以无条件地转移到程序中指定的行。
  • goto语句通常与条件语句配合使用。可以用来实现条件转移,跳出循环体等功能。
  • 在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。

语法:

goto label

label: statement

示例:

package main

import "fmt"

func main() {

    fmt.Println(1);
    goto label1
    fmt.Println(2);
    fmt.Println(3);
    fmt.Println(4);

    label1:
    fmt.Println(5);
}
//输出结果
1
5

原文地址:https://www.cnblogs.com/itbsl/p/9855864.html

时间: 2024-07-30 04:11:57

Go语言流程控制的相关文章

黑马程序员-------------C语言流程控制-选择结构

流程控制 c语言中有3中结构控制程序运行1> 顺序结构:默认的流程结构,按照书写的顺序执行每一条语句2> 选择结构:对给定的条件进行判断,在根据判断结果来决定来执行哪一段代码3> 循环结构:在给定条件成立的情况下,反复执行某一段代码 1.选择结构 if语句 1>if的第一种结构 if(条件){//条件成立就会执行下面语句 语句1: 语句2: ....... } 例子: #include <stdio.h> int main (){ //人数 int cout = 0;

Go语言--流程控制

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码.降低重复代码而生的结构,属于扩展类的流程控制. 1.If else(分支结构) Go语言中if条件判断的格式如下: if 表达式1 { 分支1 } else if 表达式2 { 分支2 } else{ 分支3 } 当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3

黑马程序员——C语言——流程控制

流程控制内容主要由选择控制和循环控制组成. 一.选择控制 (一)if 选择结构 1.if(表达式) 语句1: 2.if(表达式) 语句1: else 语句2: 3.if(表达式) {  }  “{}”为作用域,里面可以放多个满足条件的语句 4.if-else if-else  只有一个表达式会被判断执行 代码举例: 1 int a = 6; 2 3 if (a++ > 10) // a == 7 4 { 5 printf("A\n"); 6 } 7 else if (a++ &g

07-C语言流程控制

一. 流程控制 l 顺序结构:默认的流程结构.按照书写顺序执行每一条语句. l 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码. l 循环结构:在给定条件成立的情况下,反复执行某一段代码. 二. 选择结构-if 1. 简单使用 l if (表达式)  语句1; u if(count>50)  开班;  上课; l if(表达式)  语句1;  else 语句2; u f(count>50)  开班;  else 不开班; l if(表达式)  {  } u if(count

C语言--流程控制

一.流程控制 1.顺序结构 *默认的流程结构,按照书写顺序执行每一条语句 2.选择结构 *对给定的条件进行判断,再根据判断结果来决定执行那一段代码 3.循环结构 *在给定条件成立的情况下,反复执行某一段代码 二.选择结构--if 1.使用方式 1> if(表达式) 语句1: * if(i>1)  恭喜你被黑马录取: 2> if(表达式) 语句1:else 语句2: * if(i>1) 恭喜你被黑马录取:else 希望你再接再厉: 3> if(表达式){} if(表达式){}

C语言流程控制

一.流程控制结构 (1)顺序结构:按书写顺序执行每一条语句. (2)选择结构:对给定的条件进行判断,根据判断结果决定执行哪一段代码. (3)循环结构:在给定条件成立的情况下,反复执行某一段代码. 二.选择结构-if (一)if简单使用 1) 第一种结构: a) 如果条件为真,就执行后面的语句,否则不执行. if(条件) { 语句1: 语句2: ···· } 2) 第二种结构: a) 如果条件成立就执行语句1,否则执行语句2. if(条件) { 语句1: } else { 语句2: } 3) 第三

[C语言]流程控制, 复合赋值, 循环

---------------------------------------------------------------------------------------- //单一判断 if(a < 0) { printf("小于0"); } //else if(a < 0) { printf("小于0"); } else { printf("不小于0"); } //if嵌套 if(a < 0) { if(a < -

Go语言流程控制01--选择结构之if

package main import "fmt" /* 字符串比大小 比首字符在字符集中出现的序号,首字符相同则比较第二个字符,以此类推 go的编译器默认使用UTF8字符集 在UTF8字符集中数字出现的顺序为:0123456789 */ func main031() { fmt.Println("0">"9") fmt.Println("012">"011") fmt.Println(&quo

Go语言流程控制06--猜数字游戏

package main import ( "fmt" "math/rand" "time" ) /* ·随机生成一个三位数 ·让用户输入其猜想 ·反馈给用户:猜大了,猜小了,猜对了 ·如果没猜对就继续猜 ·如果猜对了就退出游戏 ·如果用户输入"-1"就直接退出游戏 */ func GetRandom() int { /*获得随机数*/ //n := rand.Intn(1000) //当前时间距离1970年0时所逝去的时间纳