首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同函数中定义的带有同步错误的标志

在不同函数中定义的带有同步错误的标志
EN

Stack Overflow用户
提问于 2022-04-27 13:06:41
回答 1查看 133关注 0票数 1

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

下面的ping.go文件

代码语言:javascript
复制
    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'结果就会被破坏。

**关于上述代码**

该脚本将运行两个功能,都是点击不同的网站,同时使用同步。

不要感到困惑,这里的url被分割成三个部分/字符串:第二个部分是定义标志的地方。

产出如下

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 15:55:21

不应将标志arg语句单独放置,将其放在单个func中,调用flag.Parse()一次,然后将参数传递给pingone()pingtwo()

我在下面调整了您的代码,它会解决您的问题。

代码语言:javascript
复制
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")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72029314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档