繁体   English   中英

迭代golang中的多个返回

Iterating over multiple returns in golang

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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
}
3 个回复

如果您想“同时”执行此操作,则将返回一个通道,通过该通道将发送您要返回的多个内容:

https://play.golang.org/p/iYBGPwfYLYR

func DomainGrab() <-chan string {
    ch := make(chan string, 1)
    f, _ := os.Open("domains.txt")
    defer f.Close()
    scanner := bufio.NewScanner(f)
    go func() {
    // Loop over all lines in the file and print them.
        for scanner.Scan() {
            line := scanner.Text()
            time.Sleep(2 * time.Second)
            ch <- line
        }
        close(ch)
    }()
    return ch
}

如果我理解您的问题,那么您想读取该文件,以某种方式检测到该文件已被修改,并且有一种方法可以对客户端代码进行这些修改。

那不是文件的工作方式。

您有两种选择:

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

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

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

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

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

可能不是最佳解决方案。 但是,我决定摆脱一个单独的功能,而只是覆盖更多的领域。 我将在下面的代码中发布期望的代码。 现在,我需要解析域,以便根URL和子域仅被扫描一次。

// Main
package main

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

//var Domain string
var Target string


func main() {
    c := colly.NewCollector()

    c.OnError(func(r *colly.Response, err error) {
        fmt.Println("Request URL:", r.Request.URL, "\n Failed with response:", r.StatusCode)
    })

    // Find and visit all links
    c.OnHTML("a", func(e *colly.HTMLElement) {
        e.Request.Visit(e.Attr("href"))
    })

    c.OnRequest(func(r *colly.Request) {
        Domain := r.URL.String()
        Target := BannerGrab(Domain)
        fmt.Println(Domain)
        fmt.Println(Target)
        fmt.Println("Dropping By.. ", r.URL)
        time.Sleep(1000 * time.Millisecond)
    })

    c.Visit("http://www.milliondollarhomepage.com/")
    }

    //CheckDB if not listed else add
    //RiskDB
    //Email


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

}
1 将UAML字段的多个值解析为列表,然后在GOLANG中对其进行迭代

我有以下yaml文件: 我想打开YAML文件,一个接一个地遍历IP,然后执行某些操作。 如果有错误,则应该自动获取下一个ip并执行相同的功能。 我在如何将IP保存到列表或如何在GOLANG中进行迭代方面遇到麻烦。 另外,我必须根据YAML文件中存在的电子邮件ID发送电子邮件。 ...

3 Golang 中的返回接口

假设我们想在error接口上扩展Error()函数。 我们可以简单地创建一个从实现Error()方法的字符串派生的结构。 例如: 上面的代码将返回需要email is required或email is required password is required 。 但是,如果我创建自己的界面 ...

4 在Golang中返回结构

我只是从Golang开始,我对与其他包交互和使用结构感到非常困惑。 现在,我只是想返回由gopsutil库中的方法生成的结构。 具体是返回以下功能: 在此处输入链接描述 我的代码如下: 这会将TimesStat返回为未定义。 我尝试返回一些不同的语法变体,但是,我发现编译的唯 ...

5 在Golang中返回接口

我正在尝试在一个采用接口类型并返回该接口类型但转换为适当类型的结构上编写一个方法。 所以,当我打电话GetModel()型TrueFalseQuestions我想自动返回TrueFalseQuestions类型。 我认为这意味着我的GetModel()方法应该返回Model类型。 这 ...

6 如何在 Common Lisp 中迭代返回多个值

要返回多个值,可以使用(values v1 v2 v3) 如何从do循环迭代返回多个值? 换句话说,我想在do循环中构建多值返回的值,但我只能构建一个列表。 我知道values-list ,但使用多个值的重点是不构建列表。 有没有办法在不构建列表的情况下迭代返回多个值? ...

7 如何在Golang中同时迭代sql结果集?

next()方法是顺序的,有没有办法同时迭代循环? 我有一个200k行的结果集,我按顺序循环并在每一行上执行逻辑并想要将其拆分。 ...

2015-11-11 22:59:37 1 3705   go
8 如何迭代Golang的var部分中的所有变量

我有一个带var块的文件。 有没有办法获取块中的所有变量,包括原始变量名称和值? reflect可以做到这一点,但是如何从其他包中获取变量名呢? ...

2017-07-07 02:00:52 0 210   go
9 在golang模板中迭代地图/字典

我是Go的初学者,正在自学一些Web开发。 我正在尝试在模板文件中遍历地图,并且找不到有关如何执行操作的任何文档。 这是我传入的结构: 我可以使用以下方法遍历BlogPosts: 但是我似乎无法弄清楚如何做这样的事情: ...

10 在 Golang 中,为什么地图上的迭代是随机的?

从 Golang源代码来看,它们似乎遵循非常标准的哈希表实现(即桶数组)。 基于此,对于未更改的映射,迭代似乎应该是确定性的(即按顺序迭代数组,然后按顺序在桶内迭代)。 为什么他们使迭代随机? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM