package utils import ( "strings" "unicode" "unicode/utf8" ) // IsBlank 检查字符串是否为空或仅包含空白字符 func IsBlank(s string) bool { if s == "" { return true } for _, r := range s { if !unicode.IsSpace(r) { return false } } return true } // IsNotBlank 检查字符串是否非空且不全是空白字符 func IsNotBlank(s string) bool { return !IsBlank(s) } // IsAnyBlank 检查多个字符串中是否有任意一个为空或空白 func IsAnyBlank(strs ...string) bool { for _, s := range strs { if IsBlank(s) { return true } } return false } // IsAllBlank 检查所有字符串是否都为空或空白 func IsAllBlank(strs ...string) bool { for _, s := range strs { if IsNotBlank(s) { return false } } return true } // DefaultIfBlank 如果字符串为空或空白,返回默认值 func DefaultIfBlank(s, def string) string { if IsBlank(s) { return def } return s } // IsEmpty 检查任意类型是否为空值。 // // 实际支持(N4 文档修正):nil、空 string、空 []byte。 // 注意:通用 []T / map[K]V 走 default 分支恒返回 false(不为空)——若需对任意 slice/map // 判空,请用 len() 显式判断。文档原称支持 slice/map 与实现不符,已修正。 func IsEmpty(v any) bool { if v == nil { return true } switch val := v.(type) { case string: return val == "" case []byte: return len(val) == 0 default: return false } } // Trim 去除字符串首尾的空白字符(包括空格、制表符、换行符) func Trim(s string) string { return trimFunc(s, unicode.IsSpace) } // trimFunc 内部修剪函数 func trimFunc(s string, f func(rune) bool) string { s = trimLeftFunc(s, f) return trimRightFunc(s, f) } func trimLeftFunc(s string, f func(rune) bool) string { for i, r := range s { if !f(r) { return s[i:] } } return "" } func trimRightFunc(s string, f func(rune) bool) string { for i := len(s); i > 0; { r, size := utf8.DecodeLastRuneInString(s[:i]) if !f(r) { return s[:i] } i -= size } return "" } // Substr 截取子字符串(按 Unicode 字符计数)。 // start 支持负数(从末尾计算);start 越界或 length<=0 返回空串;length 超出末尾自动截断。 // 参数: start 起始位置(支持负数从末尾计算),length 截取长度 func Substr(s string, start, length int) string { runes := []rune(s) lenRunes := len(runes) if lenRunes == 0 { return "" } // 处理负数起始位置 if start < 0 { start = lenRunes + start } if start < 0 { start = 0 } if start >= lenRunes { return "" } end := start + length if end > lenRunes { end = lenRunes } if end <= start { return "" } return string(runes[start:end]) } // StrLen 获取字符串的 Unicode 字符数 func StrLen(s string) int { return utf8.RuneCountInString(s) } // EqualsIgnoreCase 不区分大小写比较字符串。 // // L-C 修复:改用 strings.EqualFold(标准库 Unicode 大小写折叠)。原实现仅做 ASCII // 字节级折叠('A'-'Z' → +32),对非 ASCII 字符(如 "É" vs "é")误判为不等。 // EqualFold 同时更快(无逐字节循环开销)。 func EqualsIgnoreCase(a, b string) bool { return strings.EqualFold(a, b) }