Uber Go 语言编程规范:使用 go.uber.org/atomic

Uber Go 语言编程规范 Uber Go 语言编程规范 相信很多人前两天都看到 Uber 在 github 上面开源的 Go 语言编程规范了,原文在这里:https://github.com/uber-go/guide/blob/master/style.md 。我们今天就来简单了解一下国外大厂都是如何来写代码的。行文仓促,错误之处,多多指正。另外如果觉得还不错,也欢迎分享给更多的人。 文章目录Uber Go 语言编程规范... 阅读详情

通过sync/atomic 包的原子操作对原始类型s(int32, int64, etc.) 进行操作的时候,很容易忘记在对变量进行读取和修改的时候,使用原子操作。

而go.uber.org/atomic包通过隐藏基础类型对这些操作增加了类型安全,另外,它还包括了一个方便的atomic.Bool类型。

Bad

type foo struct {
  running int32  // 原子类型
}

func (f* foo) start() {
   //原子操作
  if atomic.SwapInt32(&f.running, 1) == 1 {
     // 已经在运行了
     return
  }
  // start the Foo
}

func (f *foo) isRunning() bool {
  return f.running == 1  // 忘记使用原子操作导致资源竞争
}

Good

type foo struct {
  running atomic.Bool //使用atomic.Bool类型
}

func (f *foo) start() {
//使用Swap(true)进行安全判断
  if f.running.Swap(true) {
     // already running…
     return
  }
  // start the Foo
}

func (f *foo) isRunning() bool {
 //使用Load()方法保证安全
  return f.running.Load()
}

 

Uber 公司推出的 GoLang 编程规范 如果不是lib库,就需要增加所需的上下文信息,不然就会出现 "connection refused" 这样非常 模糊的错误,理论上应该添加上下文,来得到这样的报错信息:"call service foo: connection refused"。最好的情况下,编译器会直接报错,最糟糕的情况下,这样的代码会引入难以排查的bug。如果结构体中包含mutex,在使用结构体的指针时,mutex应该是结构体的非指针字段,也不要把mutex内嵌到结构体中,即使结构体是非导出类型。尽管编写内嵌类型已实现的方法是乏味的。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南01

高并发:限流、熔断、降级高性能:红包拆分、多级缓存、大Key/热Key拆分、Pipeline、线程池、RocketMQ零丢失、幂等、分布式锁、集群缩容、分批入库海量数据处理:日志分表分片、跨表查询、冷热分层、大数据引擎服务器选型系统安全:网关安全、服务器安全、云存储安全、风控、监控、测试数据一致性:缓存与数据库一致性、大厂方案、蓝绿回滚、流量一致性、流程一致性项目与团队管理:流程问题、管理问题(风险、成本、人员、文档、培训)稳定性建设:上线三板斧、线上五步闭环、混沌工程、容量规划。

weixin_49199313的博客 249

go 原子操作 atomic的使用

go语言提供的原子操作都是非侵入式的,它们由标准库代码包sync/atomic中的众多函数代表。    我们调用sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也...

papaya的博客 6998

Go语言并发编程之原子布尔操作详解

Go语言的并发模型以goroutine和channel为核心,但并不是所有的并发问题都适合用channel来解决。在一些需要高性能、低开销的状态同步场景中,Go语言标准库中的包提供了非常关键的支持。该包封装了对基础数据类型(如int32、int64、uintptr、指针等)的原子操作,允许开发者在不使用锁的情况下进行线程安全的数据读写。本章将从sync/atomic包的核心函数出发,深入分析其功能、使用方法以及底层实现机制,帮助开发者理解其在并发编程中的价值与局限。

weixin_42452483的博客 1017

golang annot find package “go.uber.org/atomic解决

golang cannot find package "go.uber.org/atomic解决

关光磊的博客 870

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4837

CATIA_DELMIA_V5R2019安装包下载及安装教程破解

CATIA_V5R2019/DELMIA_V5R2019安装包下载及安装教程破解

一只机械工装熊的博客 8364

深入了解Golang atomic原子操作

并发是指在同一时间间隔内,多个任务(线程、进程或活动)同时存在和执行的状态,在同一个时间点多个任务同时进行,当一个 CPU 在访问数据时,其他 CPU 可能同时在访问同一块数据或者相关的数据,如果其中一个 CPU 修改了数据并且写回了内存,其他 CPU 的缓存并不会立即更新,而是需要等待一定的时间或者触发特定的机制来使得缓存中的数据失效。这就可能导致其他 CPU 继续使用旧的数据,从而引发并发性问题,如数据不一致、程序错误等。

