登录
首页 >  Golang >  Go问答

同步错误:在多个函数中定义的标志产生错误情况

来源:stackoverflow

时间:2024-02-09 22:09:22 250浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《同步错误:在多个函数中定义的标志产生错误情况》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我想使用一些标志同时运行两个函数,但是如果下面的 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 运行 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

正确答案


您不应单独放置标志参数语句,应将它们放入单个函数中,调用 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")
}

今天关于《同步错误:在多个函数中定义的标志产生错误情况》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>