用filepath.Walk遍历目录,os.Open读取文件,bufio.Scanner逐行扫描,结合strings.Contains(关键字搜索)或预编译regexp.MatchString(正则匹配),跳过二进制文件、限制行长、支持忽略大小写与ANSI高亮输出。

核心思路:用filepath.Walk遍历目录 + strings/regexp匹配
Go语言没有内置的“文件内容搜索”命令,但标准库提供了足够灵活的组件。关键在于组合使用filepath.Walk递归遍历路径、os.Open读取文件、bufio.Scanner逐行处理(防大文件OOM),再用strings.Contains或regexp.MatchString判断是否命中。
支持关键字搜索:简单高效,适合大多数场景
对每个文本文件的每一行,调用strings.Contains(line, keyword)即可。注意几点:
- 默认区分大小写,如需忽略,先用strings.ToLower统一转换再比对
- 跳过二进制文件:检查文件头(magic number)或扩展名(如 .png, .pdf),避免乱码解析
- 限制单行长度(如超过1MB跳过),防止超长行阻塞扫描
支持正则匹配:更灵活,但需预编译提升性能
使用regexp.Compile在程序启动时一次性编译正则表达式,避免每次匹配都重复编译。示例:
re, _ := regexp.Compile(`\bfunc\s+\w+\s*\(`) —— 匹配Go函数定义
立即学习“go语言免费学习笔记(深入)”;
实际匹配时调用re.MatchString(line)。注意:
- 用户输入的正则可能有语法错误,需用regexp.Compile的error返回做校验并友好提示
- 若需匹配跨行内容(如多行注释),需缓存多行再匹配,不推荐默认开启,影响性能和内存
- 可加-i标志实现正则忽略大小写:(?i)pattern
命令行交互与结果输出:清晰易用是关键
用flag包解析参数,典型用法:
search -path ./src -keyword "fmt.Println" -ext ".go"
search -path /var/log -regex "\d{4}-\d{2}-\d{2}.*ERROR" -ignore-case
输出建议包含:文件路径、行号、匹配行内容(高亮关键词/正则捕获组)。可用\033[1;32m等ANSI色码做终端高亮(Windows需启用VirtualTerminalLevel)。










