XStr Guide - zhoudm1743/go-util GitHub Wiki
XStr 是 Go-Util 的核心字符串处理工具,提供了丰富的字符串操作方法,支持链式调用,让字符串处理变得简单而优雅。
- 🔗 链式调用: 流畅的方法链,提高代码可读性
- 🛡️ 类型安全: 编译时类型检查,避免运行时错误
- ⚡ 高性能: 优化的算法实现,最小化内存分配
- 🌍 国际化: 完整的 Unicode 和中文支持
- 📝 丰富功能: 涵盖常见字符串操作场景
- 🔧 易扩展: 支持自定义验证和转换函数
import util "github.com/zhoudm1743/go-util"
// 从字符串创建
str := util.Str("hello world")
// 从其他类型创建
num := util.Str(123) // "123"
flag := util.Str(true) // "true"
price := util.Str(3.14) // "3.14"
// 空字符串
empty := util.Str("")
str := util.Str("Hello, 世界!")
// 长度信息
fmt.Println(str.Len()) // 9 (字节长度)
fmt.Println(str.RuneCount()) // 8 (字符数,支持中文)
// 状态检查
fmt.Println(str.IsEmpty()) // false
fmt.Println(str.IsBlank()) // false (非空且非空白)
// 获取原始字符串
original := str.String() // "Hello, 世界!"
str := util.Str("Hello World")
// 大小写转换
upper := str.Upper().String() // "HELLO WORLD"
lower := str.Lower().String() // "hello world"
// 首字母处理
firstUpper := str.FirstUpper().String() // "Hello world"
firstLower := str.FirstLower().String() // "hello World"
// 标题格式 (每个单词首字母大写)
title := str.Title().String() // "Hello World"
// 不同命名风格的转换
snake := util.Str("userName").String()
// Snake Case (蛇形命名)
snakeCase := util.Str("userName").Camel2Snake().String() // "user_name"
snakeCase2 := util.Str("UserNameExample").BigCamel2Snake().String() // "user_name_example"
// Camel Case (驼峰命名)
camelCase := util.Str("user_name").Snake2Camel().String() // "userName"
bigCamelCase := util.Str("user_name").Snake2BigCamel().String() // "UserName"
// Kebab Case (短横线命名)
kebabCase := util.Str("userName").Camel2Kebab().String() // "user-name"
camelFromKebab := util.Str("user-name").Kebab2Camel().String() // "userName"
// 复杂示例
complexStr := util.Str("user_profile_settings").
Snake2BigCamel(). // "UserProfileSettings"
BigCamel2Kebab(). // "user-profile-settings"
Kebab2Camel(). // "userProfileSettings"
String()
str := util.Str(" hello world \n\t")
// 基础修剪
trimmed := str.Trim().String() // "hello world"
leftTrim := str.TrimLeft().String() // "hello world \n\t"
rightTrim := str.TrimRight().String() // " hello world"
// 自定义字符修剪
custom := util.Str("...hello...").
TrimPrefix("..."). // "hello..."
TrimSuffix("..."). // "hello"
String()
str := util.Str("Hello, World!")
// 基础截取
sub := str.Substring(0, 5).String() // "Hello"
sub2 := str.Substring(7, -1).String() // "World!"
// 长度限制
truncated := str.Truncate(10).String() // "Hello, Wor"
truncatedWithSuffix := str.TruncateWithSuffix(10, "...").String() // "Hello, W..."
// 左右截取
left := str.Left(5).String() // "Hello"
right := str.Right(6).String() // "World!"
str := util.Str("Hello, World! 123")
// 包含检查
hasHello := str.Contains("Hello") // true
hasPrefix := str.HasPrefix("Hello") // true
hasSuffix := str.HasSuffix("123") // true
// 位置查找
index := str.Index("World") // 7
lastIndex := str.LastIndex("l") // 10
count := str.Count("l") // 3
// 数字检查
num := util.Str("123")
fmt.Println(num.IsNumeric()) // true
fmt.Println(num.IsInt()) // true
fmt.Println(num.IsFloat()) // true
decimal := util.Str("123.45")
fmt.Println(decimal.IsNumeric()) // true
fmt.Println(decimal.IsInt()) // false
fmt.Println(decimal.IsFloat()) // true
// 字母检查
alpha := util.Str("Hello")
fmt.Println(alpha.IsAlpha()) // true
fmt.Println(alpha.IsAlphaNumeric()) // true
mixed := util.Str("Hello123")
fmt.Println(mixed.IsAlpha()) // false
fmt.Println(mixed.IsAlphaNumeric()) // true
// 邮箱验证
email := util.Str("[email protected]")
fmt.Println(email.IsEmail()) // true
// URL 验证
url := util.Str("https://www.example.com")
fmt.Println(url.IsURL()) // true
// IP 地址验证
ip := util.Str("192.168.1.1")
fmt.Println(ip.IsIP()) // true
fmt.Println(ip.IsIPv4()) // true
ipv6 := util.Str("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
fmt.Println(ipv6.IsIPv6()) // true
// 手机号验证 (中国)
phone := util.Str("13812345678")
fmt.Println(phone.IsMobile()) // true
// JSON 格式验证
json := util.Str(`{"name": "test", "age": 25}`)
fmt.Println(json.IsJSON()) // true
str := util.Str("Hello, World! Hello, Go!")
// 简单替换
replaced := str.Replace("Hello", "Hi").String() // "Hi, World! Hi, Go!"
replaceFirst := str.ReplaceFirst("Hello", "Hi").String() // "Hi, World! Hello, Go!"
replaceLast := str.ReplaceLast("Hello", "Hi").String() // "Hello, World! Hi, Go!"
// 大小写忽略替换
ignoreCaseReplace := str.ReplaceIgnoreCase("hello", "Hi").String() // "Hi, World! Hi, Go!"
str := util.Str("Phone: 123-456-7890, Mobile: 987-654-3210")
// 正则匹配
phonePattern := `\d{3}-\d{3}-\d{4}`
matches := str.FindAllRegex(phonePattern) // ["123-456-7890", "987-654-3210"]
hasMatch := str.MatchRegex(phonePattern) // true
// 正则替换
masked := str.ReplaceRegex(`\d{3}-\d{3}-\d{4}`, "XXX-XXX-XXXX").String()
// "Phone: XXX-XXX-XXXX, Mobile: XXX-XXX-XXXX"
// 提取数字
numbers := util.Str("Price: $123.45, Tax: $12.34")
extractedNumbers := numbers.ExtractNumbers() // ["123.45", "12.34"]
str := util.Str("apple,banana,orange")
// 基础分割
parts := str.Split(",") // ["apple", "banana", "orange"]
partsWithLimit := str.SplitN(",", 2) // ["apple", "banana,orange"]
// 按行分割
multiLine := util.Str("line1\nline2\rline3\r\nline4")
lines := multiLine.SplitLines() // ["line1", "line2", "line3", "line4"]
// 按空白分割
words := util.Str(" hello world go ").SplitWhitespace()
// ["hello", "world", "go"]
// 连接字符串
result := util.Str("Hello").
Concat(", ").
Concat("World").
Concat("!").
String() // "Hello, World!"
// 使用分隔符连接数组
parts := []string{"apple", "banana", "orange"}
joined := util.StrJoin(parts, ", ") // "apple, banana, orange"
// 转换为数字
num := util.Str("123")
intVal := num.Int() // 123
int64Val := num.Int64() // int64(123)
floatVal := num.Float64() // 123.0
// 安全转换 (带错误检查)
safeInt, err := num.ToInt()
if err == nil {
fmt.Printf("转换成功: %d\n", safeInt)
}
// 带默认值的转换
defaultInt := util.Str("invalid").IntOr(0) // 0 (默认值)
defaultFloat := util.Str("invalid").Float64Or(0.0) // 0.0
// 布尔值转换
trueStr := util.Str("true")
fmt.Println(trueStr.Bool()) // true
// 支持多种格式
formats := []string{"true", "TRUE", "True", "1", "yes", "YES", "on", "ON"}
for _, format := range formats {
fmt.Printf("%s -> %t\n", format, util.Str(format).Bool())
}
// 带默认值
invalidBool := util.Str("invalid").BoolOr(false) // false
str := util.Str("Hello, World!")
// Base64 编码
encoded := str.Base64Encode().String() // "SGVsbG8sIFdvcmxkIQ=="
// Base64 解码
decoded := util.Str(encoded).Base64Decode().String() // "Hello, World!"
// URL 安全的 Base64
urlEncoded := str.Base64URLEncode().String()
urlDecoded := util.Str(urlEncoded).Base64URLDecode().String()
str := util.Str("Hello World & Go")
// URL 编码
urlEncoded := str.URLEncode().String() // "Hello%20World%20%26%20Go"
urlDecoded := util.Str(urlEncoded).URLDecode().String() // "Hello World & Go"
// 查询参数编码
queryEncoded := str.QueryEscape().String()
queryDecoded := util.Str(queryEncoded).QueryUnescape().String()
str := util.Str("<div>Hello & \"World\"</div>")
// HTML 编码
htmlEncoded := str.HTMLEscape().String() // "<div>Hello & "World"</div>"
htmlDecoded := util.Str(htmlEncoded).HTMLUnescape().String() // 原始字符串
str := util.Str("Hello, World!")
// 常用哈希
md5Hash := str.MD5().String() // "65a8e27d8879283831b664bd8b7f0ad4"
sha1Hash := str.SHA1().String() // "943a702d06f34599aee1f8da8ef9f7296031d699"
sha256Hash := str.SHA256().String() // "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f"
// 多重哈希
multiHash := str.MD5().SHA256().String() // 先MD5,再SHA256
// 随机字符串生成
randomStr := util.RandomString(10) // 生成10位随机字符串
randomAlpha := util.RandomAlphaString(8) // 生成8位字母字符串
randomNum := util.RandomNumericString(6) // 生成6位数字字符串
// UUID 生成
uuid := util.GenerateUUID() // 生成 UUID
str1 := util.Str("hello")
str2 := util.Str("hallo")
// 编辑距离
distance := str1.LevenshteinDistance(str2.String()) // 1
// 相似度百分比
similarity := str1.Similarity(str2.String()) // 0.8 (80%)
// 模糊匹配
fuzzyMatch := str1.FuzzyMatch(str2.String(), 0.7) // true (相似度超过70%)
str := util.Str("Hello, World! 123")
// 字符统计
charCount := str.CharCount() // map[rune]int
letterCount := str.LetterCount() // 字母数量
digitCount := str.DigitCount() // 数字数量
spaceCount := str.SpaceCount() // 空格数量
// 单词统计
wordCount := str.WordCount() // 单词数量
str := util.Str("hello world")
// 填充
padded := str.PadLeft(15, ' ').String() // " hello world"
paddedRight := str.PadRight(15, '*').String() // "hello world****"
paddedBoth := str.PadBoth(15, '-').String() // "--hello world--"
// 居中对齐
centered := str.Center(20, ' ').String() // " hello world "
longText := util.Str("This is a very long line that needs to be wrapped")
// 文本换行
wrapped := longText.WordWrap(20).String()
/* 输出:
This is a very long
line that needs to be
wrapped
*/
// 缩进
indented := util.Str("line1\nline2\nline3").Indent(" ").String()
/* 输出:
line1
line2
line3
*/
// 自定义验证函数
isValidUsername := func(s string) bool {
return len(s) >= 3 && len(s) <= 20 && util.Str(s).MatchRegex(`^[a-zA-Z0-9_]+$`)
}
username := util.Str("user123")
valid := username.Validate(isValidUsername) // true
// 多个验证规则
validators := []func(string) bool{
func(s string) bool { return len(s) >= 6 }, // 最小长度
func(s string) bool { return util.Str(s).MatchRegex(`[A-Z]`) }, // 包含大写字母
func(s string) bool { return util.Str(s).MatchRegex(`[0-9]`) }, // 包含数字
}
password := util.Str("Password123")
allValid := password.ValidateAll(validators) // true
// 高效的字符串构建
builder := util.NewStringBuilder()
builder.Append("Hello")
builder.Append(", ")
builder.Append("World")
builder.Append("!")
result := builder.String() // "Hello, World!"
// 带容量预分配的构建器
builder2 := util.NewStringBuilderWithCapacity(100)
for i := 0; i < 10; i++ {
builder2.Append(fmt.Sprintf("Item %d, ", i))
}
// 简单模板替换
template := util.Str("Hello, {{name}}! You have {{count}} messages.")
result := template.ReplaceTemplate(map[string]string{
"name": "Alice",
"count": "5",
}).String() // "Hello, Alice! You have 5 messages."
// 条件模板
conditionalTemplate := util.Str("{{if premium}}Premium{{else}}Regular{{endif}} User")
premiumResult := conditionalTemplate.ReplaceConditional("premium", true).String()
// "Premium User"
// ✅ 推荐:合理的链式调用
result := util.Str(" Hello_World_Example ").
Trim(). // 去除空白
Snake2BigCamel(). // 转换为大驼峰
Truncate(10). // 截取前10个字符
String()
// ❌ 避免:过长的链式调用(影响可读性)
// 批量字符串处理
strings := []string{"hello_world", "user_name", "data_base"}
results := util.BatchStringProcess(strings, func(s string) string {
return util.Str(s).Snake2Camel().String()
})
// ["helloWorld", "userName", "dataBase"]
// 使用StringBuilder处理大量字符串拼接
builder := util.NewStringBuilderWithCapacity(1000)
for i := 0; i < 100; i++ {
builder.Append(fmt.Sprintf("Item %d\n", i))
}
result := builder.String()
// 复用XStr对象
str := util.Str("")
for _, item := range items {
str = str.Reset(item).Process().String() // 复用对象
}
// 用户输入数据清洗
func CleanUserInput(input string) string {
return util.Str(input).
Trim(). // 去除首尾空白
ReplaceRegex(`\s+`, " "). // 多个空格替换为单个
HTMLEscape(). // HTML转义防XSS
Truncate(200). // 限制长度
String()
}
// CSV 数据处理
func ProcessCSVField(field string) string {
return util.Str(field).
Trim().
Replace(`"`, `""`). // 转义双引号
String()
}
// 统一的错误消息格式化
func FormatErrorMessage(code string, message string) string {
return util.Str("ERROR_{{code}}: {{message}}").
ReplaceTemplate(map[string]string{
"code": code,
"message": message,
}).
Upper().
String()
}
// URL 路径标准化
func NormalizePath(path string) string {
return util.Str(path).
TrimPrefix("/").
TrimSuffix("/").
ReplaceRegex(`/+`, "/"). // 多个斜杠替换为单个
Lower().
String()
}
// 环境变量处理
func ProcessEnvVar(key, defaultValue string) string {
value := os.Getenv(key)
if util.Str(value).IsBlank() {
return defaultValue
}
return util.Str(value).
Trim().
String()
}
// 配置键名标准化
func NormalizeConfigKey(key string) string {
return util.Str(key).
Lower().
ReplaceRegex(`[^a-z0-9]`, "_"). // 非字母数字替换为下划线
ReplaceRegex(`_+`, "_"). // 多个下划线替换为单个
Trim("_"). // 去除首尾下划线
String()
}
操作类型 性能指标
基础字符串操作 微秒级响应
正则表达式匹配 毫秒级处理
大小写转换 零内存分配
链式调用(5个方法) < 1微秒
哈希计算(MD5/SHA256) 毫秒级完成
Base64编码/解码 微秒级响应
// 基准测试示例
func BenchmarkStringOperations(b *testing.B) {
testStr := "hello_world_example_test_string"
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
result := util.Str(testStr).
Snake2Camel().
FirstUpper().
String()
_ = result
}
}
// 结果示例:
// BenchmarkStringOperations-8 1000000 1.2 μs/op 32 B/op 2 allocs/op
// ✅ 安全的类型转换
str := util.Str("123abc")
if str.IsNumeric() {
value := str.Int() // 安全转换
} else {
// 处理无效输入
log.Printf("Invalid numeric input: %s", str.String())
}
// ✅ 带默认值的转换
value := str.IntOr(0) // 转换失败返回0
// ✅ 预编译正则表达式
var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
func IsValidEmail(email string) bool {
return emailRegex.MatchString(email)
}
// ✅ 复用字符串构建器
var builderPool = sync.Pool{
New: func() interface{} {
return &strings.Builder{}
},
}
// ✅ 清晰的链式调用
cleanedInput := util.Str(userInput).
Trim(). // 步骤1:去除空白
HTMLEscape(). // 步骤2:HTML转义
Truncate(maxLength). // 步骤3:限制长度
String()
// ✅ 语义化的变量名
username := util.Str(rawUsername).
Lower().
ReplaceRegex(`[^a-z0-9_]`, "").
String()
如果您在使用 XStr 时遇到问题:
- 🔍 查看FAQ - 常见字符串处理问题
- 🐛 报告问题 - Bug反馈
- 💡 功能建议 - 新功能讨论
- 📧 邮件支持 - [email protected]
🎉 现在您已经掌握了 XStr 的强大功能,开始在项目中使用这些优雅的字符串操作吧!