qq_29647593的博客 2632

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3757

下载zap包、atomic包、multierr包

下载zap包、atomic包、multierr包 zap包 下载地址:github.com/uber-go/zap 可以使用 go get github.com/uber-go/zap atomic包 下载地址:github.com/uber-goatomic 可以使用 go get github.com/uber-go/atomic multierr包 下载地址:github.com/uber-...

qq_29807203的博客 880

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4594

光模块封装工艺简介

光模块按照部件可以分为芯片、光器件、光模块三个层级;按照应用领域大概可分为电信应用、数通应用两个领域;按照内部器件的封装工艺可分为TO、Box、COB三大类。 但是,无论是哪种类型的光模块,其生产工艺基本上可以分为封装、测试两大块。   那什么叫做器件封装呢?我的理解器件封装就是利用胶水、焊料、机械、热量等手段把器件按照一定的先后次序结合形成一个整体的过程,就好像早上吃的煎饼,把面粉、鸡蛋、脆饼、烤肠、葱花等这些“器件”,按照一定的顺序,通过食用油、甜面酱、加热、卷起来等手段结合到一起,形成了美味的

qq_33253182的博客 2826

[go]原子操作atomic包简介

文章目录简介原子操作与互斥锁区别原子操作增加操作比较并交换操作载入操作atomic.Valuevalue读取value存储 原子操作就是不可中断的操作,这些操作对外表现成一个不可分割的整体,他们要么都执行,要么都不执行,外界是看不到原子操作的中间状态。 简介 go语言通过内置sync/atomic包提供对原子操作的支持,包括(以下XXType为:int32、int64、uint32、uint64、uintptr): 增减操作(AddXXType):保证对操作数的原子增减; 载入操作(LoadXXType)

飞鹰技术 3250

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2700

Go语言实战:个性化编码方法与工程实践

Go语言作为现代高性能编程语言,其并发模型和内存管理机制为开发者提供了强大的工程能力。从语言特性到工程实践,Go的接口设计、goroutine管理和错误处理机制构成了其核心技术价值。在微服务架构和高并发场景下,合理的代码组织和性能优化策略尤为关键。本文介绍的GoCodingInMyWay方法论,融合了类型安全处理、通道使用黄金法则等实战技巧,特别适用于电商系统、日志收集等高性能应用场景。通过自定义错误包装体系和goroutine生命周期管理,开发者可以构建更健壮的分布式系统。

weixin_30596023的博客 438

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

LeRobot 机器人学习(Robot Learning)入门教程(一)

本文介绍了现代机器人学习领域的发展现状与关键技术。随着机器学习进步和大规模机器人数据的普及,机器人技术正从传统基于模型的方法转向数据驱动的学习范式。HuggingFace开发的开源库lerobot实现了端到端集成,支持多种机器人平台和先进算法(强化学习、行为克隆等)。核心创新包括LeRobotDataset标准化格式,统一处理多模态时间序列数据,并支持高效批处理和流式访问。教程涵盖经典机器人学基础、强化学习原理、模仿学习技术和通用模型开发,结合代码示例展示如何构建适应多样化任务的机器人系统。该资源旨在为研究

2506_90492529的博客 1993

Golang并发编程 - atomic原子操作包详解

atomic包位于sync目录下。它提供了低级原子内存原语,用于实现同步算法。本文介绍了atomic包下的各个类型和操作方法,并给出了部分使用示例。

ChineHe的博客 1572

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

k8s kubebuilder系列开发 — 理解和剖析 Kubebuilder

原文转自:微信公众号云原生CTO 欢迎阅读 Kubernetes Operator Dev的 N 部分系列的第二部分。 如果你想从理论上了解operator是什么以及它们是如何工作的,请参阅第一部分。 在这一部分,我们将探索如何使用Kubebuilder来简化operator的编写。所以,我们让我们let's go! Kubebuilder: https://github.com/kubernetes-sigs/kubebuilder Kubebuilder是什么? 编写Kubernetes op.

学亮编程手记 3541

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Go 语言原子计数器:高效并发场景下的状态管理利器

