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

陕西营销型网站制作做简单的企业网站需要学哪些

陕西营销型网站制作,做简单的企业网站需要学哪些,做网站的市场有那么大吗,seo企业建站系统Golang 关键字 channel 的用法和原理 Golang 是一门支持并发编程的语言#xff0c;它提供了一种特殊的类型#xff1a;channel#xff0c;用于在不同的 goroutine 之间传递数据#xff0c;实现同步和通信。channel 是 Go 语言高性能并发编程中的核心数据结构和机制。本文将…Golang 关键字 channel 的用法和原理 Golang 是一门支持并发编程的语言它提供了一种特殊的类型channel用于在不同的 goroutine 之间传递数据实现同步和通信。channel 是 Go 语言高性能并发编程中的核心数据结构和机制。本文将介绍 Golang 关键字 channel 的用法和原理包括如何创建、发送、接收、关闭、选择和避免死锁等。 channel 的创建 channel 是一种引用类型可以使用 make 函数来创建。make 函数接受两个参数channel 的类型和可选的缓冲区大小。例如 ch : make(chan int) // 创建一个无缓冲的 int 类型的 channel ch : make(chan int, 10) // 创建一个有缓冲的 int 类型的 channel缓冲区大小为 10channel 的类型由关键字 chan 和数据类型组成表示该 channel 可以传递的数据类型。例如chan int 表示一个可以传递 int 类型数据的 channel。 channel 的缓冲区大小表示该 channel 可以存储的数据的数量。如果没有指定缓冲区大小或者指定为 0那么该 channel 就是一个无缓冲的 channel也就是说每次发送或接收数据都需要等待另一端的 goroutine 准备好。如果指定了缓冲区大小那么该 channel 就是一个有缓冲的 channel也就是说只有当缓冲区满了或空了的时候发送或接收操作才会阻塞。 channel 的发送和接收 channel 的发送和接收操作使用箭头符号 - 来表示。箭头的方向表示数据的流向。例如 ch - x // 将 x 发送到 channel ch 中 x - ch // 从 channel ch 中接收数据并赋值给 xchannel 的发送和接收操作都是原子的也就是说它们不会被其他的 goroutine 打断或干扰。channel 的发送和接收操作也都是阻塞的也就是说它们会等待对应的操作完成才会继续执行。例如 ch - x // 如果 ch 是无缓冲的或者 ch 的缓冲区已满那么这个操作会阻塞直到有其他的 goroutine 从 ch 中接收数据 x - ch // 如果 ch 是无缓冲的或者 ch 的缓冲区已空那么这个操作会阻塞直到有其他的 goroutine 向 ch 中发送数据channel 的发送和接收操作可以保证数据的顺序也就是说先发送的数据一定会先被接收后发送的数据一定会后被接收。这是因为 channel 内部实现了一个先进先出FIFO的队列来存储数据。 channel 的关闭 channel 的关闭操作使用 close 函数来实现。close 函数接受一个 channel 类型的参数表示要关闭的 channel。例如 close(ch) // 关闭 channel chchannel 的关闭操作可以通知其他的 goroutine 这个 channel 已经不再使用了也就是说不会再有数据发送到这个 channel 中。关闭一个 channel 之后不能再向这个 channel 中发送数据否则会导致 panic 错误。但是仍然可以从这个 channel 中接收数据直到 channel 中的所有数据都被接收完毕。例如 close(ch) // 关闭 channel ch ch - x // panic: send on closed channel x - ch // 如果 ch 中还有数据那么可以正常接收如果 ch 中没有数据那么会接收到零值为了判断一个 channel 是否已经关闭可以使用以下的语法 x, ok - ch // 从 channel ch 中接收数据并赋值给 x同时返回一个布尔值 ok表示 channel 是否已经关闭 if !ok {// channel 已经关闭处理逻辑 } else {// channel 还没有关闭处理逻辑 }为了避免内存泄漏等问题建议在不再使用 channel 的时候及时关闭它。一般来说关闭 channel 的操作应该由发送方来执行而不是接收方。这是因为发送方知道什么时候数据发送完毕而接收方不一定知道什么时候数据接收完毕。如果多个 goroutine 都向同一个 channel 中发送数据那么可以使用 sync.WaitGroup 来协调关闭 channel 的时机。 channel 的选择 在并发编程中有时候我们需要同时处理多个 channel 的发送和接收操作或者根据不同的 channel 的状态来执行不同的逻辑。这时候我们可以使用 select 语句来实现。select 语句类似于 switch 语句但是它的每个分支都是一个 channel 的操作。select 语句的语法如下 select { case x - ch1: // 如果 ch1 可以发送数据那么执行这个分支// 处理逻辑 case y - ch2: // 如果 ch2 可以发送数据那么执行这个分支// 处理逻辑 case z - ch3: // 如果 ch3 可以接收数据那么执行这个分支// 处理逻辑 default: // 如果以上都不满足那么执行这个分支// 处理逻辑 }select 语句会随机选择一个满足条件的分支执行如果没有任何分支满足条件那么会执行 default 分支如果没有 default 分支那么会阻塞直到有一个分支满足条件。如果有多个分支满足条件那么会随机选择一个执行。 select 语句可以用来实现多路复用、超时控制、非阻塞操作等功能。例如 // 多路复用同时处理多个 channel 的数据 select { case x - ch1:fmt.Println(received, x, from ch1) case y - ch2:fmt.Println(received, y, from ch2) }// 超时控制如果在指定的时间内没有收到数据就返回 select { case x - ch:fmt.Println(received, x) case -time.After(3 * time.Second):fmt.Println(timeout) }// 非阻塞操作如果 channel 不可用就执行其他逻辑 select { case x - ch:fmt.Println(received, x) default:fmt.Println(no data) }channel 的死锁 在使用 channel 时有一种特殊的情况就是当所有的 goroutine 都被阻塞在 channel 的操作上而没有其他的 goroutine 来解除阻塞那么就会发生死锁deadlock。死锁会导致程序无法继续运行甚至崩溃。例如 package mainimport fmtfunc main() {ch : make(chan int)// 向一个无缓冲 channel 发送数据但没有接收者ch - 1fmt.Println(Sent data to channel)// 这里不会执行到因为上面的发送操作会导致死锁 }为了避免死锁我们需要注意以下几点 不要在没有其他的 goroutine 的情况下向一个无缓冲的 channel 发送或接收数据否则会导致自身阻塞。不要在一个 goroutine 中连续向同一个 channel 发送或接收多个数据否则会导致自身阻塞或者和其他的 goroutine 形成循环等待。不要在一个 goroutine 中同时操作多个 channel否则会导致自身阻塞或者和其他的 goroutine 形成循环等待。可以使用 select 语句来避免这种情况。不要忘记关闭不再使用的 channel否则会导致其他的 goroutine 阻塞在该 channel 上或者造成内存泄漏。不要向一个已经关闭的 channel 发送数据否则会导致 panic 错误。可以使用 defer 语句来确保关闭 channel 的时机。 channel 的原理 channel 的内部实现是一个结构体它包含了以下几个字段 qcount表示 channel 中当前的数据数量dataqsiz表示 channel 的缓冲区大小buf表示 channel 的缓冲区是一个指向数组的指针elemsize表示 channel 中数据的大小closed表示 channel 是否已经关闭recvq表示等待接收数据的 goroutine 队列sendq表示等待发送数据的 goroutine 队列lock表示 channel 的互斥锁用来保护 channel 的状态 channel 的发送和接收操作的内部逻辑如下 发送操作 加锁如果 channel 已经关闭那么 panic如果 channel 有缓冲区并且缓冲区没有满那么将数据放入缓冲区更新 qcount解锁返回如果 channel 没有缓冲区或者缓冲区已满那么检查 recvq 是否有等待的 goroutine 如果有那么将数据直接传递给第一个等待的 goroutine唤醒它解锁返回如果没有那么将当前的 goroutine 放入 sendq阻塞等待被唤醒接收操作 加锁如果 channel 有缓冲区并且缓冲区不为空那么从缓冲区取出数据更新 qcount解锁返回如果 channel 没有缓冲区或者缓冲区为空那么检查 sendq 是否有等待的 goroutine 如果有那么从第一个等待的 goroutine 接收数据唤醒它解锁返回如果没有那么检查 channel 是否已经关闭 如果是那么返回零值和 false解锁返回如果不是那么将当前的 goroutine 放入 recvq阻塞等待被唤醒 总结 本文介绍了 Golang 关键字 channel 的用法和原理包括如何创建、发送、接收、关闭、选择和避免死锁等。channel 是 Go 语言并发编程中的核心数据结构和机制它可以实现不同的 goroutine 之间的数据传递、同步和通信。在使用 channel 时要注意遵循一些规范和原则以提高代码的可读性和可维护性以及避免一些常见的错误和问题。
http://www.pierceye.com/news/147083/

