Go:检查字符串是否包含子串——完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在Go中检查字符串是否包含子串?从新手到专家

\n\n

你是否曾在编写Go代码时,面对一个简单的问题突然卡住:"这个字符串包含我需要的部分吗?" 如果是,你并不孤单。在Stack Overflow上,这个问题已经获得了数千次浏览,原因也很充分:Go有多种优雅的解决方式,但应该选择哪一种呢?让我们一次性搞清楚。

\n\n

在本文中,我们不仅仅会展示strings.Contains函数。我们将教会你像Go开发者一样思考:为每种情况选择最优工具,避免陷阱,编写快速且可预测的代码。

\n\n

目录

\n\n\n

1. strings.Contains — 你的第一个朋友

\n\n

让我们从最简单、最流行的方法开始。Go标准库中的strings.Contains函数是你在80%的情况下所需要的。如果字符串包含指定的子串,它返回true,否则返回false。

\n\n

它在真实代码中是这样的:

\n\n
package 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

输出:

\n
The string contains the substring: world
\n\n

很简单,对吧?这个函数是区分大小写的:strings.Contains("Go", "go")会返回false。如果你需要忽略大小写,则必须使用strings.ToLower或strings.EqualFold。

\n\n

不区分大小写搜索的示例

\n\n
str := "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\n

2. strings.Index — 当你需要知道位置时

\n\n

有时只知道子串存在是不够的。你想知道它具体在什么位置。例如,你在解析日志,想要提取某个标记后面的部分字符串。这时strings.Index就派上用场了。

\n\n

这个函数返回子串第一次出现的位置索引(从0开始),如果未找到则返回-1。

\n\n
str := "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

输出:

\n
Substring 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
\n\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                

博客

书籍推荐