Go 语言中的原子计数器是高效并发场景下管理状态的利器,尤其适用于高频计数和状态标志更新等场景。通过sync/atomic包,开发者可以实现无锁化的原子操作,确保数据一致性和并发安全性。原子操作的核心特性包括原子性、无锁化和类型安全,适用于简单数值的递增/递减、状态标志的原子更新以及无锁数据结构的实现。sync/atomic包提供了AddUint64、LoadUint64和StoreUint64等核心方法,支持高效并发操作。与普通操作相比,原子操作避免了锁竞争,性能更高。进阶应用包括原子标志位、无锁队列的索

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1108

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

go atomic原子操作详细解读

修改完成后,缓存行为修改状态,其他核心的该缓存行为无效状态,此时若有核心读取该缓存行,就将缓存行写入内存,该核心上的缓存行状态更新为共享;atmoic包怎么用?以加法为例,变量加法运算操作并不是原子性的,包括从内存中取值放入加法寄存器、寄存器运算得到结果、将结果写回内存,在并发环境下,一个协程的运算结果可能被另一个覆盖,从而导致丢失修改的问题,例如以下代码的最后打印结果不会是10000。总的逻辑是,当一个核心读取内存中数据在自己的本地缓存中并且只有该核心的缓存拥有该缓存行,这个缓存行的状态为。

sunningzhzh的博客 2780

fzf原子操作:atomicbool.go并发控制深度解析

在多线程并发编程中,布尔值的读写操作看似简单,实则暗藏玄机。当多个goroutine同时访问同一个布尔变量时,如果没有适当的同步机制,就会出现数据竞争(Data Race)和竞态条件(Race Condition),导致程序行为不可预测。 fzf作为一个高性能的命令行模糊查找工具,在处理大量数据时充分利用了Go语言的并发特性。`atomicbool.go`文件正是为了解决这一核心问题而设计的线程...

gitblog_00704的博客 732

Go Atomic

为了实现这样的严谨性,原子操由CPU提供芯片级别的支持,所以绝对有效,即使在拥有多CPU核心,或者多CPU的计算机系统中,原子操作的保证也是不可撼动的。该操作简称CAS(CompareAndSwap),第一个参数的值应该是指向被操作值的指针值,该值的类型即为*int32,后两个参数的类型都是int32类型,它们的值应该分别代表被操作值的旧值和新值,函数在被调用之后会先判断参数addr指向的被操作值与参数old的值是否相等。因为这很容易造成安全漏洞。...

云满笔记 1299

一文搞明白golang底层原子级内存操作 的使用(sync atomic包)

这个atomic包里面的类型定义看似一大推,其实归纳起来就8种,分别是 :Bool, Int32/64, Uint32/64, Pointer, Uintptr, Value ; 还有他们的方法,基本都一样,即 最多也就以下这5个方法......

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1861

Go语言原子布尔库abool使用手册

Go语言原子布尔库abool使用手册 一、项目目录结构及介绍 项目 abool 是一个专为Go语言设计的原子布尔型库,它优化了代码性能,同时保持简洁易用。下面是该开源项目的基本目录结构及其简要说明: - README.md: 主要的读我文件,包含了项目简介、安装方法、快速示例等。 - LICENSE: 许可证文件,规定了如何合法地使用此软件库。 - abool.go: 核心源码文件,实现了原子布尔...

gitblog_00333的博客 354

推荐一款强大的原子操作库:go.uber.org/atomic

在高并发和多线程的编程环境中,保证数据的一致性和完整性至关重要。为此,我们向您推荐一个简单易用且安全的Go语言原子操作库——[go.uber.org/atomic](https://godoc.org/go.uber.org/atomic)。这个库为原始类型提供了封装,确保了对它们的访问始终是原子性的。 ## 项目介绍 `go.uber.org/atomic` 是 Uber 开源的一款库,它的...

gitblog_00068的博客 690

Uber-Go/Atomic 项目常见问题解决方案

Uber-Go/Atomic 是一个用于 Go 语言的库,提供了对基本数据类型的原子操作封装。这个库的主要目的是确保在并发编程中,对这些数据类型的访问是原子的,从而避免竞态条件。Uber-Go/Atomic 项目的主要编程语言是 Go。 ## 新手使用注意事项及解决方案 ### 1. 导入路径问题 **问题描述**:在 Go 模块化系统中,Uber-Go/Atomic 项目的导入路径从 v1...

gitblog_01133的博客 785
上一篇: Uber Go 语言编程规范:不要panic
下一篇: Uber Go 语言编程规范:避免可变的全局变量
DreamCatcher
博客等级 码龄20年 23粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamCatcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值