go - 什么是 `regex grep` ,应用于文件,Golang 中的等价物?

标签 go

问题

我现在正在对多个文件运行正则表达式 grep 以获取所有 TODO,但是命令完成需要几分钟时间:

real    5m8.073s
user    0m35.593s
sys     4m17.608s

瞄准

目标是立即获取 TODO 的数量。

尝试

根据网上的资料,我认为 Golang 是一个不错的选择,因此我创建了以下代码。

func check_for_todo(path string) {
    text := "//\\sTODO\\s\\d"

    b, err := ioutil.ReadFile(path)
    if err != nil {
        panic(err)
    }
    s := string(b)

    // containsTodo := strings.Contains(s, text)
    containsTodo, _ := regexp.MatchString(text, s)

    if containsTodo {
        numberOfTodos++
        fmt.Println("This file contains a todo:", path)
    }
}

结果

现在查询速度是 bash 的两倍。

real    2m17.050s
user    0m0.015s
sys     0m0.015s

讨论

我觉得这段代码可以优化并且目前是曲折的。我现在正在研究 channel 和协程。

最佳答案

您可能想查看 the silver searcher 所做的优化(又名 ag)。它进行了大量优化以实现极快的代码搜索。

另一种选择可能是预先构建索引,这样搜索速度甚至比实时执行的任何操作都要快。在 ag 自述文件中,exuberant ctags被引用,它执行此操作并且可以用于非常大的代码库。

关于go - 什么是 `regex grep` ,应用于文件,Golang 中的等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246487/

相关文章:

database - SQLX "missing destination name"在结构标记中使用表名时

google-app-engine - 无法在 golang 中对数据存储类型的实体进行排序

docker - 如何让两个运行 flask 服务和 golang 服务的 docker 容器相互通信?

function - 类型如何间接引用其他函数基方法?

sql - 如何在 Go for MSSQL 的选择查询中使用带有 % 的 LIKE?

go - 由 grpc proto3 生成的 protobuff 中的蛇形格样式

interface - Go Interfaces 使用定义中的接口(interface)

go - 将结构映射到 mysql 表,并将行绑定(bind)到结构

go - 将缓冲区写入文件不会返回错误,那么为什么文件后记为空?

go - XML 文件的部分索引 (Bleve)