首页 > 解决方案 > 在golang中迭代多个返回

问题描述

我正在尝试从包含域(未知数量)的文本文件中获取输入,然后将每个域用作参数并获取它们的服务器类型。正如预期的那样,这只返回最后一个域。如何迭代多个返回值?下面是代码。// 测试包main

import (
    "bufio"
    "time"
    "os"
    "fmt"
    "net/http"
    //"github.com/gocolly/colly"
)

var Domain string
var Target string

func main() {
    Domain := DomainGrab()
    Target := BannerGrab(Domain)
    //CheckDB if not listed then add else skip
    //RiskDB
    //Email
    fmt.Println(Domain)
    fmt.Println(Target)
}

func BannerGrab(s string) string {

    client := &http.Client{}
    req, err := http.NewRequest("GET", s, nil)
    if err != nil {
    log.Fatalln(err)
    }
    req.Header.Set("User-Agent", "Authac/0.1")
    resp, _ := client.Do(req)
    serverEntry := resp.Header.Get("Server")
    return serverEntry

}
func DomainGrab() string {

    //c := colly.NewCollector()
// Open the file.
    f, _ := os.Open("domains.txt")
    defer f.Close()
    // Create a new Scanner for the file.
    scanner := bufio.NewScanner(f)
    // Loop over all lines in the file and print them.
    for scanner.Scan() {
        line := scanner.Text()
        time.Sleep(2 * time.Second)
        //fmt.Println(line)
        return line
    }
    return Domain
}

标签: gomultiple-return-values

解决方案


如果我理解您的问题,您想阅读该文件,以某种方式检测该文件已被修改,并有一种方法可以将这些修改发送到客户端代码。

这不是文件的工作方式。

你有两个选择:

  1. 使用某些特定于操作系统的 API 监听文件更改 - https://www.linuxjournal.com/content/linux-filesystem-events-inotify

  2. 使用无限循环读取文件。读取文件一次。将副本保存到内存中。在循环中一次又一次地读取同一个文件,直到新文件不同于副本并计算增量。

检查是否可以使用push而不是pull获取新域。控制文件中域名的系统是否有可能直接将数据推送给您?

如果loop是唯一可能的选项,请在文件读取之间设置一些暂停时间以减少系统负载。

当您设法获得新域并需要同时处理它们时,使用@dave建议的通道。


推荐阅读