在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
讨论和结论
此代码实现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
}
}
}