首次提交:初始化项目代码
This commit is contained in:
+121
@@ -0,0 +1,121 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ===================== 一、Channel 类型系统 =====================
|
||||
// producer 只写通道 生产者
|
||||
func producer(ch chan<- int) {
|
||||
defer close(ch) // 延迟关闭,确保数据发送完毕
|
||||
for i := 1; i <= 2; i++ {
|
||||
ch <- i * 10
|
||||
}
|
||||
}
|
||||
|
||||
// consumer 只读通道 消费者
|
||||
func consumer(ch <-chan int) {
|
||||
for data := range ch {
|
||||
fmt.Printf("消费数据:%d\n", data)
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 二、Channel 缓冲策略 =====================
|
||||
func bufferDemo() {
|
||||
fmt.Println("\n===== 无缓冲通道(同步通信)=====")
|
||||
unbufCh := make(chan string)
|
||||
go func() {
|
||||
unbufCh <- "同步通道数据"
|
||||
}()
|
||||
fmt.Println(<-unbufCh)
|
||||
|
||||
fmt.Println("\n===== 有缓冲通道(异步通信)=====")
|
||||
bufCh := make(chan int, 3)
|
||||
bufCh <- 1
|
||||
bufCh <- 2
|
||||
// 监控缓冲状态
|
||||
fmt.Printf("已缓存数据:%d,总缓冲容量:%d\n", len(bufCh), cap(bufCh))
|
||||
close(bufCh)
|
||||
|
||||
for v := range bufCh {
|
||||
fmt.Println("异步数据:", v)
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 三、Channel 安全关闭 =====================
|
||||
func closeDemo() {
|
||||
fmt.Println("\n===== 通道安全关闭演示=====")
|
||||
ch := make(chan int, 2)
|
||||
// 保证通道仅关闭一次
|
||||
var closeOnce sync.Once
|
||||
|
||||
go func() {
|
||||
closeOnce.Do(func() {
|
||||
ch <- 100
|
||||
ch <- 200
|
||||
close(ch)
|
||||
fmt.Println("通道已安全关闭")
|
||||
})
|
||||
}()
|
||||
|
||||
// 安全读取数据
|
||||
for {
|
||||
val, ok := <-ch
|
||||
if !ok {
|
||||
fmt.Println("通道关闭,读取结束")
|
||||
break
|
||||
}
|
||||
fmt.Printf("读取值:%d\n", val)
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 四、Channel 高级用法 =====================
|
||||
func advancedDemo() {
|
||||
fmt.Println("\n===== select 多路复用=====")
|
||||
ch1, ch2 := make(chan string), make(chan string)
|
||||
|
||||
// 模拟异步任务
|
||||
go func() {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
ch1 <- "任务1执行完成"
|
||||
}()
|
||||
go func() {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
ch2 <- "任务2执行完成"
|
||||
}()
|
||||
|
||||
// 监听多个通道
|
||||
for i := 0; i < 2; i++ {
|
||||
select {
|
||||
case msg := <-ch1:
|
||||
fmt.Println(msg)
|
||||
case msg := <-ch2:
|
||||
fmt.Println(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// 非阻塞读取
|
||||
fmt.Println("\n===== 非阻塞通道读取=====")
|
||||
ch := make(chan int, 1)
|
||||
select {
|
||||
case val := <-ch:
|
||||
fmt.Println("读取到数据:", val)
|
||||
default:
|
||||
fmt.Println("通道暂无数据,非阻塞跳过")
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 主函数 =====================
|
||||
func main() {
|
||||
fmt.Println("===== 一、Channel 类型系统演示=====")
|
||||
ch := make(chan int)
|
||||
go producer(ch)
|
||||
consumer(ch)
|
||||
|
||||
// 执行所有演示
|
||||
bufferDemo()
|
||||
closeDemo()
|
||||
advancedDemo()
|
||||
}
|
||||
Reference in New Issue
Block a user