Go با مثال: فلگ‌های خط فرمان

فلگ‌های خط فرمان روشی رایج برای تعیین گزینه‌های برنامه‌های خط فرمان هستند. برای مثال، در wc -l، -l یک فلگ خط فرمان است.

package main

Go بستهٔ flag را دارد که از تجزیهٔ ساده‌ی فلگ‌های خط فرمان پشتیبانی می‌کند. از این بسته برای پیاده‌سازی برنامهٔ خط فرمان نمونهٔ خودمان استفاده می‌کنیم.

import (
    "flag"
    "fmt"
)
func main() {

تعریف‌های پایهٔ فلگ برای گزینه‌های رشته‌ای، عدد صحیح و بولی در دسترس‌اند. اینجا یک فلگ رشته‌ای word با مقدار پیش‌فرض "foo" و یک توضیح کوتاه تعریف می‌کنیم. این تابع flag.String یک اشاره‌گر به رشته برمی‌گرداند (نه مقدار رشته)؛ در ادامه می‌بینیم که چطور از این اشاره‌گر استفاده کنیم.

    wordPtr := flag.String("word", "foo", "a string")

این بخش فلگ‌های numb و fork را با روشی مشابه فلگ word تعریف می‌کند.

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := flag.Bool("fork", false, "a bool")

همچنین می‌توان گزینه‌ای تعریف کرد که از متغیری استفاده کند که جای دیگری در برنامه تعریف شده. توجه کنید که باید یک اشاره‌گر را به تابع تعریف فلگ بدهیم.

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

وقتی همهٔ فلگ‌ها تعریف شدند، flag.Parse() را صدا بزنید تا تجزیهٔ خط فرمان انجام شود.

    flag.Parse()

اینجا فقط گزینه‌های تجزیه‌شده و هر آرگومان موقعیتی (positional) انتهایی را چاپ می‌کنیم. توجه کنید که برای گرفتن مقدار واقعی گزینه‌ها باید اشاره‌گرها را dereference کنیم، مثلاً با *wordPtr.

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *forkPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

برای آزمایش برنامهٔ فلگ‌های خط فرمان، بهتر است اول آن را کامپایل کنید و سپس فایل اجرایی حاصل را مستقیماً اجرا کنید.

$ go build command-line-flags.go

برنامهٔ ساخته‌شده را امتحان کنید؛ اول برای همهٔ فلگ‌ها مقدار بدهید.

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

توجه کنید که اگر فلگ‌ها را ننویسید، خودکار مقدار پیش‌فرضشان را می‌گیرند.

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

آرگومان‌های موقعیتی انتهایی را می‌توان بعد از فلگ‌ها نوشت.

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

توجه کنید که بستهٔ flag نیاز دارد همهٔ فلگ‌ها پیش از آرگومان‌های موقعیتی بیایند (وگرنه فلگ‌ها هم به‌عنوان آرگومان موقعیتی تفسیر می‌شوند).

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

از فلگ‌های -h یا --help استفاده کنید تا متن راهنمای خودکار برنامهٔ خط فرمان را ببینید.

$ ./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

اگر فلگی بدهید که در بستهٔ flag تعریف نشده، برنامه یک پیام خطا چاپ می‌کند و دوباره متن راهنما را نشان می‌دهد.

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

مثال بعدی: .