欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > go理论知识——Go Channel 笔记 [特殊字符]

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

2025/2/5 22:53:11 来源:https://blog.csdn.net/dhrmt/article/details/145383565  浏览:    关键词:go理论知识——Go Channel 笔记 [特殊字符]

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

1. 基本概念 🧠

1.1 Channel 是什么?

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

1.2 Channel 的创建 🏗️

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

2. 无缓冲 Channel 🚫

2.1 无缓冲 Channel 的特性

  • 无缓冲 Channel 是同步的,发送和接收操作会阻塞,直到另一端准备好。
  • 示例代码:
    c := make(chan int)
    go func() {defer fmt.Println("goroutine 结束")fmt.Println("goroutine is running……")c <- 666
    }()
    num := <-c
    fmt.Println("num = ", num)
    

image-20250127232441634

2.2 运行结果

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

3. 带缓冲 Channel 🛠️

3.1 带缓冲 Channel 的特性

  • 带缓冲 Channel 是异步的,只有在缓冲区满时发送操作才会阻塞,只有在缓冲区空时接收操作才会阻塞。
  • 示例代码:
    c := make(chan int, 3)
    go func() {for i := 0; i < 3; i++ {c <- ifmt.Println("子go程正在运行,发送的元素:", i, " len(c) = ", len(c), " cap(c) = ", cap(c))}
    }()
    time.Sleep(2 * time.Second)
    for i := 0; i < 3; i++ {num := <-cfmt.Println("父go程正在运行,收到的元素:", num, " len(c) = ", len(c), " cap(c) = ", cap(c))
    }
    

3.2 运行结果

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

4. 关闭 Channel 🚪

4.1 关闭 Channel 的作用

  • 使用 close 函数关闭 Channel,关闭后不能再发送数据,但可以继续接收数据。
  • 示例代码:
    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 语句。
  • 示例代码:
    c := make(chan int)
    quit := make(chan int)
    go func() {for i := 0; i < 6; i++ {fmt.Println(<-c)}quit <- 0
    }()
    fibonacii(c, quit)
    

image-20250127232414168

image-20250127232338384

5.2 运行结果

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

6. 总结 📌

  • Channel 是 Go 语言中非常重要的并发编程工具。
  • 无缓冲 Channel 是同步的,带缓冲 Channel 是异步的。
  • 使用 close 关闭 Channel,使用 select 处理多个 Channel 操作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com