首页 > 其他分享 >Golang常用的工具函数,无依赖,常更

Golang常用的工具函数,无依赖,常更

时间:2022-11-22 11:37:17浏览次数:38  
标签:secondIntervals 依赖 return 函数 error Golang offset ok string


util.go

// Execute f() n times on fail
func RetryHandler(n int, f func() (bool, error)) error {
ok, er := f()
if ok && er == nil {
return nil
}
if n-1 > 0 {
return RetryHandler(n-1, f)
}
return er
}

// Execute f() n times on fail, each time on fail will keep specific interval in order of `secondIntervals`
// If n < 0, it will forever execute f(), interval will used in order of `secondIntervals` and keep using the last interval element at last.
// Work in serial.
func RetryHandlerWithInterval(n int, f func() (bool, error), secondIntervals ... int) error {
var offset = 0
var ok bool
var e error
return retryHandlerWithIntervalOffset(&ok, &e, n, f, &offset, secondIntervals...)
}

// sub function of RetryHandlerWithInterval
func retryHandlerWithIntervalOffset(ok *bool, e *error, n int, f func() (bool, error), offset *int, secondIntervals ... int) error {
if n == 0 {
return nil
}
*ok, *e = f()
if *ok && *e == nil {
return nil
}

if n-1 > 0 && !(n < 0) {
if *offset < len(secondIntervals) {
time.Sleep(time.Duration(secondIntervals[*offset]) * time.Second)
if *offset < len(secondIntervals)-1 {
*offset ++
}
}
return retryHandlerWithIntervalOffset(ok, e, n-1, f, offset, secondIntervals...)
} else {
if n != 1 {
if *offset < len(secondIntervals) {
time.Sleep(time.Duration(secondIntervals[*offset]) * time.Second)
if *offset < len(secondIntervals)-1 {
*offset ++
}
}
return retryHandlerWithIntervalOffset(ok, e, n, f, offset, secondIntervals...)
}
}
return *e
}

// Generate random string 32 bit
func RandomString() string {
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var r *rand.Rand
var once = sync.Once{}
once.Do(func() {
r = rand.New(rand.NewSource(time.Now().UnixNano()))
})
var result string
for i := 0; i < 32; i++ {
result += string(str[r.Intn(len(str))])
}
return result
}
// MD5 encrypt returning upper case
func MD5(rawMsg string) string {
data := []byte(rawMsg)
has := md5.Sum(data)
md5str1 := fmt.Sprintf("%x", has)
return strings.ToUpper(md5str1)
}

// Returns well format output in json
func Debug(src interface{}) string {
buf, e := json.MarshalIndent(src, " ", " ")
if e != nil {
fmt.Println(errorx.Wrap(e).Error())
}
return string(buf)
}


标签:secondIntervals,依赖,return,函数,error,Golang,offset,ok,string
From: https://blog.51cto.com/u_11553781/5877246

相关文章

  • golang实现限制每秒多少次的限频操作
    前言一些函数的执行可能会限制频率,比如某个api接口要求每秒最大请求30次。下面记录了自己写的限频和官方的限频代码//加锁限频,输出次数大概率小于最大值funcExecLimit(las......
  • Golang学习日志 ━━ 理解依赖包的管理(mod/非mod)和加载方式(项目路径、相对路径、绝对
    go有很多种方法调用依赖包,mod又加入了对包的版本管理。方式太多不免有令人迷惑和混乱的地方,希望本文能帮助大家了解目前使用规则一、mod/非mod管理方式go提供了两种项目......
  • TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数
    为了准备电赛临时学一下TM4C123G,简单记录学习内容大家可以在​​这里​​下载我收集的资源,非常全面,花了很大功夫收集来的,还有书籍、例程代码等还可以在TI官网下载相关文档​......
  • 多元函数泰勒展开与黑塞矩阵
    文章目录​​1.引入:函数展开​​​​2.泰勒展开​​​​2.1一元函数泰勒展开​​​​2.2二元函数泰勒展开​​​​2.3n元函数泰勒展开​​​​3.黑塞矩阵(海森矩阵)​​......
  • 【C++】使用boost库的split函数分割字符串
    1#include<iostream>2#include<vector>3#include<boost/algorithm/string.hpp>45intmain(constintargc,constchar*argv[])6{7std::vect......
  • 自定义函数
    FIREDAC可以自定义sqlite的函数,方法如下:首先需要一个控件:TFDSQLiteFunction,其设置如下:sqlFunction.DriverLink:=FDPhysSQLiteDriverLink1;sqlFunction.FunctionName......
  • gets函数的理解和应用
    gets函数的用法。gets函数使用要加头文件#include<string.h>输入时用scanf("%d  ",&b); %d后的空格也可以用\n(换行)代替。此处的空格和换行都起到两个作用。1、结束s......
  • Vue3笔记 - Vue3中的计算属性、监视属性和watchEffect函数
    计算属性与监视属性目录计算属性与监视属性1.计算属性2.监视属性3.watchEffect函数1.计算属性Vue3中的计算属性仅在书写方式上与Vue2略有不同,功能上基本一致Vue2......
  • oracle中函数的简单使用
    --status为空返回3,不为空显示本身的值select*frompublic_memoccwherenvl(cc.status,'3')!='4'  --status为空显示数据为空,不为空显示本身的值s......
  • React类式组件和函数式组件的区别
    React类式组件和函数式组件的区别有哪些呢?  主要要以下几个区别:(1)语法不同、设计思想不同(2)生命周期、状态变量(3)复用性:(4)优缺点一、语法不同、设计思想不同函数式组件......