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

我想使用一些标志同时运行两个函数,但如果它们不调用标志,则下面的 golang 脚本正在运行,go run ping.go即它们将使用默认值。


下面的 ping.go 文件


    package main


import (

    //   "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=admin2

Both pingone and pingtwo started

flag provided but not defined: -websiteone

Usage of /tmp/go-build010683275/b001/exe/ping:

  -websiteone string

        Zdefault website (default "adminone")

website: admin1

  -websitetwo string

        Zdefault website (default "admintwo")

exit status 2


慕运维8079593
浏览 97回答 1
1回答

MMTTMM

您不应该将标志 arg 语句分开放置,将它们放入单个 func 中,调用flag.Parse()一次,然后将参数传递给pingone()和pingtwo()。我在下面调整了您的代码,它应该可以解决您的问题package mainimport (    "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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go