如何在Go中检查字符串是否包含子串?从新手到专家
\n\n你是否曾在编写Go代码时,面对一个简单的问题突然卡住:"这个字符串包含我需要的部分吗?" 如果是,你并不孤单。在Stack Overflow上,这个问题已经获得了数千次浏览,原因也很充分:Go有多种优雅的解决方式,但应该选择哪一种呢?让我们一次性搞清楚。
\n\n在本文中,我们不仅仅会展示strings.Contains函数。我们将教会你像Go开发者一样思考:为每种情况选择最优工具,避免陷阱,编写快速且可预测的代码。
目录
\n- \n
- strings.Contains — 你的第一个朋友 \n
- strings.Index — 当你需要的不止是"是/否" \n
- ContainsAny 和 ContainsRune — 精细调优 \n
- 性能:该如何选择? \n
- 边缘情况与陷阱 \n
- 总结:需要记住什么 \n
1. strings.Contains — 你的第一个朋友
\n\n让我们从最简单、最流行的方法开始。Go标准库中的strings.Contains函数是你在80%的情况下所需要的。如果字符串包含指定的子串,它返回true,否则返回false。
它在真实代码中是这样的:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n str := "Hello, Go world!"\n substr := "world"\n\n if strings.Contains(str, substr) {\n fmt.Println("The string contains the substring:", substr)\n } else {\n fmt.Println("Substring not found")\n }\n}\n\n\n输出:
\nThe string contains the substring: world\n\n很简单,对吧?这个函数是区分大小写的:strings.Contains("Go", "go")会返回false。如果你需要忽略大小写,则必须使用strings.ToLower或strings.EqualFold。
不区分大小写搜索的示例
\n\nstr := "Golang is awesome"\nsubstr := "golang"\n\nif strings.Contains(strings.ToLower(str), strings.ToLower(substr)) {\n fmt.Println("Found (case-insensitive)!")\n}\n\n\n何时使用:当你只需要一个简单的二元答案——"是"或"否"时。无需多余细节。
\n\n2. strings.Index — 当你需要知道位置时
\n\n有时只知道子串存在是不够的。你想知道它具体在什么位置。例如,你在解析日志,想要提取某个标记后面的部分字符串。这时strings.Index就派上用场了。
这个函数返回子串第一次出现的位置索引(从0开始),如果未找到则返回-1。
\n\nstr := "Error: file not found in /var/log"\nsubstr := "file"\n\npos := strings.Index(str, substr)\nif pos != -1 {\n fmt.Printf("Substring found at position %d\\n", pos)\n fmt.Printf("Context: %s\\n", str[pos:])\n} else {\n fmt.Println("Substring not found")\n}\n\n\n输出:
\nSubstring found at position 7\nContext: file not found in /var/log\n\n还有其他变体:
\n- \n
strings.LastIndex— 搜索最后一次出现的位置 \n strings.IndexAny— 搜索字符集中任意字符的第一次出现 \n strings.IndexRune— 搜索特定的Unicode字符 \n
// 使用LastIndex的示例\nstr := "a-b-c-d"\nlastDash := strings.LastIndex(str, "-")\nfmt.Println("Last dash at position:", lastDash) // 5\n\n// 使用IndexAny的示例\nstr2 := "hello world"\npos := strings.IndexAny(str2, "aeiou")\nfmt.Println("First vowel at po