لغة 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()

سنطبع هنا الخيارات المحللة وأي وسائط موضعية لاحقة. لاحظ أن علينا فك إشارة المؤشرات، باستخدام *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:
...

المثال التالي: .