【Golang】语法基础——控制结构(条件语句和循环)

🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。



1. 简介

Go 语言提供了多种控制结构,包括条件语句和循环结构,用于控制代码的执行流程。本文将详细介绍 Go 语言中的条件语句和循环结构,并结合示例代码展示其使用方法。

2. 条件语句

2.1 if 语句

if 语句用于根据条件表达式的结果(true 或 false)执行代码块。

if condition {
    // 条件为 true 时执行
}

示例:

x := 10
if x > 5 {
    fmt.Println("x 大于 5")
}

2.2 if-else 语句

if-else 语句在条件表达式为 false 时执行另一个代码块。

if condition {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}

示例:

y := 3
if y > 5 {
    fmt.Println("y 大于 5")
} else {
    fmt.Println("y 不大于 5")
}

2.3 嵌套的 if 语句

if 语句可以嵌套在其他的 ifelse 语句中。

if condition1 {
    if condition2 {
        // 条件1和条件2均为 true 时执行
    }
}

示例:

z := 10
if z > 5 {
    if z < 15 {
        fmt.Println("z 在 5 和 15 之间")
    }
}

2.4 带有简短语句的 if

if 语句中可以包含一个简短的语句,该语句在条件判断之前执行。

if v := computeValue(); v < threshold {
    // v 在整个 if 语句块中可用
}

示例:

if num := 10; num%2 == 0 {
    fmt.Println(num, "是偶数")
}

2.5 switch 语句

switch 语句用于多条件分支选择,比多个 if-else 语句更简洁。

2.5.1 简单 switch 语句
switch value {
case case1:
    // 当 value == case1 时执行
case case2:
    // 当 value == case2 时执行
default:
    // 当没有匹配的 case 时执行
}

示例:

day := "Monday"
switch day {
case "Monday":
    fmt.Println("今天是星期一")
case "Tuesday":
    fmt.Println("今天是星期二")
default:
    fmt.Println("今天不是星期一或星期二")
}
2.5.2 带表达式的 switch

switch 后可以跟一个表达式,所有 case 语句中的表达式与其比较。

switch expr {
case expr1:
    // 当 expr == expr1 时执行
case expr2:
    // 当 expr == expr2 时执行
}

示例:

num := 5
switch {
case num < 0:
    fmt.Println("负数")
case num == 0:
    fmt.Println("零")
default:
    fmt.Println("正数")
}
2.5.3 没有表达式的 switch

没有表达式的 switch 等同于 switch true,常用于代替多个 if-else

示例:

age := 20
switch {
case age < 18:
    fmt.Println("未成年人")
case age >= 18 && age < 60:
    fmt.Println("成年人")
default:
    fmt.Println("老年人")
}
2.5.4 fallthrough 语句

fallthrough 用于强制执行下一个 case 代码块,不论条件是否匹配。

示例:

num := 1
switch num {
case 1:
    fmt.Println("一")
    fallthrough
case 2:
    fmt.Println("二")
}

输出:

一
二
2.5.5 类型 switch

类型 switch 用于根据接口类型的具体类型分支执行。

示例:

var x interface{} = 3.14
switch x.(type) {
case int:
    fmt.Println("x 是 int 类型")
case float64:
    fmt.Println("x 是 float64 类型")
default:
    fmt.Println("未知类型")
}

3. 循环结构

3.1 for 循环

Go 语言中唯一的循环结构是 for 循环,可以用来实现各种循环。

3.1.1 基本形式

for 循环的基本形式由三个部分组成:初始化语句、条件表达式和后置语句。

for initialization; condition; post {
    // 循环体
}

示例:

for i := 0; i < 10; i++ {
    fmt.Println(i)
}
3.1.2 省略初始语句和后置语句

可以省略初始语句和后置语句,使用更灵活的控制。

i := 0
for i < 10 {
    fmt.Println(i)
    i++
}
3.1.3 省略条件表达式

省略条件表达式时,for 循环变为无限循环,需配合 break 语句使用。

for {
    // 无限循环
    break // 必须有跳出循环的条件
}

示例:

for {
    fmt.Println("无限循环")
    break
}

3.2 for-range 循环

for-range 循环用于迭代数组、切片、字符串、映射和通道。

3.2.1 遍历数组和切片
nums := []int{1, 2, 3}
for index, value := range nums {
    fmt.Println(index, value)
}
3.2.2 遍历字符串
str := "Hello"
for index, char := range str {
    fmt.Printf("%d:%c\n", index, char)
}
3.2.3 遍历映射

在 Go 中,for-range 语句可以用于遍历映射(map),获取键和值。

m := map[string]int{"one": 1, "two": 2, "three": 3}
for key, value := range m {
    fmt.Println(key, value)
}

在此示例中,每次迭代中 keyvalue 分别表示映射的键和值。

3.2.4 遍历通道

可以使用 for-range 语句遍历从通道(channel)接收的值,直到通道关闭。

ch := make(chan int, 5)
go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}()

for value := range ch {
    fmt.Println(value)
}

在此示例中,循环遍历通道 ch 中的所有值,直到通道被关闭。

3.3 循环控制

3.3.1 break 语句

break 语句用于提前终止循环。

for i := 0; i < 10; i++ {
    if i == 5 {
        break
    }
    fmt.Println(i)
}

i 等于 5 时,循环终止。

3.3.2 continue 语句

continue 语句用于跳过当前循环的剩余部分,继续下一次迭代。

for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue
    }
    fmt.Println(i)
}

该示例只打印奇数,因为 continue 跳过了偶数的迭代。

3.3.3 goto 语句

goto 语句用于跳转到同一函数内的指定标签(label)。

for i := 0; i < 10; i++ {
    if i == 5 {
        goto end
    }
    fmt.Println(i)
}
end:
    fmt.Println("循环终止")

i 等于 5 时,程序跳转到 end 标签处执行。

4. 示例代码

在这一部分,提供一系列代码示例,演示如何使用 Go 语言中的条件语句和循环结构。包括常见用例,如遍历数据结构、条件判断等。

package main

import "fmt"

func main() {
    // if-else 语句示例
    num := 10
    if num > 0 {
        fmt.Println("正数")
    } else {
        fmt.Println("负数或零")
    }

    // switch 语句示例
    day := "Monday"
    switch day {
    case "Monday":
        fmt.Println("今天是星期一")
    case "Tuesday":
        fmt.Println("今天是星期二")
    default:
        fmt.Println("今天不是星期一或星期二")
    }

    // for 循环示例
    for i := 0; i < 3; i++ {
        fmt.Println(i)
    }

    // for-range 遍历切片
    fruits := []string{"apple", "banana", "cherry"}
    for index, fruit := range fruits {
        fmt.Printf("%d: %s\n", index, fruit)
    }

    // break 语句示例
    for i := 0; i < 5; i++ {
        if i == 3 {
            break
        }
        fmt.Println(i)
    }

    // continue 语句示例
    for i := 0; i < 5; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Println(i)
    }

    // goto 语句示例
    for i := 0; i < 5; i++ {
        if i == 2 {
            goto label
        }
        fmt.Println(i)
    }
label:
    fmt.Println("跳转到标签处")
}

5. 总结

本文详细介绍了 Go 语言中的条件语句(if, if-else, switch)和循环结构(for, for-range),包括如何使用 breakcontinuegoto 控制循环的流程。通过示例代码展示了这些控制结构的实际应用。掌握这些基本语法结构对于编写高效和可维护的 Go 代码至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值