Go基础之流程控制语句 | 青训营

71 阅读6分钟

流程控制语句

与其他编程语言一样,使用Go语言的编程者需要通过流程控制语句来控制程序的逻辑走向和执行次序。
流程控制语句主要包括:条件判断语句(if和switch)、循环控制语句(for、break和continue)和跳转语句(goto)。

if判断

Go语言中,通过if关键字构成的条件判断语句进行条件判断,格式如下:

if 表达式1 {
    分支1
} else if 表达式2 {
    分支2
} else {
    分支3
}

当表达式1的执行结果为true时,执行分支1,否则对表达式2的执行结果进行判断;若表达式2的结果为true,执行分支2;如果都不满足,则执行分支3。
当然,可以只存在表达式1,else if和else语句都是可选的。
注意: 表达式后跟的左括号必须与表达式放在同一行中,否则程序在编译时将会触发错误, 导致程序编译无法通过。
同理,else if和else语句后跟的左括号也必须和对应表达式处在同一行。另外,if、else if和else 分支中对应的右括号可以另外换行,也可以与对应的左括号处在同一行。

package main
import "fmt"

func main(){
    a := 100
    if a > 99 {
        fmt.Println("a > 99")
    } else if a == 99 {
        fmt.Println("a == 99")
    } else {
        fmt.Println("a < 99")
    }
}

执行结果:

a > 99

if还有一种较为常见的写法,就是在if的表达式前添加一个语句,使用变量接收语句返回的值,通过对该变量的判断再选择执行的分支。

package main
import (
    "runtime"
    "fmt"
)

func main(){
    if num := runtime.NumCPU(); num >=1 {
	fmt.Println("当前程序使用CPU核数:",num)
    }
}

以上程序引入了runtime包,使用NumCPU()函数获取了程序使用的CPU核数并传递给num变量。
执行结果:

当前程序使用CPU核数: 16

注意: 由于是在if表达式前定义num变量,num变量的作用域仅限于该分支中,程序的执行结果与宿主机的配置有关。

宿主机
宿主机(Host)是指运行虚拟化软件(如虚拟机管理程序或容器引擎)并提供虚拟化环境的物理计算机。宿主机通常是具有较高计算能力和资源的服务器,可以同时运行多个虚拟机或容器,并通过虚拟化技术将计算资源进行隔离和管理。

宿主机负责管理和分配资源给虚拟机或容器,包括处理器、内存、存储和网络等。宿主机还提供一些管理功能,如虚拟机或容器的创建、启动、停止和销毁,以及资源的监控和调整等。

虚拟机或容器运行在宿主机上,它们共享宿主机的物理资源,但彼此之间是相互隔离的。每个虚拟机或容器都被视为一个独立的操作系统实例,并可以运行自己的应用程序和服务。通过虚拟化技术,宿主机可以更高效地利用硬件资源,提高计算资源的利用率和灵活性。

需要注意的是,宿主机是指运行虚拟化软件的物理计算机,而虚拟机或容器则是在宿主机上创建的独立运行环境。虚拟化技术可以在宿主机上同时运行多个虚拟机或容器,每个虚拟机或容器都有自己的操作系统和应用程序。这样可以实现资源的隔离和高效利用,提供更好的部署和管理方式。

for循环

Go语言中的循环逻辑通过for关键字实现。不同于其他编程语言,Go语言没有while关键字,不存在while循环。

for循环格式如下:

for 初始语句;条件表达式;赋值表达式 {
    循环体
}

循环体中代码会不断地被执行,直到条件表达式的结果为false,程序才会继续执行for循环之后的程序代码。
其中,初始语句、条件表达式和赋值表达式都是可选的。

package main
import "fmt"

func main(){
    for i := 1; i < 5; i++ {
        fmt.Print(i," ")
    }
}

执行结果:

1 2 3 4

break跳出循环

break语句可以用来结束for循环,而且可以在语句后面添加标签,表示退出标签对应的代码块逻辑。
注意: break语句如果不带标签,则默认跳出最内层的for循环。

package main
import "fmt"

func main(){
    i := 1
    for {
        for {
            if i > 5 {
               fmt.Println("跳出内层for循环")
               break
            }
            fmt.Println(i) 
            i++
        }
        fmt.Println("跳出外层for循环")
        break
    }
}

执行结果:

1
2
3
4
5
跳出内层for循环
跳出外层for循环

我们也可以使用带标签的break语句,直接跳出最外层的for循环:

package main
import "fmt"

func main(){
    i := 1
    outloop:
    for {
        for {
            if i > 5 {
                break outloop
            }
            fmt.Println(i) 
            i++
        }
    }
}

执行结果:

1
2
3
4
5

continue继续循环

continue语句可以立即结束当前循环体中的逻辑,开始下一次循环。和break语句类似,continue语句后也可跟标签,表示开始标签所对应的循环。

package main
import "fmt"

func main(){
    outerLoop:
    for i := 0; i < 2; i++ {
        for j := 0; j < 3; j++ {
            if j == 1 {
                fmt.Println(i,j)
                continue outerLoop
            }
        }
    }
}

执行结果:

0 1
1 1

switch分支

switch语句常用于基于大量不同条件来执行不同动作,每一个条件对应一个case分支。
switch语句的执行过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。
每一个switch语句只能包含一个可选的default分支,若没有找到匹配项,会默认执行default分支中的代码块。

Go语言中的switch语法如下:

switch var1 {
    case value1:
        代码块1
    case value2:
        代码块2
    default:
        代码块3
}

变量var1可以是任何类型,但value1和value2必须是相同的类型或最终结果为相同类型的表达式。每个case分支后可跟多个可能符合条件的值,使用逗号分隔它们,例如:case value1,value2,value3。

package main
import "fmt"

func main(){
    switch 1 + 1 {
        case 1:
            fmt.Println("1 + 1 = 1")
        case 2:
            fmt.Println("1 + 1 = 2")
        case 3:
            fmt.Println("1 + 1 = 3")
        default :
            fmt.Println("1 + 1 != 1 或 2 或 3")
    }
}

执行结果:

1 + 1 = 2

默认情况下,switch匹配成功后就不会执行后续其他case,如果我们需要无条件强制执行后面的 case,可以使用fallthrough关键字。

switch {
    //false,肯定不会执行
    case false: 
        fmt.Println("case 1为false")
        fallthrough
    //true,肯定执行
    case true: 
        fmt.Println("case 2为 true")
        fallthrough
    //由于上一个case中有fallthrough,即使是false,也强制执行
    case false: 
        fmt.Println("case 3为 false")
        fallthrough
    default:
        fmt.Println("默认 case")
}

执行结果:

case 2true
case 3false
默认 case

上述示例中,switch语句省略了条件表达式,表达式由下面的case给出。

goto跳转语句

goto语句用于代码间的无条件跳转,格式如下:

goto 标签名
package main
import "fmt"

func main(){
    fmt.Println("Hello")
    goto sign
    fmt.Println("无效")
    sign:
        fmt.Println("world")
}

执行结果:

Hello
world

一般情况下,在程序中不建议使用goto语句,过多的goto语句会破坏程序结构,使程序的可读性变差。

小结

  • Go语言的流程控制语句主要包括:条件判断语句(if和switch)、循环控制语句(for、break和continue)和跳转语句(goto)。

  • Go语言中的循环逻辑通过for关键字实现,不存在while循环。

  • switch语句常用于基于大量不同条件来执行不同动作,每一个条件对应一个case分支。

  • 一般情况下,在程序中不建议使用goto语句,过多的goto语句会破坏程序结构,使程序的可 读性变差。