在Golang中使用curl在网站上对字符串进行grepping最有效和可扩展的等效方法是什么?

在Golang中使用curl在网站上对字符串进行grepping最有效和可扩展的等效方法是什么?,curl,memory,go,grep,scalability,Curl,Memory,Go,Grep,Scalability,背景 user@host curl -s http://stackoverflow.com | grep -m 1 stackoverflow.com 如果找到字符串,则立即返回: <meta name="twitter:domain" content="stackoverflow.com"/> 结果 运行代码会导致: stackoverflow.com 讨论和结论 在Golang实现相同目标需要更多的代码,还是有更短的解决方案 两种选择似乎同时回归。在这种情况下,静态代码是否

背景

user@host curl -s http://stackoverflow.com | grep -m 1 stackoverflow.com
如果找到字符串,则立即返回:

<meta name="twitter:domain" content="stackoverflow.com"/>
结果

运行代码会导致:

stackoverflow.com
讨论和结论

  • 在Golang实现相同目标需要更多的代码,还是有更短的解决方案
  • 两种选择似乎同时回归。在这种情况下,静态代码是否也比动态代码快
  • 我担心这段代码是否会占用太多内存。它最终应该被用于监控数百个不同的网站

  • 此代码实现grep,在包含给定字符串的第一行停止。通过使用
    bufio.Scanner
    ,它避免了一次将整个网页读入内存,这除了限制内存使用外,还可以在一个巨大页面的开头附近发现字符串时加快程序的速度。使用
    scan.Bytes()
    可以避免将每一行转换为字符串,这会导致大量内存流失

    package main
    
    import (
        "bufio"
        "bytes"
        "fmt"
        "log"
        "net/http"
    )
    
    func main() {
        resp, err := http.Get("http://stackoverflow.com")
        if err != nil {
            log.Fatalf("failed to open url")
        }
        scan := bufio.NewScanner(resp.Body)
        toFind := []byte("stackoverflow.com")
        defer resp.Body.Close()
        for scan.Scan() {
            if bytes.Contains(scan.Bytes(), toFind) {
                fmt.Println(scan.Text())
                return
            }
        }
    }
    

    我愿意打赌字节。索引是解决您的问题的最简洁和最高效的解决方案。
    package main
    
    import (
        "bufio"
        "bytes"
        "fmt"
        "log"
        "net/http"
    )
    
    func main() {
        resp, err := http.Get("http://stackoverflow.com")
        if err != nil {
            log.Fatalf("failed to open url")
        }
        scan := bufio.NewScanner(resp.Body)
        toFind := []byte("stackoverflow.com")
        defer resp.Body.Close()
        for scan.Scan() {
            if bytes.Contains(scan.Bytes(), toFind) {
                fmt.Println(scan.Text())
                return
            }
        }
    }