2022-11-24 23:37:34 +08:00
|
|
|
|
// Package charset
|
|
|
|
|
// @Link https://github.com/bufanyun/hotgo
|
|
|
|
|
// @Copyright Copyright (c) 2022 HotGo CLI
|
|
|
|
|
// @Author Ms <133814250@qq.com>
|
|
|
|
|
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
|
|
|
|
//
|
|
|
|
|
package charset
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"crypto/rand"
|
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
|
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
|
|
|
"hotgo/utility/convert"
|
|
|
|
|
r "math/rand"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// SplitMemberIds 从截取字串符中读取用户ID
|
|
|
|
|
func SplitMemberIds(str, pos string) (memberIds []int64) {
|
|
|
|
|
receiver := strings.Split(strings.TrimSpace(str), pos)
|
|
|
|
|
if len(receiver) == 0 {
|
|
|
|
|
return memberIds
|
|
|
|
|
}
|
|
|
|
|
if len(receiver) == 1 && strings.TrimSpace(receiver[0]) == "" {
|
|
|
|
|
return memberIds
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, memberId := range receiver {
|
|
|
|
|
memberIds = append(memberIds, gconv.Int64(strings.TrimSpace(memberId)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return convert.UniqueSliceInt64(memberIds)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetMapKeysByString 获取map的所有key,字串符类型
|
|
|
|
|
func GetMapKeysByString(m map[string]string) []string {
|
|
|
|
|
// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高
|
|
|
|
|
j := 0
|
|
|
|
|
keys := make([]string, len(m))
|
|
|
|
|
for k := range m {
|
|
|
|
|
keys[j] = k
|
|
|
|
|
j++
|
|
|
|
|
}
|
|
|
|
|
return keys
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RandomCreateBytes 生成随机字串符
|
|
|
|
|
func RandomCreateBytes(n int, alphabets ...byte) []byte {
|
|
|
|
|
if len(alphabets) == 0 {
|
|
|
|
|
alphabets = []byte(`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`)
|
|
|
|
|
}
|
|
|
|
|
var bytes = make([]byte, n)
|
|
|
|
|
var randBy bool
|
|
|
|
|
r.Seed(time.Now().UnixNano())
|
|
|
|
|
if num, err := rand.Read(bytes); num != n || err != nil {
|
|
|
|
|
randBy = true
|
|
|
|
|
}
|
|
|
|
|
for i, b := range bytes {
|
|
|
|
|
if randBy {
|
|
|
|
|
bytes[i] = alphabets[r.Intn(len(alphabets))]
|
|
|
|
|
} else {
|
|
|
|
|
bytes[i] = alphabets[b%byte(len(alphabets))]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return bytes
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-25 11:49:21 +08:00
|
|
|
|
// ParseErrStack 解析错误的堆栈信息
|
|
|
|
|
func ParseErrStack(err error) []string {
|
|
|
|
|
return ParseStack(gerror.Stack(err))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ParseStack 解析堆栈信息
|
|
|
|
|
func ParseStack(st string) []string {
|
|
|
|
|
stack := gstr.Split(st, "\n")
|
2023-01-18 16:23:39 +08:00
|
|
|
|
for i := 0; i < len(stack); i++ {
|
|
|
|
|
stack[i] = gstr.Replace(stack[i], "\t", "--> ")
|
2022-11-24 23:37:34 +08:00
|
|
|
|
}
|
2023-01-18 16:23:39 +08:00
|
|
|
|
return stack
|
2022-11-24 23:37:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SubstrAfter 截取指定字符后的内容
|
|
|
|
|
func SubstrAfter(str string, symbol string) string {
|
|
|
|
|
comma := strings.Index(str, symbol)
|
|
|
|
|
if comma < 0 { // -1 不存在
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
pos := strings.Index(str[comma:], symbol)
|
|
|
|
|
if comma+pos+1 > len(str) {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return str[comma+pos+1:]
|
|
|
|
|
}
|