惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Vercel News
Vercel News
Last Week in AI
Last Week in AI
月光博客
月光博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
博客园 - 叶小钗
NISL@THU
NISL@THU
C
Check Point Blog
K
Kaspersky official blog
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
T
Threatpost
GbyAI
GbyAI
L
LINUX DO - 热门话题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
N
News and Events Feed by Topic
Scott Helme
Scott Helme
P
Privacy International News Feed
The Register - Security
The Register - Security
G
GRAHAM CLULEY
Recorded Future
Recorded Future
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
Webroot Blog
Webroot Blog
Microsoft Security Blog
Microsoft Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
DataBreaches.Net
J
Java Code Geeks
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Engineering at Meta
Engineering at Meta
M
MIT News - Artificial intelligence
T
Threat Research - Cisco Blogs
Google DeepMind News
Google DeepMind News

卡卡罗特

最后代码 | 卡卡罗特 swagger文档 | 卡卡罗特 react脚手架开发 | 卡卡罗特 python的对象增强 | 卡卡罗特 langchain实现Agent | 卡卡罗特 03.python列表集合元组字典 | 卡卡罗特 python依赖打包 | 卡卡罗特 python的异步 | 卡卡罗特 python的生成器 | 卡卡罗特 eino整合Tools | 卡卡罗特 eino实现Agent | 卡卡罗特 eino整合RAG | 卡卡罗特 docker打包go服务 | 卡卡罗特 01-docker入门 | 卡卡罗特 docker-compose | 卡卡罗特 dockerfile | 卡卡罗特 linux安装docker | 卡卡罗特 hertz中间件 | 卡卡罗特 go整合向量数据库ChromaDB | 卡卡罗特 langchainjs | 卡卡罗特 ollama调用各大模型 | 卡卡罗特 spring-ai | 卡卡罗特 自定义一个MCP | 卡卡罗特 context.Context是什么? | 卡卡罗特 01-获取指定网站的所有的链接 | 卡卡罗特 01-Bing每日一图接口 | 卡卡罗特 02-腾讯API高清QQ头像https调用接口 | 卡卡罗特 openCV初体验 | 卡卡罗特 RWMutex读写锁 | 卡卡罗特 SyncMap的使用 | 卡卡罗特 defer的使用 | 卡卡罗特 gitHub Pages 的使用 | 卡卡罗特 cloudflare | 卡卡罗特
go字符串工具类 | 卡卡罗特
2026-04-26 · via 卡卡罗特

go

// Package strutil 提供字符串操作的工具函数,灵感来源于 Java 的 StringUtils。
package strutil

import (
	"strings"
	"unicode"
)

// IsEmpty 判断字符串是否为空(长度为 0)。
func IsEmpty(s string) bool {
	return len(s) == 0
}

// IsNotEmpty 判断字符串是否非空。
func IsNotEmpty(s string) bool {
	return len(s) > 0
}

// IsBlank 判断字符串是否为空或仅包含空白字符(如空格、制表符、换行符等)。
func IsBlank(s string) bool {
	if len(s) == 0 {
		return true
	}
	for _, r := range s {
		if !unicode.IsSpace(r) {
			return false
		}
	}
	return true
}

// IsNotBlank 判断字符串是否非空且不只包含空白字符。
func IsNotBlank(s string) bool {
	return !IsBlank(s)
}

// Equals 判断两个字符串是否相等(区分大小写)。
func Equals(s1, s2 string) bool {
	return s1 == s2
}

// EqualsIgnoreCase 判断两个字符串是否相等(忽略大小写)。
func EqualsIgnoreCase(s1, s2 string) bool {
	return strings.EqualFold(s1, s2)
}

// ToLowerCase 将字符串转换为小写。
// 如果输入为空字符串,则直接返回原字符串。
func ToLowerCase(s string) string {
	if IsEmpty(s) {
		return s
	}
	return strings.ToLower(s)
}

// ToUpperCase 将字符串转换为大写。
// 如果输入为空字符串,则直接返回原字符串。
func ToUpperCase(s string) string {
	if IsEmpty(s) {
		return s
	}
	return strings.ToUpper(s)
}

// Trim 去除字符串首尾的空白字符(包括空格、制表符、换行符等)。
func Trim(s string) string {
	return strings.TrimSpace(s)
}

// TrimToEmpty 去除字符串首尾的空白字符。
// 即使结果为空,也返回空字符串 ""(Go 中字符串不能为 nil)。
func TrimToEmpty(s string) string {
	return strings.TrimSpace(s)
}

// TrimToNil 去除字符串首尾的空白字符。
// 如果去除后结果为空或仅含空白,则返回空字符串 ""。
// 注意:Go 的 string 类型无法为 nil,因此“TrimToNil”在此语境下返回 "" 表示“无值”。
func TrimToNil(s string) string {
	trimmed := strings.TrimSpace(s)
	if IsBlank(trimmed) {
		return ""
	}
	return trimmed
}

