我正在嘗試探索 Go 并發性。這里Grabber()打印并寫入執行結果。程序打印預期結果,但不將其寫入urls.txt. 誰能向我解釋我在這里缺少什么?main.gopackage mainimport ( "bufio" "fmt" "io/ioutil" "log" "net/http" "os" "regexp" "strings" "sync")var wg sync.WaitGroupvar mt sync.Mutex// Final Literationfunc main() { file, err := os.Open("ip.txt") if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { go Grabber(scanner.Text()) wg.Add(1) } wg.Wait() if err := scanner.Err(); err != nil { log.Fatal(err) }}// stringInArray do If string in list return true false otherwise.func stringInArray(a string, list []string) bool { for _, b := range list { if b == a { return true } } return false}// Grabber Do Search the bing and collect array of sitelistfunc Grabber(ip string) { defer wg.Done() var output []string outfile, err := os.Create("urls.txt") if err != nil { log.Fatal(err) } defer outfile.Close() if ip == "" { } page := 1 for page < 251 { client := &http.Client{} req, err := http.NewRequest( http.MethodGet, fmt.Sprintf( "http://www.bing.com/search?q=ip:%s+&count=50&first=1", ip, ), nil, ) if err != nil { } req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0") res, err := client.Do(req) if err != nil { fmt.Println("Invalid Request") } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println("Couldn't Read") }ip.txt 作為輸入103.253.145.129103.253.146.125103.253.146.239103.253.147.72146.185.176.79146.185.176.45146.185.179.250146.185.180.35146.185.180.185146.185.180.113146.185.181.51146.185.183.107146.185.183.202146.185.183.248146.185.183.219146.185.184.69146.185.185.169
1 回答

陪伴而非守候
TA貢獻1757條經驗 獲得超8個贊
您正在調用create每個 goroutine,這將截斷文件。相反,在外部創建文件,并使用另一個 goroutine 序列化對其的寫入:
outfile, err := os.Create("urls.txt")
results:=make(chan []string)
go func() {
for output:=range results {
for _, links := range output {
fmt.Fprintln(outfile, links)
}
}
}()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
go Grabber(scanner.Text(), results)
wg.Add(1)
}
wg.Wait()
close(results)
在 Grabber 中獲取結果時,不要將其寫入文件,而是將其寫入通道:
results<-output
for _, links := range output {
fmt.Println(links)
}
- 1 回答
- 0 關注
- 209 瀏覽
添加回答
舉報
0/150
提交
取消