首页 > 其他分享 >Go语言实现计数器的方法有哪些?

Go语言实现计数器的方法有哪些?

时间:2023-08-17 13:22:18浏览次数:31  
标签:wg 哪些 counter sync mu 计数器 func Go

Go语言中,实现计数器可以通过使用不同的机制和数据结构来实现。以下是几种常见的计数器实现方法:

基于原子操作的计数器
Go的sync/atomic包提供了原子操作,可以用于实现高效的计数器,适用于并发环境。

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

func main() {
    var counter int64

    var wg sync.WaitGroup
    numWorkers := 10

    wg.Add(numWorkers)
    for i := 0; i < numWorkers; i++ {
        go func() {
            atomic.AddInt64(&counter, 1)
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("Counter value:", counter)
}

在这个示例中,我们使用atomic.AddInt64原子操作来对计数器进行自增操作。这可以确保在并发情况下操作的安全性,避免了竞态条件。

使用Mutex锁的计数器
使用sync.Mutex互斥锁也可以实现计数器,但相对于原子操作,这可能会带来更大的开销。

package main

import (
    "fmt"
    "sync"
)

type Counter struct {
    mu    sync.Mutex
    value int
}

func (c *Counter) Increment() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.value++
}

func (c *Counter) Value() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.value
}

func main() {
    var wg sync.WaitGroup
    numWorkers := 10

    counter := Counter{}

    wg.Add(numWorkers)
    for i := 0; i < numWorkers; i++ {
        go func() {
            counter.Increment()
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("Counter value:", counter.Value())
}

在这个示例中,我们使用sync.Mutex来创建一个互斥锁,然后在计数器的方法中对计数器的操作进行锁定,确保并发安全。

使用channel的计数器
可以使用channel的发送和接收操作来实现计数器,但这种方式不如前两种方式高效。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var counter int
    var mu sync.Mutex
    done := make(chan bool)

    numWorkers := 10
    for i := 0; i < numWorkers; i++ {
        go func() {
            mu.Lock()
            counter++
            mu.Unlock()
            done <- true
        }()
    }

    for i := 0; i < numWorkers; i++ {
        <-done
    }

    fmt.Println("Counter value:", counter)
}

在这个示例中,每个goroutine对计数器进行自增操作后,通过发送到done通道来表示完成。然后在主函数中等待所有goroutine完成,再输出计数器的值。

总的来说,Go语言中实现计数器有多种方法,选择方法取决于需求和性能要求。对于高并发环境,原子操作和互斥锁是更好的选择,而对于一般情况下,也可以使用通道等方式来实现计数器

标签:wg,哪些,counter,sync,mu,计数器,func,Go
From: https://www.cnblogs.com/cheyunhua/p/17637334.html

相关文章

  • 解锁业务潜力:Autogon AI引领AI基础设施革新
    人工智能技术正逐渐应用到各行各业,为企业带来了巨大的商机和挑战。在这个背景下,AutogonAI应运而生,为企业提供了一种零编码的人工智能基础设施。通过AutogonAI,企业可以轻松构建、部署、扩展、购买、集成和可视化AI模型,实现业务潜力的最大化,推动业务增长。本文将深入介绍AutogonAI......
  • 搭载KaihongOS的工业平板、机器人、无人机等产品通过3.2版本兼容性测评,持续繁荣OpenHa
    近日,搭载深圳开鸿数字产业发展有限公司(简称“深开鸿”)KaihongOS软件发行版的工业平板、机器人、无人机等商用产品均通过OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.2 Release版本兼容性测评,获颁OpenHarmony生态产品兼容性证书。这标志着OpenHarmony生态在新兴行业的......
  • 如何使用Leangoo领歌敏捷看板工具做—用户反馈流程管理
    一个产品在面向市场之后势必会收到来自各个渠道的用户反馈。好的反馈有利于公司品牌的建立,挑剔和负面反馈可以帮助我们了解到用户最真是的需求和使用场景,有利于优化产品提高服务。更加能够提升用户的粘性。在进行用户反馈管理时,用户反馈处理流程可以自行定义,通常......
  • Django ORM模型一对一、一对多、多对多操作
    创建模型fromdjango.dbimportmodels#学生类classStudent(models.Model):id=models.AutoField(primary_key=True)sname=models.CharField(max_length=20)#一对多外键设置,'多'的模型类设置外键,注意需要带参数on_deletecid=models.ForeignKe......
  • 云计算和分布存储有哪些关系?
    云计算和分布式存储是两个不同但相关的概念,它们在实际应用中经常会结合在一起使用。云计算:云计算是一种计算模型,它通过网络提供可按需获取、可伸缩且经常是虚拟化的计算资源。云计算模型包括基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。云计算允许用户通过互联网访问和......
  • Goland 技巧
    postfix#.var会自动转化成如下内容,包括.forfmt.Sprintf("abc%d",10).varsprintf:=fmt.Sprintf("abc%d",10)快捷代码:forforiforrmethodlike(快捷键Ctrl+Space+Space)Command+p显示参数信息emm这个功能不晓得该叫什么,自行领悟吧。快捷键option+space,......
  • C# 数字后面有个M字母 所代表的含义,还有哪些类似的字母
    在C#中,数字后面的"M"表示该数字是一个双精度(decimal)类型的数值。双精度类型是C#的一种数据类型,用于存储较大范围和更高精度的十进制数值。通过在数字后面添加"M",可以告诉编译器将该数字解析为双精度类型。例如,你可以使用以下方式声明一个双精度类型的数值:decimalnumber=10.5M;......
  • go excel文件处理
    go excel操作packageutilimport("github.com/extrame/xls""github.com/tealeg/xlsx""reflect""strings")//ReadXlsxxlsx解析funcReadXlsx(sheet*xlsx.Sheet)(res[][]string){temp:=make([]......
  • 解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla
    上一章我们介绍了基于Prompt范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用,复杂调用的方案。多工具调用核心需要解决3个问题,在哪个位置进行工具调用(where),从众多工具中选择哪一个(Which),工具的输入是什么(What)。Where+Which+What,我称之为3W原则,3H它兄......
  • 软件测试报告可以包含哪些测试内容?
     软件测试报告可以包含以下测试内容:功能测试:测试软件的基本功能是否实现,是否符合要求。性能测试:测试软件的响应速度、并发能力、稳定性等性能指标。界面测试:测试软件的用户界面是否友好、易于使用。兼容性测试:测试软件在不同的操作系统、浏览器、设备上的兼容性。安全性测......