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

公司网络建设计划书郑州seo网络推广

公司网络建设计划书,郑州seo网络推广,什么网站可以做邮件列表,2023最建议买10款手机空结构体(struct{}) 普通理解 在结构体中,可以包裹一系列与对象相关的属性,但若该对象没有属性呢?那它就是一个空结构体。 空结构体,和正常的结构体一样,可以接收方法函数。 type Lamp struct{}func (l Lamp) On()…

在这里插入图片描述

空结构体(struct{})

  • 普通理解

在结构体中,可以包裹一系列与对象相关的属性,但若该对象没有属性呢?那它就是一个空结构体。

空结构体,和正常的结构体一样,可以接收方法函数。

type Lamp struct{}func (l Lamp) On() {println("On")}
func (l Lamp) Off() {println("Off")
}
  • 空结构体的妙用

空结构体的表象特征,就是没有任何属性,而从更深层次的角度来说,空结构体是一个不占用空间的对象。

使用 unsafe.Sizeof 可以轻易的验证这个结果

type Lamp struct{}func main() {lamp := Lamp{}fmt.Print(unsafe.Sizeof(lamp))
}
// output: 0

基于这个特性,在一些特殊的场合之下,可以用做占位符使用,合理的使用空结构体,会减小程序的内存占用空间。

比如在使用信道(channel)控制并发时,我们只是需要一个信号,但并不需要传递值,这个时候,也可以使用 struct{} 代替。

func main() {ch := make(chan struct{}, 1)go func() {<-ch// do something}()ch <- struct{}{}// ...
}

在 Go 语言中,使用空结构体(struct{})作为通道(chan)的元素类型是一种常见的优化手段。这种做法主要出于以下几个原因:

  1. 节省内存
    空结构体 struct{} 在 Go 中不占用任何内存空间(大小为 0 字节)。因此,当你需要一个通道来传递信号或同步协程时,使用空结构体可以避免不必要的内存开销。

  2. 信号传递
    在某些场景下,你并不需要通过通道传递具体的数据,而只是需要一个简单的信号机制来通知其他协程某个事件已经发生。例如,用于关闭多个工作协程、通知某个操作完成等。此时,空结构体作为通道的元素类型非常合适。

  3. 提高性能
    由于空结构体不占用内存,发送和接收空结构体的操作通常比发送和接收复杂数据类型的通道更快。虽然这种差异在大多数情况下是微不足道的,但在高并发或高性能要求的场景下,这些细微的优化可能会产生显著的影响。

.关闭多个工作协程

package mainimport ("fmt""time"
)func worker(id int, done chan struct{}) {for {select {case <-done:fmt.Printf("Worker %d shutting down\n", id)returndefault:fmt.Printf("Worker %d working\n", id)time.Sleep(500 * time.Millisecond)}}
}func main() {done := make(chan struct{})numWorkers := 3// 启动多个工作协程for i := 1; i <= numWorkers; i++ {go worker(i, done)}// 模拟一些工作time.Sleep(2 * time.Second)// 发送关闭信号close(done)// 等待一段时间以确保所有工作协程都已退出time.Sleep(1 * time.Second)
}

在这个例子中,done 通道被用来通知所有工作协程停止工作。我们不需要通过通道传递任何实际的数据,只需要一个信号即可。

.同步操作完成

package mainimport ("fmt""sync"
)func task(id int, wg *sync.WaitGroup, done chan struct{}) {defer wg.Done()fmt.Printf("Task %d completed\n", id)done <- struct{}{} // 发送一个空结构体表示任务完成
}func main() {var wg sync.WaitGroupdone := make(chan struct{}, 3) // 缓冲区大小为任务数量for i := 1; i <= 3; i++ {wg.Add(1)go task(i, &wg, done)}// 等待所有任务完成go func() {wg.Wait()close(done)}()// 接收所有完成信号for range done {fmt.Println("Received completion signal")}fmt.Println("All tasks completed")
}

在这个例子中,每个任务完成后都会向 done 通道发送一个空结构体,表示任务已完成。主协程通过读取 done 通道中的信号来确认所有任务是否已完成。

http://www.dtcms.com/wzjs/359199.html

相关文章:

  • 做网站运营有前途吗企业网站seo推广方案
  • 桂林有帮做公司网站吗淘宝运营培训课程
  • 黄冈网站推广代运营seo自然优化排名技巧
  • 临清网站制作公司seo搜索引擎优化软件
  • 贵州省建设厅考试网站创建一个网站
  • 做污事网站如何规划企业网络推广方案
  • 企业网站规划与开发牛奶推广软文文章
  • 南澳做网站上海哪家seo公司好
  • 最好网站制作工具网络舆情分析报告范文
  • 外贸有限公司英文网站苏州疫情最新通知
  • 给一瓶水做网站服务营销论文
  • 怎样查看别人网站流量关键词seo深圳
  • 南通企业建站系统模板太原百度关键词排名
  • 网站打开有声音是怎么做的商品促销活动策划方案
  • 农业门户网站建设目标google网站搜索
  • 泰州网站制作案例山东网络优化公司排名
  • 重庆宣网站建设推广接单平台哪个好
  • 做得比较好的公司网站创建自己的网址
  • 大连做网站价钱百度搜索app下载
  • 网站建设外包公司方案百度seo网络营销书
  • 做鞋的B2B网站杭州百度开户
  • 电脑网页设计教程电脑突然多了windows优化大师
  • 宣传做传单的网站长沙网站推广排名
  • 网站用excel做数据库seo公司多少钱
  • 怎么做企业官方网站seo关键词排名点击工具
  • 汽车网站建设策划书软文营销常用的方式是什么
  • 功能型网站建设时间电商沙盘seo裤子关键词
  • 拱墅区网站建设最近三天的国内新闻
  • 自己怎样注册企业网站nba东西部最新排名
  • wordpress中如何用仪表盘添加视频百度官网优化