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

go优雅重试

实现思路:

  1. 重试配置定义最大重试次数和固定重试间隔;
  2. 使用接口优雅传递可选重试配置参数;
  3. 重试的模板方法必须返回错误,且只有一个返回值;
  4. 如果需要使用被重试方法的返回值,使用匿名方法包一层真实方法并在匿名方法中赋值真实方法的返回值;
  5. 真实方法返回error时会进行重试;
    重试配置
// 重试配置结构
type Config struct  {MaxRetryTime int // 最大重试次数Interval 	  int // 固定重试间隔
}// 构造默认重试配置
func NewDefaultConfig() *Config {return &Config {MaxRetryTime : DefaultMaxRetryTime,Interval : DefaultInterval,}
}// 默认重试配置常量
const (DefaultMaxRetryTime = 3 // 默认最大重试次数DefaultInterval     = 1 // 默认重试间隔(单位秒)
)// 定义重试参数接口
type Option func(*Config)// 设定重试参数方法-超时时间
func MaxRetryTime(maxRetryTime int) Option {return func(config *Config) {config.MaxRetryTime = maxRetryTime}
}// 设定重试参数方法-重试间隔
func Interval(interval int) Option {return func(config *Config) {config.Interval = interval}
}

通用重试方法

// 重试模板方法定义,必须返回错误,且只有一个返回值
type RetryFunc func() error// 接受重试方法和可选重试参数(重试次数、重试间隔)
func DO(f RetryFunc, options...Option) error{// 构造默认重试配置config := NewDefaultConfig()for i :=range options {options[i](config)}// 接受方法返回错误var err errorfor i := 0;i < config.MaxRetryTime ;i++ { err = f()fmt.Printf("第%d次执行 结果%v\n",i+1, err)if err == nil {// 执行成功返回return nil}// 发生错误,延迟重试间隔time.Sleep(time.Duration(config.Interval) * time.Second)}return err
}

测试方法

// 获取商和余数
func GetShangAndYushu(a int, b int) (int, int, error) {val1 := a/bval2 := a %breturn val1, val2, errors.New("手动触发错误") // return val1, val2, nil
}

使用示例

func main() {var shang int // 商var yushu int // 余数var err error DO(func () error {shang, yushu, err = GetShangAndYushu(2,1)return err}, MaxRetryTime(10), Interval(2)) fmt.Printf("最终结果err=%v,shang=%d,yushu=%d\n", err,shang,yushu)
}

结果展示

第1次执行 结果手动触发错误
第2次执行 结果手动触发错误
第3次执行 结果手动触发错误
第4次执行 结果手动触发错误
第5次执行 结果手动触发错误
第6次执行 结果手动触发错误
第7次执行 结果手动触发错误
^@第8次执行 结果手动触发错误
第9次执行 结果手动触发错误
第10次执行 结果手动触发错误
最终结果err=手动触发错误,shang=2,yushu=0

相关文章:

go优雅重试

实现思路&#xff1a; 重试配置定义最大重试次数和固定重试间隔&#xff1b;使用接口优雅传递可选重试配置参数&#xff1b;重试的模板方法必须返回错误&#xff0c;且只有一个返回值&#xff1b;如果需要使用被重试方法的返回值&#xff0c;使用匿名方法包一层真实方法并在匿…...

Python最常用的库

本文章主要为大家总结&#xff0c;9个Python最常用的包及使用案例 1 NumPy 描述: NumPy 是 Python 的一个扩展库&#xff0c;支持高维数组与矩阵运算&#xff0c;并为数组运算提供了大量的数学函数库。它是科学计算中的基础包之一&#xff0c;用于处理大型多维数组和矩阵的运…...

C++面试100问(八)

C中栈溢出的解决办法有哪些&#xff1f; 1&#xff09;、增加栈内存的数目&#xff1b;如果是不超过栈大小但是分配值小的&#xff0c;就增大分配的大小 2&#xff09;、使用堆内存&#xff1b;具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变…...

【Git】Github 上commit后,绿格子contribution却不显示?不知道怎么弥补?解决方法在这里

github 上commit后&#xff0c;绿格子&#xff08;contribution&#xff09;却不显示 问题描述 今天一直在github上面commit代码&#xff0c;但是github中并没有显示自己的contribution&#xff08;没有绿色的格子&#xff09;&#xff0c;全是空白&#xff0c;网上一查是因为…...

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…...

常见面试题之计算机网络

