当前位置: 首页 > news >正文

吐鲁番市网站建设加强网站建设的

吐鲁番市网站建设,加强网站建设的,河南网站制作,网站建设制作ppt一、Channel 的核心用法 1. 基本操作 // 创建无缓冲 Channel&#xff08;同步通信&#xff09; ch : make(chan int) // 创建有缓冲 Channel&#xff08;容量为5&#xff0c;异步通信&#xff09; bufferedCh : make(chan int, 5) // 发送数据到 Channel ch <- 42 // 从…

一、Channel 的核心用法

1. 基本操作

// 创建无缓冲 Channel(同步通信)
ch := make(chan int)

// 创建有缓冲 Channel(容量为5,异步通信)
bufferedCh := make(chan int, 5)

// 发送数据到 Channel
ch <- 42

// 从 Channel 接收数据
value := <-ch

// 关闭 Channel(只能由发送方关闭)
close(ch)

2. 单向 Channel(类型安全)

// 只写 Channel
func producer(ch chan<- int) {
ch <- 1
}

// 只读 Channel
func consumer(ch <-chan int) {
fmt.Println(<-ch)
}

3. 多路复用(select

select {
case v := <-ch1:
fmt.Println(v)
case ch2 <- 42:
fmt.Println(“sent”)
case <-time.After(time.Second):
fmt.Println(“timeout”)
default:
fmt.Println(“no activity”)
}

4. 遍历 Channel

// 自动检测 Channel 关闭
for v := range ch {
fmt.Println(v)
}


二、Channel 的核心原理

1. 底层数据结构

Channel 在运行时由 hchan 结构体表示(简化版):

type hchan struct {
qcount uint // 当前元素数量
dataqsiz uint // 缓冲区大小(容量)
buf unsafe.Pointer // 环形缓冲区指针
elemsize uint16 // 元素类型大小
closed uint32 // 关闭标志
sendx uint // 发送索引
recvx uint // 接收索引
recvq waitq // 接收等待队列(sudog链表)
sendq waitq // 发送等待队列(sudog链表)
lock mutex // 互斥锁
}

2. 操作流程
  • 发送数据
    • 缓冲区有空位:直接写入缓冲区。
    • 缓冲区已满:当前 Goroutine 被加入 sendq 队列并阻塞(gopark)。
    • 有等待的接收者:直接将数据拷贝到接收方,唤醒接收者(goready)。
  • 接收数据
    • 缓冲区有数据:直接读取。
    • 缓冲区为空:当前 Goroutine 被加入 recvq 队列并阻塞。
    • 有等待的发送者:直接从发送者拷贝数据,唤醒发送者。
3. 关键机制
  • 同步(无缓冲):发送和接收必须同时就绪,否则阻塞。
  • 异步(有缓冲):缓冲区未满/非空时操作立即完成。
  • 关闭 Channel
    • 关闭后发送操作会触发 panic
    • 接收操作会立即返回剩余数据,之后返回零值。
  • Goroutine 调度:通过 goparkgoready 实现阻塞和唤醒。

三、Channel 的使用场景

1. 任务分发与结果收集

// Worker Pool 模式
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}

func main() {
jobs := make(chan int, 10)
results := make(chan int, 10)

// 启动3个 Worker
for w := 1; w <= 3; w++ {go worker(w, jobs, results)
}// 分发任务
for j := 1; j <= 5; j++ {jobs <- j
}
close(jobs)// 收集结果
for i := 1; i <= 5; i++ {fmt.Println(<-results)
}

}

2. 事件通知

// 使用关闭 Channel 广播事件
var done = make(chan struct{})

func worker() {
for {
select {
case <-done:
fmt.Println(“exit”)
return
default:
// 正常工作
}
}
}

// 关闭 Channel 通知所有 Worker 退出
close(done)

3. 并发控制(信号量)

// 限制并发数为3
var sem = make(chan struct{}, 3)

func task() {
sem <- struct{}{} // 获取信号量
defer func() { <-sem }() // 释放信号量

// 执行任务

}

4. 数据流水线

// 流水线处理:生成 → 平方 → 输出
func gen(nums …int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}

func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}

func main() {
// 流水线连接
c := gen(2, 3)
out := sq©
for n := range out {
fmt.Println(n) // 4, 9
}
}


四、注意事项

  1. 关闭 Channel
    • 只有发送方可以关闭 Channel。
    • 重复关闭会触发 panic
  2. 阻塞与死锁
    • 确保有 Goroutine 接收发送的数据。
  3. 零值 Channel
    • nil Channel 接收或发送会永久阻塞。
  4. 性能优化
    • 小对象直接传递,大对象传递指针。
    • 避免频繁创建和销毁 Channel。

http://www.yayakq.cn/news/350023/

相关文章:

  • 中山做网站比较好电商新手从哪里做起
  • 网站顶部做网站公司流程
  • 深圳华宫建设集团网站如何创建一个站点
  • cms网站模板套用教程网站建设 字体版权
  • 高端网站建设的图片linux做网站1G内存够不
  • 网站源码爬取免费论坛建站系统
  • 北京鲜花的网站建设云南手机网站建设
  • 网站一条龙服务建设企业网站的好处
  • 百度网站的总结单页面网站做百度推广效果
  • 广州网站设计自己的网站怎么推广
  • 建设银行面试经验网站手机系统优化是什么意思
  • 诸城哪里做网站一流的南京网站建设
  • 用花生棒自己做内网网站推广普通话手抄报内容文字
  • qq网站直接登录没有网站做淘宝客
  • 银行门户网站建设ppt深圳华强北在哪个区
  • 成都智科达实验室设备有限公司网站在线优化检测
  • 网站建设的三种方法文山微网站建设
  • 福海网站制作怎么制作网站app
  • 网站里的图片是怎么做的泰州网站建设团队
  • 南通市规划建设局网站wordpress搜索翻页404
  • 视觉网站建设中国寰球工程有限公司网站设计
  • 如何做网站ip跳转网站建设公司哪家好 都来磐石网络
  • 技术支持:上海网站建设怎么做点击图片进网站
  • 允许发外链的网站wordpress get_var
  • 黑龙江做网站的公司多企业宣传网站建设
  • 奢做品二手 哪个网站好北京网下载
  • 制作只有一张图片的网站wap网站分享到微信
  • 青岛注册公司流程绍兴网站seo
  • 手机微网站系统比较好的做网站公司
  • 网站设计接单php做网站页面