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

在不同函数中定义的标志,同步给出错误

在不同函数中定义的标志,同步给出错误

Go
慕运维8079593 2022-12-05 17:24:01
我想使用一些标志同时运行两个函数,但如果它们不调用标志,则下面的 golang 脚本正在运行,go run ping.go即它们将使用默认值。下面的 ping.go 文件    package mainimport (    //   "io/ioutil"    //   "log"    "flag"    "fmt"    "net/http"    "sync"    "time")func pingone() {    websiteone := flag.String("websiteone", "adminone", "Zdefault website")    flag.Parse()    // using/printing flags to avoid error    fmt.Println("website:", *websiteone)    eurl := "https://thesiteone.com/"    happ := "/subpage"    for {        resp, err := http.Get(eurl + *websiteone + happ)        if err != nil {            continue        }        fmt.Println(resp)        time.Sleep(2 * time.Second)    }}func pingtwo() {    websitetwo := flag.String("websitetwo", "admintwo", "Zdefault website")    flag.Parse()    // using/printing flags to avoid error    fmt.Println("website:", *websitetwo)    eurltwo := "https://thesitetwo.com/"    happtwo := "/subpage"    for {        resp, err := http.Get(eurltwo + *websitetwo + happtwo)        if err != nil {            continue        }        fmt.Println(resp)        time.Sleep(2 * time.Second)    }}func main() {    var wg sync.WaitGroup    fmt.Printf("Both pingone and pingtwo started\n")    wg.Add(2)    go pingone()    go pingtwo()    wg.Wait()    fmt.Printf("both pingone and pingtwo have finished\n")}但是如果我们同时调用这两个标志, go run ping.go --websitetwo='secondsuburl' --websiteone='firstsuburl' 结果它们就会被破坏** 关于上面的代码 **该脚本将运行两个函数,它们都使用同步同时对不同的网站执行 ping 操作。不要混淆,这里的 url 被分成三部分/字符串:第二部分是标志定义的地方。下面输出root@localhost:~# go run ping.go --websiteone=admin1 --websitetwo=admin2Both pingone and pingtwo startedflag provided but not defined: -websiteoneUsage of /tmp/go-build010683275/b001/exe/ping:  -websiteone string        Zdefault website (default "adminone")website: admin1  -websitetwo string        Zdefault website (default "admintwo")exit status 2
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您不应该将标志 arg 语句分开放置,将它们放入单个 func 中,调用flag.Parse()一次,然后将参数传递给pingone()和pingtwo()。


我在下面调整了您的代码,它应该可以解决您的问题


package main


import (

    "flag"

    "fmt"

    "net/http"

    "sync"

    "time"

)


func pingone(websiteone *string) {

    fmt.Println("website:", *websiteone)


    eurl := "https://thesiteone.com/"

    happ := "/subpage"


    for {

        resp, err := http.Get(eurl + *websiteone + happ)

        if err != nil {

            continue

        }

        fmt.Println(resp)

        time.Sleep(2 * time.Second)

    }

}


func pingtwo(websitetwo *string) {

    fmt.Println("website:", *websitetwo)


    eurltwo := "https://thesitetwo.com/"

    happtwo := "/subpage"


    for {

        resp, err := http.Get(eurltwo + *websitetwo + happtwo)

        if err != nil {

            continue

        }

        fmt.Println(resp)

        time.Sleep(2 * time.Second)

    }

}


func main() {

    websiteone := flag.String("websiteone", "adminone", "Zdefault website")

    websitetwo := flag.String("websitetwo", "admintwo", "Zdefault website")


    flag.Parse()


    var wg sync.WaitGroup


    fmt.Printf("Both pingone and pingtwo started\n")


    wg.Add(2)

    go pingone(websiteone)

    go pingtwo(websitetwo)


    wg.Wait()

    fmt.Printf("both pingone and pingtwo have finished\n")

}


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信