83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
package kernel
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// NewID 生成唯一标识符。
|
|
func NewID() string {
|
|
var b [16]byte
|
|
if _, err := rand.Read(b[:]); err != nil {
|
|
return fmt.Sprintf("%d", time.Now().UnixNano())
|
|
}
|
|
return hex.EncodeToString(b[:])
|
|
}
|
|
|
|
// FirstNonEmpty 返回第一个非空字符串。
|
|
func FirstNonEmpty(values ...string) string {
|
|
for _, value := range values {
|
|
if strings.TrimSpace(value) != "" {
|
|
return strings.TrimSpace(value)
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// UniqueNonEmpty 去重并过滤空字符串。
|
|
func UniqueNonEmpty(values []string) []string {
|
|
seen := map[string]bool{}
|
|
result := make([]string, 0, len(values))
|
|
for _, value := range values {
|
|
value = strings.TrimSpace(value)
|
|
if value == "" || seen[value] {
|
|
continue
|
|
}
|
|
seen[value] = true
|
|
result = append(result, value)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// DefaultString 返回非空值或回退值。
|
|
func DefaultString(value string, fallback string) string {
|
|
if strings.TrimSpace(value) == "" {
|
|
return fallback
|
|
}
|
|
return value
|
|
}
|
|
|
|
// Ptr 返回值的指针。
|
|
func Ptr[T any](value T) *T {
|
|
return &value
|
|
}
|
|
|
|
// StringValue 从任意值提取字符串。
|
|
func StringValue(value any) string {
|
|
if value == nil {
|
|
return ""
|
|
}
|
|
if text, ok := value.(string); ok {
|
|
return text
|
|
}
|
|
return fmt.Sprintf("%v", value)
|
|
}
|
|
|
|
// TruncateRunes 截断字符串到指定 rune 数。
|
|
func TruncateRunes(value string, limit int) string {
|
|
runes := []rune(value)
|
|
if len(runes) <= limit {
|
|
return value
|
|
}
|
|
return string(runes[:limit]) + "..."
|
|
}
|
|
|
|
// Megabytes 转换 MB 到字节。
|
|
func Megabytes(value int64) int64 { return value << 20 }
|
|
|
|
// Gigabytes 转换 GB 到字节。
|
|
func Gigabytes(value int64) int64 { return value << 30 }
|