118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package utils
|
||
|
||
import (
|
||
"crypto/md5"
|
||
"fmt"
|
||
"reflect"
|
||
"runtime"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
type PushRestQ func(int, []string) error
|
||
|
||
// 获取当前函数名字
|
||
func GetFuncName() string {
|
||
pc := make([]uintptr, 1)
|
||
runtime.Callers(2, pc)
|
||
f := runtime.FuncForPC(pc[0])
|
||
return f.Name()
|
||
}
|
||
|
||
// 定时器,每隔mdura这么长时间,轮询一个周期,每个周期内分成 len(ary) 个时间分片,每个分片用来执行一个pr程序, pr会得到当前分片的id和ary本身作为入参
|
||
func TickerWrapper(mdura time.Duration, ary []string, pr PushRestQ) {
|
||
done := make(chan bool)
|
||
idx := 0
|
||
per2 := time.Duration(mdura) / time.Duration(len(ary)+2)
|
||
// fmt.Println("mdura, len of ary, per2: ", mdura, len(ary), per2)
|
||
if per2 < 100*time.Millisecond {
|
||
per2 = 100 * time.Millisecond
|
||
}
|
||
ticker := time.NewTicker(per2)
|
||
go func(i int) {
|
||
for {
|
||
select {
|
||
case <-ticker.C:
|
||
if i >= (len(ary) - 1) {
|
||
done <- true
|
||
break
|
||
}
|
||
go func(i int) {
|
||
err := pr(i, ary)
|
||
if err != nil {
|
||
fmt.Println("inner err: ", err)
|
||
}
|
||
}(i)
|
||
i++
|
||
}
|
||
}
|
||
}(idx)
|
||
time.Sleep(mdura)
|
||
}
|
||
|
||
func HashDispatch(originName string, count uint8) int {
|
||
data := []byte(originName)
|
||
bytes := md5.Sum(data)
|
||
res := uint8(0)
|
||
for _, v := range bytes {
|
||
res += v
|
||
}
|
||
res = res % count
|
||
return int(res)
|
||
}
|
||
|
||
func IsoTime() string {
|
||
utcTime := time.Now().UTC()
|
||
iso := utcTime.String()
|
||
isoBytes := []byte(iso)
|
||
iso = string(isoBytes[:10]) + "T" + string(isoBytes[11:23]) + "Z"
|
||
return iso
|
||
}
|
||
|
||
// 闹钟,
|
||
func Fenci(count int) bool {
|
||
tsi := time.Now().Unix()
|
||
tsi = tsi - tsi%60
|
||
cha := tsi % (int64(count))
|
||
if cha == 0 {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
func ToString(val interface{}) string {
|
||
valstr := ""
|
||
if reflect.TypeOf(val).Name() == "string" {
|
||
valstr = val.(string)
|
||
} else if reflect.TypeOf(val).Name() == "float64" {
|
||
valstr = fmt.Sprintf("%f", val)
|
||
} else if reflect.TypeOf(val).Name() == "int64" {
|
||
valstr = strconv.FormatInt(val.(int64), 16)
|
||
}
|
||
return valstr
|
||
}
|
||
|
||
func ToInt64(val interface{}) int64 {
|
||
vali := int64(0)
|
||
if reflect.TypeOf(val).Name() == "string" {
|
||
vali, _ = strconv.ParseInt(val.(string), 10, 64)
|
||
} else if reflect.TypeOf(val).Name() == "float64" {
|
||
vali = int64(val.(float64))
|
||
}
|
||
return vali
|
||
}
|
||
|
||
func ToFloat64(val interface{}) float64 {
|
||
valf := float64(0)
|
||
ctype := reflect.TypeOf(val).Name()
|
||
if ctype == "string" {
|
||
valf, _ = strconv.ParseFloat(val.(string), 64)
|
||
} else if reflect.TypeOf(val).Name() == "float64" {
|
||
valf = val.(float64)
|
||
} else if reflect.TypeOf(val).Name() == "int64" {
|
||
valf = float64(val.(int64))
|
||
} else {
|
||
fmt.Println("convert err:", val, ":", ctype)
|
||
}
|
||
return valf
|
||
}
|