init
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// IsBlank 检查字符串是否为空或仅包含空白字符
|
||||
// 评分: ⭐⭐⭐⭐⭐
|
||||
// 理由: 常用函数,正确处理 Unicode 空白字符
|
||||
func IsBlank(s string) bool {
|
||||
if s == "" {
|
||||
return true
|
||||
}
|
||||
for _, r := range s {
|
||||
if !unicode.IsSpace(r) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// IsNotBlank 检查字符串是否非空且不全是空白字符
|
||||
// 评分: ⭐⭐⭐⭐⭐
|
||||
// 理由: IsBlank 的反向,语义更清晰
|
||||
func IsNotBlank(s string) bool {
|
||||
return !IsBlank(s)
|
||||
}
|
||||
|
||||
// IsAnyBlank 检查多个字符串中是否有任意一个为空或空白
|
||||
// 评分: ⭐⭐⭐⭐
|
||||
// 理由: 参数校验场景常用,避免多次调用 IsBlank
|
||||
func IsAnyBlank(strs ...string) bool {
|
||||
for _, s := range strs {
|
||||
if IsBlank(s) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsAllBlank 检查所有字符串是否都为空或空白
|
||||
// 评分: ⭐⭐⭐⭐
|
||||
// 理由: IsAnyBlank 的反向,适用于批量校验
|
||||
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 检查任意类型是否为空值
|
||||
// 评分: ⭐⭐⭐
|
||||
// 理由: 功能实用,但使用反射有性能开销;建议仅在必要时使用
|
||||
// 支持: string, []T, map[K]V, nil, 零值
|
||||
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 去除字符串首尾的空白字符(包括空格、制表符、换行符)
|
||||
// 评分: ⭐⭐⭐⭐
|
||||
// 理由: 比标准库 strings.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 起始位置(支持负数从末尾计算),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 字符数
|
||||
// 评分: ⭐⭐⭐⭐⭐
|
||||
// 理由: 正确计算多字节字符长度,比 len() 更准确
|
||||
func StrLen(s string) int {
|
||||
return utf8.RuneCountInString(s)
|
||||
}
|
||||
|
||||
// EqualsIgnoreCase 不区分大小写比较字符串
|
||||
// 评分: ⭐⭐⭐⭐
|
||||
// 理由: 常用比较函数,使用标准库实现保证正确性
|
||||
func EqualsIgnoreCase(a, b string) bool {
|
||||
if a == b {
|
||||
return true
|
||||
}
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < len(a); i++ {
|
||||
ca := a[i]
|
||||
cb := b[i]
|
||||
if ca != cb {
|
||||
// 转小写比较
|
||||
if ca >= 'A' && ca <= 'Z' {
|
||||
ca += 32
|
||||
}
|
||||
if cb >= 'A' && cb <= 'Z' {
|
||||
cb += 32
|
||||
}
|
||||
if ca != cb {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user