注册 登录

清河洛

go语言中的流程控制语句

qingheluo2021-09-02清河洛267
if语句if 布尔表达式 { //代码块 }else if 布尔表达式 { //代码块 }else{ //代码块 } 可以将变量初始化和变量逻辑运算写到一起 if val,err := func_name() ; err==nil{} 表示执行func_name()并将返回值赋值给val和err变量,然后判断err是否等于nil switch语句go语言中每个case分支不需要添加break,当然了,可以手动添加break来强制终止switch var1 { case val1: ... case val2,val3,val4: ...

if语句

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

可以将变量初始化和变量逻辑运算写到一起
if val,err := func_name() ; err==nil{}
表示执行func_name()并将返回值赋值给val和err变量,然后判断err是否等于nil

switch语句

go语言中每个case分支不需要添加break,当然了,可以手动添加break来强制终止

switch var1 {
    case val1:
        ...
    case val2,val3,val4:
        ...
    default:
        ...
}
var1和val1、val2、val3、val4可以是任何类型,但必须是相同的类型
可以同时有多个可能符合条件的值,使用逗号分割
只要有一个值和var1相同即可执行该分支

witch语句还可以被用于type-switch来判断某个变量类型

var a = "hello"
switch i := a.(type){
    case nil:
        fmt.Printf("a的类型是%T",i)
    case string:
        fmt.Printf("a的类型是string")
    ...
     default:
         fmt.Printf("未知类型")
}

fallthrough语句

swicth语句默认只会执行一个分支,但是使用fallthrough语句可以强制执行后面的case语句,无论下一条case的表达式结果是否为true

switch {
case false:
        fmt.Println("1、case 条件语句为 false")
        fallthrough
case true:
        fmt.Println("2、case 条件语句为 true")
        fallthrough
case false:
        fmt.Println("3、case 条件语句为 false")
        fallthrough
case true:
        fmt.Println("4、case 条件语句为 true")
case false:
        fmt.Println("5、case 条件语句为 false")
        fallthrough
default:
        fmt.Println("6、默认 case")
}
执行结果
2、case 条件语句为 true
3、case 条件语句为 false
4、case 条件语句为 true

select循环

select循环的结构和switch循环相似,不同的是select循环仅能用于通道相关操作

select {
    case 通道操作1:
        //代码
    case 通道操作2:
        //代码
    ...
    default:
        //代码
}

select循环会执行所有case分支后面的通道操作语句,执行语句的顺序为随机顺序,而不是代码的书写顺序

如果任意某个通道操作可以进行,就执行该case分支,其他分支被忽略

如果有多个通道操作都可以运行,Select会随机公平地选出一个case分支执行,其他分支被忽略

如果所有分支操作都阻塞,会执行default分支,如果没有default分支,select将阻塞,直到某个通道操作可以进行

for循环语句

常规的for循环语句

for init; condition; post { }

go语言中没有while循环,使用for代替while循环

for condition { }

可以省略condition语句创建一个无限循环:for {}

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

for key, value := range 变量 {
    //循环体
}

strings := []string{"hello", "world"}
for i, s := range strings {
    fmt.Println(i, s)
}
输出内容:
0 hello
1 world

流程控制语句

break语句

用于循环语句中跳出循环,并开始执行循环之后的语句

在多重循环中,可以用标记label标出想break的循环

re:
    for i := 1; i <= 3; i++ {
        fmt.Printf("i: %d", i)
        for i2 := 11; i2 <= 13; i2++ {
            fmt.Printf("i2: %d", i2)
            break re
        }
    }
如果不适用标记re,那么实际上应该是只推出内层循环,外层循环依然会继续循环下去
使用了标记re,那么就会直接退出标记指定的循环

continue 语句

在多重循环中,可以用标记 label 标出想 continue 的循环

re:
    for i := 1; i <= 3; i++ {
        fmt.Printf("i: %d", i)
        for i2 := 11; i2 <= 13; i2++ {
            fmt.Printf("i2: %d", i2)
            continue re
        }
    }
实际的输出
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11

goto 语句

Go语言的goto语句可以无条件地转移到过程中指定的行

goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能

但是,在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。

goto语句的格式

goto label;
..
.
label: statement;

LOOP: for a < 20 {
    if a == 15 {
         a++
         goto LOOP
    }
    fmt.Printf("a的值为 : %d", a)
    a++
}
以上代码当a为15时,a自增1后直接回到循环的开始语句LOOP处,所以不会打印15的值


网址导航