相关文章:

  • 做购物网站哪个cms好用网络规划与设计就业前景
  • wordpress仿站工具网站建设jw100
  • 网站推广过程叙述关键词歌词
  • vip影视网站如何做appwordpress centos查看目录
  • 网站怎么套模板山西seo博客
  • 好看的手机网站推荐新建的网站 找不到
  • 网站站内搜索怎么做seo搜索优化
  • 建设部网站 测绘规章pc网站手机网站
  • 建网站如何赚钱vs哪个版本做网站好
  • 新衡阳网站游戏软件开发公司简介
  • 湖南基础建设投资集团网站做体育最好的网站
  • 上海php网站开发公司wordpress 邮件认证
  • 教做香肠的网站张家港专业网站建设
  • 园林建设网站营销型网站的建站步骤是什么意思
  • 招聘求职网站html模板正规的创业商机网
  • 预付网站建设费会计处理哪里建网站好
  • 做免费网站艺术学院网站建设管理办法
  • 做网站贵吗手机网站wap
  • linux建立网站做网站的应该怎么发广告
  • wordpress使用端口百度seo排名软
  • 用英文字母做网站关键词个人网站的设计与实现专业论文图像处理工具
  • 重庆企业网站推广流程php网站开发技术训练心得
  • 汽车销售网站学校建网站
  • 两台电脑一台做服务器 网站潍坊专业网站建设多少钱
  • 青岛科技街网站建设安徽 网站开发
  • 黑糖不苦建设的网站wordpress获取文章图片不显示
  • 美食网站建设的功能免费做简历的网站
  • 网站建设公司谁管手机如何创建网站
  • 可以自己做网站优化吗最好用的wordpress主题
  • 瓜子二手车网站开发智慧团建注册登记入口