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 操作。
相关推荐
Zhao-Jichao14 分钟前
AI Prompting for Everyone 课程笔记 - 04 联网搜索资源 Web Search Sources
人工智能·笔记
纪念 22918 分钟前
C++ 算法(模拟)
开发语言·c++·算法
niucloud-admin26 分钟前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:评价列表
开发语言·php
Wang's Blog36 分钟前
Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计
java·开发语言·交友
金色光环39 分钟前
【DSP学习】C2000_PWM中断程序_笔记
笔记·单片机·学习
gz927cool1 小时前
Python 全栈应用最佳实践完整指南
开发语言·python·ai
東隅已逝,桑榆非晚1 小时前
AVL数实现
c++·笔记·学习·算法
摇滚侠1 小时前
《大模型是怎样跑起来的(轻科技)》硬件篇 阅读笔记
人工智能·笔记·科技
CoderYanger1 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
AIFQuant1 小时前
Python期货行情API接入:股指、黄金、原油多品种数据管道实战
开发语言·python·金融·区块链·量化开发