go语言实现文件搜索需打开文件并逐行读取,使用strings.Contains进行关键词匹配或regexp包支持正则搜索,结合filepath.Walk遍历目录,可扩展忽略大小写、高亮显示及并发搜索功能。

在Go语言中实现文件内容搜索功能,可以通过读取文件、逐行扫描并匹配关键词来完成。核心思路是打开文件,按行读取内容,使用字符串或正则表达式进行匹配,并输出匹配的行号和内容。
1. 基础文本搜索(字符串匹配)
使用 bufio.Scanner 逐行读取文件,结合 strings.Contains 判断是否包含目标关键词。
- 打开文件后创建 Scanner,避免一次性加载大文件到内存
- 循环读取每一行,记录行号便于定位
- 使用 strings.Contains 进行大小写敏感搜索
示例代码:
package main import ( "bufio" "fmt" "os" "strings" ) func searchInFile(filename, keyword string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close() scanner := bufio.NewScanner(file) lineNum := 0 for scanner.Scan() { lineNum++ line := scanner.Text() if strings.Contains(line, keyword) { fmt.Printf("Line %d: %sn", lineNum, line) } } return scanner.Err() } func main() { err := searchInFile("example.txt", "hello") if err != nil { fmt.Println("Error:", err) } }
2. 支持正则表达式的高级搜索
若需要更灵活的匹配模式(如模糊匹配、数字提取等),可使用 regexp 包。
立即学习“go语言免费学习笔记(深入)”;
- 通过 regexp.Compile 编译正则表达式,提升重复搜索性能
- 使用 MatchString 判断当前行是否匹配
- 支持复杂模式,例如邮箱、IP地址等
示例代码:
package main import ( "bufio" "fmt" "os" "regexp" ) func searchWithRegex(filename, pattern string) error { re, err := regexp.Compile(pattern) if err != nil { return err } file, err := os.Open(filename) if err != nil { return err } defer file.Close() scanner := bufio.NewScanner(file) lineNum := 0 for scanner.Scan() { lineNum++ line := scanner.Text() if re.MatchString(line) { fmt.Printf("Match at Line %d: %sn", lineNum, line) } } return scanner.Err() } func main() { err := searchWithRegex("log.txt", `d{4}-d{2}-d{2}`) if err != nil { fmt.Println("Error:", err) } }
3. 搜索多个文件或目录
结合 filepath.Walk 遍历目录中的所有文件,对每个文件执行搜索。
- 使用 filepath.Walk 遍历指定路径下的所有文件
- 可添加文件扩展名过滤(如只搜索 .txt 或 .go 文件)
- 每个匹配文件调用前面定义的搜索函数
示例片段:
func searchInDir(rootDir, keyword string) { filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { if err != nil { return nil // 忽略无法访问的文件 } if !info.IsDir() && strings.HasSuffix(info.Name(), ".txt") { fmt.Printf("nSearching in: %sn", path) searchInFile(path, keyword) } return nil }) }
4. 提升体验的小技巧
让搜索功能更实用:
- 添加忽略大小写选项:使用 strings.ToLower 或正则标志 (?i)
- 限制结果数量,避免输出过多
- 高亮显示匹配部分(终端 ANSI 颜色码)
- 并发搜索多个文件以提高速度(使用 goroutine + waitgroup)
基本上就这些。Go标准库足够强大,无需依赖外部包即可实现高效文件内容搜索。关键是合理使用 bufio 和 regexp,注意错误处理和资源释放。不复杂但容易忽略细节。


