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 操作。
相关推荐
阿巴Jun12 分钟前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
鹿鹿学长16 分钟前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
zhousenshan24 分钟前
Python爬虫常用框架
开发语言·爬虫·python
茯苓gao26 分钟前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾39 分钟前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT1 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J2 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin2 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全
耶啵奶膘2 小时前
uni-app头像叠加显示
开发语言·javascript·uni-app
看海天一色听风起雨落2 小时前
Python学习之装饰器
开发语言·python·学习