1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/magiclvzs-antnet

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
func.go 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
magiclvzs Отправлено 18.08.2020 08:31 3dd2db5
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
package antnet
import (
"bytes"
"crypto/md5"
"encoding/gob"
"encoding/hex"
"errors"
"math/rand"
"os"
"os/exec"
"os/signal"
"path/filepath"
"reflect"
"strconv"
"strings"
"sync/atomic"
"syscall"
"time"
)
func AddStopCheck(cs string) uint64 {
id := atomic.AddUint64(&stopCheckIndex, 1)
if id == 0 {
id = atomic.AddUint64(&stopCheckIndex, 1)
}
stopCheckMap.Lock()
stopCheckMap.M[id] = cs
stopCheckMap.Unlock()
return id
}
func RemoveStopCheck(id uint64) {
stopCheckMap.Lock()
delete(stopCheckMap.M, id)
stopCheckMap.Unlock()
}
func AtExit(fun func()) {
id := atomic.AddUint32(&atexitId, 1)
if id == 0 {
id = atomic.AddUint32(&atexitId, 1)
}
atexitMapSync.Lock()
atexitMap[id] = fun
atexitMapSync.Unlock()
}
func Stop() {
if !atomic.CompareAndSwapInt32(&stop, 0, 1) {
return
}
close(stopChanForGo)
for sc := 0; !waitAll.TryWait(); sc++ {
Sleep(1)
if sc >= Config.StopTimeout {
LogError("Server Stop Timeout")
stopCheckMap.Lock()
for _, v := range stopCheckMap.M {
LogError("Server Stop Timeout:%v", v)
}
stopCheckMap.Unlock()
break
}
}
LogInfo("Server Stop")
close(stopChanForSys)
}
func IsStop() bool {
return stop == 1
}
func IsRuning() bool {
return stop == 0
}
func CmdAct(cmd, act uint8) int {
return int(cmd)<<8 + int(act)
}
func Tag(cmd, act uint8, index uint16) int {
return int(cmd)<<16 + int(act)<<8 + int(index)
}
func MD5Str(s string) string {
return MD5Bytes([]byte(s))
}
func MD5Bytes(s []byte) string {
md5Ctx := md5.New()
md5Ctx.Write(s)
cipherStr := md5Ctx.Sum(nil)
return hex.EncodeToString(cipherStr)
}
func MD5File(path string) string {
data, err := ReadFile(path)
if err != nil {
LogError("calc md5 failed path:%v", path)
return ""
}
return MD5Bytes(data)
}
func WaitForSystemExit(atexit ...func()) {
statis.StartTime = time.Now()
signal.Notify(stopChanForSys, os.Interrupt, os.Kill, syscall.SIGTERM)
select {
case <-stopChanForSys:
Stop()
}
for _, v := range atexit {
if v != nil {
v()
}
}
atexitMapSync.Lock()
for _, v := range atexitMap {
v()
}
atexitMapSync.Unlock()
for _, v := range redisManagers {
v.close()
}
waitAllForRedis.Wait()
if !atomic.CompareAndSwapInt32(&stopForLog, 0, 1) {
return
}
close(stopChanForLog)
waitAllForLog.Wait()
}
func Daemon(skip ...string) {
if os.Getppid() != 1 {
filePath, _ := filepath.Abs(os.Args[0])
newCmd := []string{os.Args[0]}
add := 0
for _, v := range os.Args[1:] {
if add == 1 {
add = 0
continue
} else {
add = 0
}
for _, s := range skip {
if strings.Contains(v, s) {
if strings.Contains(v, "--") {
add = 2
} else {
add = 1
}
break
}
}
if add == 0 {
newCmd = append(newCmd, v)
}
}
Println("go daemon args:", newCmd)
cmd := exec.Command(filePath)
cmd.Args = newCmd
cmd.Start()
}
}
func GetStatis() *Statis {
statis.GoCount = int(gocount)
statis.MsgqueCount = len(msgqueMap)
statis.PoolGoCount = poolGoCount
return statis
}
func Atoi(str string) int {
i, err := strconv.Atoi(str)
if err != nil {
return 0
}
return i
}
func Atoi64(str string) int64 {
i, err := strconv.ParseInt(str, 10, 64)
if err != nil {
LogError("str to int64 failed err:%v", err)
return 0
}
return i
}
func Atof(str string) float32 {
i, err := strconv.ParseFloat(str, 32)
if err != nil {
LogError("str to int64 failed err:%v", err)
return 0
}
return float32(i)
}
func Atof64(str string) float64 {
i, err := strconv.ParseFloat(str, 64)
if err != nil {
LogError("str to int64 failed err:%v", err)
return 0
}
return i
}
func Itoa(num interface{}) string {
switch n := num.(type) {
case int8:
return strconv.FormatInt(int64(n), 10)
case int16:
return strconv.FormatInt(int64(n), 10)
case int32:
return strconv.FormatInt(int64(n), 10)
case int:
return strconv.FormatInt(int64(n), 10)
case int64:
return strconv.FormatInt(int64(n), 10)
case uint8:
return strconv.FormatUint(uint64(n), 10)
case uint16:
return strconv.FormatUint(uint64(n), 10)
case uint32:
return strconv.FormatUint(uint64(n), 10)
case uint:
return strconv.FormatUint(uint64(n), 10)
case uint64:
return strconv.FormatUint(uint64(n), 10)
}
return ""
}
func Try(fun func(), handler func(interface{})) {
defer func() {
if err := recover(); err != nil {
if handler == nil {
LogStack()
LogError("error catch:%v", err)
} else {
handler(err)
}
atomic.AddInt32(&statis.PanicCount, 1)
statis.LastPanic = int(Timestamp)
}
}()
fun()
}
func Try2(fun func(), handler func(interface{})) {
defer func() {
if err := recover(); err != nil {
LogStack()
LogError("error catch:%v", err)
if handler != nil {
handler(err)
}
atomic.AddInt32(&statis.PanicCount, 1)
statis.LastPanic = int(Timestamp)
}
}()
fun()
}
func ParseBaseKind(kind reflect.Kind, data string) (interface{}, error) {
switch kind {
case reflect.String:
return data, nil
case reflect.Bool:
v := data == "1" || data == "true"
return v, nil
case reflect.Int:
x, err := strconv.ParseInt(data, 0, 64)
return int(x), err
case reflect.Int8:
x, err := strconv.ParseInt(data, 0, 8)
return int8(x), err
case reflect.Int16:
x, err := strconv.ParseInt(data, 0, 16)
return int16(x), err
case reflect.Int32:
x, err := strconv.ParseInt(data, 0, 32)
return int32(x), err
case reflect.Int64:
x, err := strconv.ParseInt(data, 0, 64)
return int64(x), err
case reflect.Float32:
x, err := strconv.ParseFloat(data, 32)
return float32(x), err
case reflect.Float64:
x, err := strconv.ParseFloat(data, 64)
return float64(x), err
case reflect.Uint:
x, err := strconv.ParseUint(data, 10, 64)
return uint(x), err
case reflect.Uint8:
x, err := strconv.ParseUint(data, 10, 8)
return uint8(x), err
case reflect.Uint16:
x, err := strconv.ParseUint(data, 10, 16)
return uint16(x), err
case reflect.Uint32:
x, err := strconv.ParseUint(data, 10, 32)
return uint32(x), err
case reflect.Uint64:
x, err := strconv.ParseUint(data, 10, 64)
return uint64(x), err
default:
LogError("parse failed type not found type:%v data:%v", kind, data)
return nil, errors.New("type not found")
}
}
func GobPack(e interface{}) ([]byte, error) {
var bio bytes.Buffer
enc := gob.NewEncoder(&bio)
err := enc.Encode(e)
if err != nil {
return nil, ErrGobPack
}
return bio.Bytes(), nil
}
func GobUnPack(data []byte, msg interface{}) error {
bio := bytes.NewBuffer(data)
enc := gob.NewDecoder(bio)
err := enc.Decode(msg)
if err != nil {
return ErrGobUnPack
}
return nil
}
func ParseBool(s string) bool {
if s == "1" || s == "true" {
return true
}
return false
}
func ParseUint32(s string) uint32 {
value, err := strconv.ParseUint(s, 10, 32)
if err != nil {
return 0
}
return uint32(value)
}
func ParseUint64(s string) uint64 {
value, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return 0
}
return uint64(value)
}
func ParseInt32(s string) int32 {
value, err := strconv.ParseInt(s, 10, 32)
if err != nil {
return 0
}
return int32(value)
}
func ParseInt64(s string) int64 {
value, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return 0
}
return int64(value)
}
//固定形式 x&y&z
func Split1(s string, retSlice *[]uint32) {
slice := strings.Split(s, "&")
*retSlice = make([]uint32, 0, len(slice))
for _, value := range slice {
*retSlice = append(*retSlice, ParseUint32(value))
}
}
//固定形式 x&y&z;a&b&c;l_m_n
func Split2(s string, retSlice *[][]uint32) {
slice1 := strings.Split(s, ";")
*retSlice = make([][]uint32, 0, len(slice1))
for _, value := range slice1 {
var sl1 []uint32
Split1(value, &sl1)
*retSlice = append(*retSlice, sl1)
}
}
//固定形式 x&y&z;a&b&c:x&y&z;a&b&c
func Split3(s string, retSlice *[][][]uint32) {
slice1 := strings.Split(s, ":")
*retSlice = make([][][]uint32, 0, len(slice1))
for _, value := range slice1 {
var sl2 [][]uint32
Split2(value, &sl2)
*retSlice = append(*retSlice, sl2)
}
}
//固定形式 x&y&z
func SplitString1(s string, retSlice *[]string) {
*retSlice = strings.Split(s, "&")
}
//固定形式 x&y&z;a&b&c;l_m_n
func SplitString2(s string, retSlice *[][]string) {
slice1 := strings.Split(s, ";")
*retSlice = make([][]string, 0, len(slice1))
for _, value := range slice1 {
*retSlice = append(*retSlice, strings.Split(value, "&"))
}
}
//固定形式 x&y&z;a&b&c:x&y&z;a&b&c:
func SplitString3(s string, retSlice *[][][]string) {
slice1 := strings.Split(s, ":")
*retSlice = make([][][]string, 0, len(slice1))
for _, value := range slice1 {
var sl2 [][]string
SplitString2(value, &sl2)
*retSlice = append(*retSlice, sl2)
}
}
//随机数返回[min,max)
func RandBetween(min, max int) int {
if min >= max || max == 0 {
return max
}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
random := r.Intn(max-min) + min
return random
}
func RandString(count int) string {
var randomstr string
for r := 0; r < count; r++ {
i := RandBetween(65, 90)
a := rune(i)
randomstr += string(a)
}
return randomstr
}
//随机数返回[min,max)中的count个不重复数值
//一般用来从数组中随机一部分数据的下标
//2个随机数种子保证参数相同,返回值不一定相同,达到伪随机目的
func RandSliceBetween(min, max, count int) []int {
if min > max {
min, max = max, min
}
if min == max || max == 0 || count <= 0 {
return []int{max}
}
randomRange := max - min
retSlice := make([]int, 0, count)
if count >= randomRange {
for i := min; i < max; i++ {
retSlice = append(retSlice, i)
}
return retSlice
}
r := rand.New(rand.NewSource(time.Now().Unix()))
random := r.Intn(randomRange) + min
baseRand := RandBetween(random*min, random*max)
retSlice = append(retSlice, random)
for i := 1; i < count; i++ {
random = (i+baseRand*random)%randomRange + min
isReapeated := false
for j := 0; j < count; j++ {
for _, v := range retSlice {
if random == v {
isReapeated = true
break
}
}
if isReapeated {
random = (random-min+1)%randomRange + min
} else {
break
}
}
retSlice = append(retSlice, random)
}
return retSlice
}
type valueWeightItem struct {
weight uint32
value uint64
}
// 权值对,根据权重随机一个值出来
type GBValueWeightPair struct {
allweight uint32
valuelist []*valueWeightItem
}
func NewValueWeightPair() *GBValueWeightPair {
return &GBValueWeightPair{}
}
func (this *GBValueWeightPair) Add(weight uint32, value uint64) {
if weight == 0 {
return
}
valueinfo := &valueWeightItem{weight, value}
this.valuelist = append(this.valuelist, valueinfo)
this.allweight += weight
}
func (this *GBValueWeightPair) Random() uint64 {
if 1 == len(this.valuelist) {
return this.valuelist[0].value
}
if this.allweight > 0 {
randvalue := uint32(rand.Intn(int(this.allweight))) + 1 //[1,allweight]
addweight := uint32(0)
for i := 0; i < len(this.valuelist); i++ {
addweight += this.valuelist[i].weight
if randvalue <= addweight {
return this.valuelist[i].value
}
}
}
return 0
}
func (this *GBValueWeightPair) GetValueList() []*valueWeightItem {
return this.valuelist
}
func SafeSubInt32(a, b int32) int32 {
if a > b {
return a - b
}
return 0
}
func SafeSub(a, b uint32) uint32 {
if a > b {
return a - b
}
return 0
}
func SafeSub64(a, b uint64) uint64 {
if a > b {
return a - b
}
return 0
}
func SafeSubInt64(a, b int64) int64 {
if a > b {
return a - b
}
return 0
}
//三元运算符
func Ternary(val1 bool, ret1, ret2 interface{}) interface{} {
if val1 {
return ret1
}
return ret2
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/magiclvzs-antnet.git
git@api.gitlife.ru:oschina-mirror/magiclvzs-antnet.git
oschina-mirror
magiclvzs-antnet
magiclvzs-antnet
master