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 是同步的,发送和接收操作会阻塞,直到另一端准备好。
-
示例代码:
goc := 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 是异步的,只有在缓冲区满时发送操作才会阻塞,只有在缓冲区空时接收操作才会阻塞。
-
示例代码:
goc := 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,关闭后不能再发送数据,但可以继续接收数据。 -
示例代码:
goc := 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
语句。 -
示例代码:
goc := 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 操作。