15

次のようにプログラムを実行したいと思います。

go run launch.go http://example.com --m=2 --strat=par

http://example.com」は最初のコマンド ライン引数として解釈されますが、これは問題ありませんが、フラグはその後解析されず、デフォルト値のままです。次のように言えば:

go run launch.go --m=2 --strat=par http://example.com

その場合、「--m=2」は最初の引数 (URL である必要があります) として解釈されます。

os.Args を完全に削除することもできますが、オプションのフラグしかなく、そのうちの 1 つ (URL) を必須にする必要があります。

これが私のコードです:

package main

import (
    "fmt"
    "webcrawler/crawler"
    "webcrawler/model"
    "webcrawler/urlutils"
    "os"
    "flag"
)

func main() {
    if len(os.Args) < 2 {
        log.Fatal("Url must be provided as first argument")
    }

    strategy := flag.String("strat", "par", "par for parallel OR seq for sequential crawling strategy")
    routineMultiplier := flag.Int("m", 1, "Goroutine multiplier. Default 1x logical CPUs. Only works in parallel strategy")

    page := model.NewBasePage(os.Args[1])
    urlutils.BASE_URL = os.Args[1]
    flag.Parse()
    pages := crawler.Crawl(&page, *strategy, *routineMultiplier)
    fmt.Printf("Crawled: %d\n", len(pages))
}

これが可能であると確信していますが、方法がわかりません。

編集: flag.Args() のヒントをくれた justinas に感謝します。私は今、このようにそれを適応させ、それは動作します:

...
flag.Parse()

args := flag.Args()
    if len(args) != 1 {
        log.Fatal("Only one argument (URL) allowed.")
    }

page := model.NewBasePage(args[0])
...
4

4 に答える 4

15

フォローアップとして、次のようなコマンドに続くフラグを解析するには

runme init -m thisis

独自のフラグセットを作成して、次のように最初の値をスキップできます

var myValue string
mySet := flag.NewFlagSet("",flag.ExitOnError)
mySet.StringVar(&myValue,"m","mmmmm","something")
mySet.Parse(os.Args[2:])
于 2014-12-18T18:27:51.143 に答える