// Contains 判断字符串 s1 是否包含子串 s2(区分大小写)。
func Contains(s1, s2 string) bool {
	return strings.Contains(s1, s2)
}

// ContainsIgnoreCase 判断字符串 s1 是否包含子串 s2(忽略大小写)。
func ContainsIgnoreCase(s1, s2 string) bool {
	s1Lower := strings.ToLower(s1)
	s2Lower := strings.ToLower(s2)
	return strings.Contains(s1Lower, s2Lower)
}

// StartsWith 判断字符串 s 是否以指定前缀 prefix 开头(区分大小写)。
func StartsWith(s, prefix string) bool {
	return strings.HasPrefix(s, prefix)
}

// StartsWithIgnoreCase 判断字符串 s 是否以指定前缀 prefix 开头(忽略大小写)。
func StartsWithIgnoreCase(s, prefix string) bool {
	return strings.HasPrefix(strings.ToLower(s), strings.ToLower(prefix))
}

// EndsWith 判断字符串 s 是否以指定后缀 suffix 结尾(区分大小写)。
func EndsWith(s, suffix string) bool {
	return strings.HasSuffix(s, suffix)
}

// EndsWithIgnoreCase 判断字符串 s 是否以指定后缀 suffix 结尾(忽略大小写)。
func EndsWithIgnoreCase(s, suffix string) bool {
	return strings.HasSuffix(strings.ToLower(s), strings.ToLower(suffix))
}

// Join 使用指定分隔符 sep 拼接多个字符串元素。
func Join(sep string, elems ...string) string {
	return strings.Join(elems, sep)
}

// DefaultIfEmpty 如果字符串 s 为空,则返回默认值 defaultStr;否则返回 s 本身。
func DefaultIfEmpty(s, defaultStr string) string {
	if IsEmpty(s) {
		return defaultStr
	}
	return s
}

// DefaultIfBlank 如果字符串 s 为空或仅包含空白字符,则返回默认值 defaultStr;否则返回 s 本身。
func DefaultIfBlank(s, defaultStr string) string {
	if IsBlank(s) {
		return defaultStr
	}
	return s
}

// Reverse 返回字符串的反转版本(支持 Unicode 字符)。
func Reverse(s string) string {
	runes := []rune(s)
	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}
	return string(runes)
}

// ToFirstUpperASCII 将字符串首字母大写,其余小写,比如 HELLO -> Hello
func ToFirstUpperASCII(s string) string {
	if len(s) == 0 {
		return ""
	}
	return strings.ToUpper(s[:1]) + strings.ToLower(s[1:])
}

// HasPrefix 判断字符串 s 是否以 prefix 开头
func HasPrefix(s, prefix string) bool {
	return strings.HasPrefix(s, prefix)
}

// HasSuffix 判断字符串 s 是否以 suffix 结尾
func HasSuffix(s, suffix string) bool {
	return strings.HasSuffix(s, suffix)
}

go

package main

import (
	"fmt"
	"your-module/strutil" // 替换为你的模块路径
)

func main() {
	// 判空
	fmt.Println(strutil.IsEmpty(""))           // true
	fmt.Println(strutil.IsBlank("   \t\n"))    // true
	fmt.Println(strutil.IsNotBlank(" hello ")) // true

	// 比较
	fmt.Println(strutil.Equals("Hello", "hello"))             // false
	fmt.Println(strutil.EqualsIgnoreCase("Hello", "hello"))   // true

	// 大小写
	fmt.Println(strutil.ToLowerCase("HELLO")) // "hello"
	fmt.Println(strutil.ToUpperCase("world")) // "WORLD"

	// 去空格
	fmt.Printf("[%s]\n", strutil.Trim("  abc  ")) // [abc]

	// 包含
	fmt.Println(strutil.ContainsIgnoreCase("Hello World", "WORLD")) // true

	// 默认值
	fmt.Println(strutil.DefaultIfBlank("", "default"))      // "default"
	fmt.Println(strutil.DefaultIfBlank("  ", "default"))    // "default"
	fmt.Println(strutil.DefaultIfBlank("ok", "default"))    // "ok"

	// 反转
	fmt.Println(strutil.Reverse("hello")) // "olleh"

	// 拼接
	fmt.Println(strutil.Join("-", "a", "b", "c")) // "a-b-c"
	
	// 前后缀 判断
	fmt.Println(strutil.HasPrefix("小红书测试插件_retry", "小红书")) //true
	fmt.Println(strutil.HasSuffix("小红书测试插件_retry", "retry")) //true
}