为了账号安全,请及时绑定邮箱和手机立即绑定

Go 没有将完整的数据写入文本文件

Go 没有将完整的数据写入文本文件

Go
慕妹3146593 2022-04-20 21:06:13
我正在尝试探索 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)

    }


查看完整回答
反对 回复 2022-04-20
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号