go理论知识——Go Channel 笔记 [特殊字符]

go理论知识------Go Channel 笔记 📝

1. 基本概念 🧠

1.1 Channel 是什么?

  • Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。
  • Channel 是类型安全的,意味着你只能发送和接收特定类型的数据。

1.2 Channel 的创建 🏗️

  • 使用 make 函数创建 Channel:
go 复制代码
  c := make(chan int)
  • 可以创建带缓冲的 Channel:
go 复制代码
  c := make(chan int, 3) // 缓冲区大小为 3

2. 无缓冲 Channel 🚫

2.1 无缓冲 Channel 的特性

  • 无缓冲 Channel 是同步的,发送和接收操作会阻塞,直到另一端准备好。

  • 示例代码:

    go 复制代码
    c := make(chan int)
    go func() {
        defer fmt.Println("goroutine 结束")
        fmt.Println("goroutine is running......")
        c <- 666
    }()
    num := <-c
    fmt.Println("num = ", num)

2.2 运行结果

  • Goroutine 会发送 666 到 Channel,主 Goroutine 会接收并打印这个值。

3. 带缓冲 Channel 🛠️

3.1 带缓冲 Channel 的特性

  • 带缓冲 Channel 是异步的,只有在缓冲区满时发送操作才会阻塞,只有在缓冲区空时接收操作才会阻塞。

  • 示例代码:

    go 复制代码
    c := make(chan int, 3)
    go func() {
        for i := 0; i < 3; i++ {
            c <- i
            fmt.Println("子go程正在运行,发送的元素:", i, " len(c) = ", len(c), " cap(c) = ", cap(c))
        }
    }()
    time.Sleep(2 * time.Second)
    for i := 0; i < 3; i++ {
        num := <-c
        fmt.Println("父go程正在运行,收到的元素:", num, " len(c) = ", len(c), " cap(c) = ", cap(c))
    }

3.2 运行结果

  • 子 Goroutine 会发送 3 个元素到 Channel,主 Goroutine 会接收并打印这些元素。

4. 关闭 Channel 🚪

4.1 关闭 Channel 的作用

  • 使用 close 函数关闭 Channel,关闭后不能再发送数据,但可以继续接收数据。

  • 示例代码:

    go 复制代码
    c := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            c <- i
        }
        close(c)
    }()
    for data := range c {
        fmt.Println(data)
    }

4.2 注意事项

  • 只有在没有任何数据需要发送时才关闭 Channel。
  • 关闭后的 Channel 不能再发送数据,但可以继续接收数据。

5. Select 语句 🔄

5.1 Select 语句的作用

  • select 语句用于在多个 Channel 操作中进行选择,类似于 switch 语句。

  • 示例代码:

    go 复制代码
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 6; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacii(c, quit)

5.2 运行结果

  • fibonacii 函数会生成斐波那契数列并通过 Channel 发送,直到接收到 quit 信号。

6. 总结 📌

  • Channel 是 Go 语言中非常重要的并发编程工具。
  • 无缓冲 Channel 是同步的,带缓冲 Channel 是异步的。
  • 使用 close 关闭 Channel,使用 select 处理多个 Channel 操作。
相关推荐
yi0112 分钟前
LeetCode 3. 无重复字符的最长子串|不定长滑动窗口:什么时候更新最大值?
笔记·python·算法·leetcode·双指针·滑动窗口
kyle~5 分钟前
C++ 智能指针:RAII、所有权与对象生命周期
开发语言·c++
Water_based9 分钟前
水性滚涂漆应用于滚喷机小五金件喷涂工艺详解
经验分享·笔记·产品经理
y1su9 分钟前
Leetcode 单调栈模板
java·开发语言·数据结构·算法·leetcode
2601_9628857215 分钟前
如何用 Python 计算索提诺比率和卡玛比率?
开发语言·python
郑州光合科技余经理22 分钟前
出海外卖平台:支付对接为什么要和下单收款分开
android·java·开发语言·前端·后端·php·ai编程
kimnoic29 分钟前
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
开发语言·python
苏辰澈32 分钟前
C++独属于自己的变身:多态
c语言·开发语言·c++·visualstudio·编辑器
谢亮_vipxieliang32 分钟前
PHP 异常处理全解析:try-catch、自定义异常与全局异常处理器
开发语言·php
外收内放35 分钟前
Python基础语法练习题(65)
开发语言·python