GO语言语法基础3 —— 控制流 | 青训营

149 阅读4分钟

合理的使用各种结构,会极大地提升代码的可读性和灵活性。

一、if-else 选择结构

GO语言的if-else 写法类似于C和C++,但是有不同:

不同点1:if后面没有括号,如果你写括号的话,那么在保存时你的编译器会自动帮你去掉。

不同点2:GO语言的if,它后面必须接大括号,简而言之就是不能像C和C++一样把if里的语句写成一行。

package main
import "fmt"

func main() {

	if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

	if 8%4 == 0 {
		fmt.Println("8 is divisible by 4")
	}

	if num := 9; num < 0 {
		fmt.Println(num, "is negative")
	} else if num < 10 {
		fmt.Println(num, "has 1 digit")
	} else {
		fmt.Println(num, "has multiple digits")
	}
}

- 1. if语句只需要一个条件表达式,如果条件为真,将执行if语句块中的代码。

if condition {
    // 条件为真时执行的代码
}

- 2. 如果需要在条件为假时执行一段代码,可以使用if-else语句。

if condition {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

- 3. 当有多个条件需要判断时,可以使用if-else if-else链。

if condition1 {
    // 条件1为真时执行的代码
} else if condition2 {
    // 条件2为真时执行的代码
} else {
    // 所有条件都为假时执行的代码
}

- 4. 特殊情况下,可以在if语句之前添加一个简单的语句,用于初始化局部变量。这些变量的作用域仅局限于if语句块中。

if initialization; condition {
    // 初始化操作
    // 如果条件为真,执行的代码
}

- 5. 在Go语言中,条件表达式的结果必须是一个布尔值(true或false)。

- 6. 在if语句中可以使用逻辑运算符(&&、||、!)来组合和取反条件。

- 7. 可以使用比较运算符(==、!=、<、>、<=、>=)进行条件比较。

- 8. if-else结构可以嵌套使用,但要注意保持正确的代码缩进,以提高可读性。

二、循环结构

循环结构用于重复执行一段代码块,直到满足特定条件为止。通过合理使用循环结构,您可以实现重复执行代码的逻辑,并在满足特定条件时终止循环。

在Go语言中,常用的循环结构有for循环和range循环:

package main
import "fmt"

func main() {

	i := 1
	for {
		fmt.Println("loop")
		break
	}
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

	for n := 0; n < 5; n++ {
		if n%2 == 0 {
			continue
		}
		fmt.Println(n)
	}
	for i <= 3 {
		fmt.Println(i)
		i = i + 1
	}
}

1. for循环:for循环是最基本的循环结构,在每次循环迭代时都会检查条件。它的形式如下:

for 初始语句; 条件表达式; 后续语句 {
    // 循环体代码块
}

其中:

  • 初始语句:用于初始化循环变量。

  • 条件表达式:在每次循环迭代开始前进行判断,如果为真,则执行循环体;如果为假,则跳出循环。

  • 后续语句:在每次循环迭代结束后执行,通常用于更新循环变量的值。

  • eg:

for i := 0; i < 5; i++ {
    // 执行循环体代码块,重复5次
}

2. range循环:range循环用于遍历数组、切片、映射或通道中的元素。它的形式如下:

for 索引, 值 := range 集合 {
    // 循环体代码块
}

其中:

  • 索引:可选参数,表示元素在集合中的索引或键。
  • :表示集合中的元素值。

eg:

numbers := []int{1, 2, 3, 4, 5}

for index, value := range numbers {
    // 处理索引和值
}

三、SWITCH分支结构

让我们先看一个读取当前时间的代码:

package main
import (
	"fmt"
	"time"
)

func main() {

	a := 2
	switch a {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	case 4, 5:
		fmt.Println("four or five")
	default:
		fmt.Println("other")
	}

	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("It's before noon")
	default:
		fmt.Println("It's after noon")
	}
}

当需要根据不同的条件执行不同的代码块时,可以使用Go语言中的switch结构switch结构提供了一种更简洁和易读的方法来实现多分支条件判断。

switch语法结构:

switch 表达式 {
case1:
    // 表达式等于值1时执行的代码
case2:
    // 表达式等于值2时执行的代码
...
default:
    // 所有 case 都不匹配时执行的代码
}

1. switch表达式可以是任何类型,包括基本类型(如整数、字符、字符串)和复合类型(如数组、切片、结构体)。

2. 每个 case 后面的值与表达式进行比较,如果匹配,则执行对应case的代码块。如果找到匹配的case,将执行该case并跳出switch结构,不会继续匹配其他case

3. 如果没有匹配的case,将执行default块中的代码。default语句是可选的,并且可以放在switch结构的任意位置。

4. 使用 fallthrough 关键字可以使程序继续执行下一个case的代码块。注意fallthrough不会判断后续的case条件是否满足,因此需要小心使用。

5. switch结构可以不带表达式,用于处理复杂的条件判断。这种情况下,每个case中的条件表达式应该是布尔类型,并通过true/false控制执行的代码块。

6. 使用该结构时,不同的case之间不需要使用break关键字来跳出。在执行完对应代码块后,自动跳出 switch结构。

7. 可以在case中使用多个值,用逗号分隔。如果表达式与任何一个值匹配,则执行代码块。