Files
ttstd-infinite-canvas/backend/internal/kernel/util.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 }