package tools import ( "crypto/md5" "crypto/rand" "fmt" "io" "reflect" "strings" "unicode/utf8" ) // Empty 类似于 PHP 的 empty() 函数 func Empty(val interface{}) bool { if val == nil { return true } v := reflect.ValueOf(val) switch v.Kind() { case reflect.String, reflect.Array: return v.Len() == 0 case reflect.Map, reflect.Slice: return v.Len() == 0 || v.IsNil() case reflect.Bool: return !v.Bool() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return v.Int() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return v.Uint() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 case reflect.Interface, reflect.Ptr: return v.IsNil() } return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface()) } // FirstElement 安全地获取 args[0],避免 panic: runtime error: index out of range func FirstElement(args []string) string { if len(args) > 0 { return args[0] } return "" } // RandomNumber 生成长度为 length 随机数字字符串 func RandomNumber(length int) string { table := [...]byte{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} b := make([]byte, length) n, err := io.ReadAtLeast(rand.Reader, b, length) if n != length { panic(err) } for i := 0; i < len(b); i++ { b[i] = table[int(b[i])%len(table)] } return string(b) } // RandomString 生成长度为 length 的随机字符串 func RandomString(length int) string { b := make([]byte, length) _, err := rand.Read(b) if err != nil { panic(err) } letters := "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" for i, v := range b { b[i] = letters[v%byte(len(letters))] } return string(b) } // MD5 生成字符串的 MD5 值 func MD5(str string) string { return fmt.Sprintf("%x", md5.Sum([]byte(str))) } // FormatBytes 格式化bytes func FormatBytes(size float64) string { units := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} i := 0 for ; size >= 1024 && i < len(units); i++ { size /= 1024 } return fmt.Sprintf("%.2f %s", size, units[i]) } // Cut 裁剪字符串 func Cut(str, begin, end string) string { bIndex := strings.Index(str, begin) eIndex := strings.Index(str, end) if bIndex == -1 || eIndex == -1 || bIndex > eIndex { return "" } b := utf8.RuneCountInString(str[:bIndex]) + utf8.RuneCountInString(begin) e := utf8.RuneCountInString(str[:eIndex]) if b > e { return "" } return string([]rune(str)[b:e]) }