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 操作。
相关推荐
勉灬之3 分钟前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
whyTeaFo9 分钟前
GAMES101: Lecture 10: Geometry 1 (Introduction) ppt笔记
笔记
这是个栗子27 分钟前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
蓝创工坊Blue Foundry34 分钟前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
会飞的小新38 分钟前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
sulikey1 小时前
个人Linux操作系统学习笔记11 - 环境变量
linux·笔记·学习
大不点wow2 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
阿里嘎多学长2 小时前
2026-07-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
噢,我明白了2 小时前
Java中日期和字符串的处理
java·开发语言·日期
爱刷碗的苏泓舒2 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言