【Golang】switch 语句和select 语句有什么区别?

switch 语句和 select 语句是 Go 语言中的两种不同的控制流语句,它们有以下区别:

  1. 用途不同:switch 语句用于根据不同的条件执行不同的代码块,而 select 语句用于在多个通信操作中选择一个可执行的操作。

  2. 表达式不同:switch 语句的条件表达式可以是任意类型的,而 select 语句的条件表达式只能是通信操作。

  3. 执行方式不同:switch 语句会按顺序执行每个条件分支,直到找到匹配的分支并执行其中的代码块,而 select 语句会从多个通信操作中选择一个可执行的操作并执行,如果有多个操作可执行,则随机选择一个执行。

  4. 阻塞行为不同:switch 语句不会阻塞,它会立即执行匹配的分支,而 select 语句会在所有操作都阻塞时才会阻塞,直到有一个操作可执行为止。

下面是一个示例,演示了 switch 语句和 select 语句的不同之处:

func main() {
    num := 2

    switch num {
    case 1:
        fmt.Println("num 是 1")
    case 2:
        fmt.Println("num 是 2")
    default:
        fmt.Println("num 是其他值")
    }

    ch1 := make(chan int)
    ch2 := make(chan int)

    select {
    case <-ch1:
        fmt.Println("从 ch1 读取到数据")
    case <-ch2:
        fmt.Println("从 ch2 读取到数据")
    default:
        fmt.Println("没有可执行的操作")
    }
}

输出结果为:

num 是 2
没有可执行的操作

这段代码创建了两个整型通道 ch1ch2。通道是用于在 Go 语言中进行协程间通信的一种机制。

在这段代码中,make(chan int) 创建了一个无缓冲的整型通道。无缓冲的通道意味着通道的发送和接收操作是同步的,即发送操作会阻塞直到有接收者准备好接收数据,接收操作会阻塞直到有发送者准备好发送数据。

你可以使用这两个通道来进行协程间的数据传递,例如:

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        ch1 <- 10 // 向 ch1 发送数据
    }()

    go func() {
        data := <-ch1 // 从 ch1 接收数据
        ch2 <- data  // 向 ch2 发送数据
    }()

    result := <-ch2 // 从 ch2 接收数据
    fmt.Println(result) // 输出结果为 10
}

在这个示例中,我们创建了两个协程,第一个协程向 ch1 发送数据,第二个协程从 ch1 接收数据并将其发送到 ch2,最后我们从 ch2 接收数据并打印出来。

通过通道的发送和接收操作,我们可以实现协程之间的同步和数据共享,从而实现并发编程。

相关推荐

  1. 【Golang】switch 语句select 语句什么区别

    2024-03-31 16:40:09       35 阅读
  2. C语言字符串字符数组什么区别

    2024-03-31 16:40:09       36 阅读
  3. C语言C++实现Stack什么区别

    2024-03-31 16:40:09       43 阅读
  4. C语言形参实参什么区别

    2024-03-31 16:40:09       30 阅读
  5. 【GoLang基础】select语句什么

    2024-03-31 16:40:09       35 阅读
  6. 条件循环语句哪些?语法区别

    2024-03-31 16:40:09       34 阅读
  7. C语言C++实现栈Stack的对比,什么区别

    2024-03-31 16:40:09       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 16:40:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 16:40:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 16:40:09       82 阅读
  4. Python语言-面向对象

    2024-03-31 16:40:09       91 阅读

热门阅读

  1. RM雷达站数据集汇总&雷达站开源

    2024-03-31 16:40:09       38 阅读
  2. 计算机网络面试题

    2024-03-31 16:40:09       40 阅读
  3. sed语句应用

    2024-03-31 16:40:09       35 阅读
  4. python编程练习

    2024-03-31 16:40:09       34 阅读
  5. 卷积神经网络(Pytorch 08)

    2024-03-31 16:40:09       30 阅读
  6. 为什么索引的底层结构是B+树

    2024-03-31 16:40:09       39 阅读
  7. 【C++】std::set_new_handler使用场景

    2024-03-31 16:40:09       39 阅读