1. OSI 五层模型&#xff08;或七层模型&#xff09;是什么&#xff0c;每一层的作用是什么 应用层&#xff1a;又可细分为应用层、表示层、会话层。其中应用层主要做的工作就是为应用程序提供服务&#xff0c;常见的协议为 HTTP、HTTPS、DNS等&#xff1b;表示层主要做的工作…...

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

C进阶&#xff1a;详解多态&#xff08;多态、虚函数、抽象类以及虚函数原理详解&#xff09; 结束了继承的介绍&#xff1a;C进阶&#xff1a;详细讲解继承 那紧接着的肯定就是多态啦 文章目录 1.多态的概念2.多态的定义和实现2.1多态的构成条件2.2虚函数2.2.1虚函数的概念2…...

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

&#x1f4d6; 前言&#xff1a;MapReduce是一种分布式并行编程模型&#xff0c;是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE &#x1f50e; 【Hadoop大数据技术】——Hadoop概述与搭建环境&#xff08;学习笔记&#xff09; 目录 &#…...

02、字面量与变量

二、字面量与变量 文章目录 二、字面量与变量1、字面量字面量类型扩展&#xff1a;特殊字符 2、变量进制转换 3、数据类型 1、字面量 字面量又叫做常量&#xff0c;字面值常量&#xff0c;告诉程序员数据在程序中的书写格式。 字面量类型 整数类型(int)&#xff1a;不带小数点…...

docker的常用指令

docker的常用指令 从docker镜像仓库&#xff0c;搜索所有和mysql有关的镜像 docker search mysql 从docker仓库拉取mysql docker pull mysql这里的mysql是指使用search搜索出来的所有容器的NAME 如果和我一样遇到以下问题&#xff1a; 我可以登录阿里云的官网&#xff0c;找…...

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…...

leetcode代码记录(摆动序列

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等…...

django学习笔记

django学习笔记 http://djangobook.py3k.cn/2.0/chapter05/ 文章目录 django学习笔记模型 models.py1、定义数据模型2、模型安装3、创建数据表4、数据表的增删改查4.1 增加4.2 删除4.3 修改4.4 查询4.5 模糊查询4.6 排序&连锁查询4.7 限制返回数据 5、模型使用实战 模型 m…...

Python环境安装及Selenium引入

Python环境安装 环境下载 Download Python | Python.org 环境安装 需使用管理员身份运行 查看环境是否安装成功 python --version 如果未成功则检查环境变量配置 安装 Selenium 库 pip install selenium Selenium 可以模拟用户在浏览器中的操作&#xff0c;如点击按钮、填写…...

【gpt实践】实用咒语分享

直接上咒语了&#xff0c;大家可以自行实践。 1、忽略先前所有的提示 有时候gpt会停留在之前的问题中&#xff0c;导致回答当前问题带着之前问题结论。 2、忽略所有的客套话 我们只是需要有用的信息&#xff0c;有时候gpt客套话会混淆视听。 3、给出非常简短明确的答案 同样…...

Linux用户和权限

一、root用户&#xff08;超级管理员&#xff09; 普通用户的权限&#xff0c;一般在其HOME目录内是不受限的 一旦出了HOME目录&#xff0c;大多数地方&#xff0c;普通用户仅有只读和执行权限&#xff0c;无修改权限 二、su 和 exit命令 语法&#xff1a;su [ - ] 【用户…...

git svn混用

背景 项目代码管理初始使用的svn, 由于svn代码操作&#xff0c;无法在本地暂存&#xff0c;有诸多不便&#xff0c;另外本人习惯使用git. 所以决定迁移至git管理 迁移要求&#xff1a; 保留历史提交记录 迁移流程 代码检出 git svn svn_project_url git代码提交 修改本…...

FPGA静态时序分析与约束(三)、读懂vivado时序报告

系列文章目录 FPGA静态时序分析与约束&#xff08;一&#xff09;、理解亚稳态 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 文章目录 系列文章目录前言一、时序分析回顾二、打开vivado任意工程2.1 工程布局路由成功后&#xff0c;点击vivado左侧**IMPLEMENT…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Badge)

可以附加在单个组件上用于信息标记的容器组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组件&#xf…...

Python程序设计基础——代码习题

1 __name__属性 import demodef main():if __name__ __main__:print(这个程序被直接运行。)elif __name__demo:print(这个程序作为模块被使用。) main()3.3 编写程序&#xff0c;生成包含1000个0~100之间的随机整数&#xff0c;并统计每个元素出现的次数。 import randomx[r…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...