Go by Example: Command-Line Subcommands

go vositasi yoki git kabi ba’zi buyruq qatori vositalari ko’plab *subbuyruqlar*ga ega bo’ladi, ularning har biri o’z bayroqlari to’plamiga ega. Masalan, go build va go get go vositasining ikkita turli subbuyrug’idir. flag paketi bizga o’z bayroqlariga ega oddiy subbuyruqlarni osongina aniqlash imkonini beradi.

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

Biz NewFlagSet funksiyasi yordamida subbuyruqni e’lon qilamiz va ushbu subbuyruqqa xos yangi bayroqlarni aniqlashga o’tamiz.

    fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)
    fooEnable := fooCmd.Bool("enable", false, "enable")
    fooName := fooCmd.String("name", "", "name")

Boshqa subbuyruq uchun biz turli qo’llab-quvvatlanadigan bayroqlarni aniqlashimiz mumkin.

    barCmd := flag.NewFlagSet("bar", flag.ExitOnError)
    barLevel := barCmd.Int("level", 0, "level")

Subbuyruq dasturning birinchi argumenti sifatida kutiladi.

    if len(os.Args) < 2 {
        fmt.Println("expected 'foo' or 'bar' subcommands")
        os.Exit(1)
    }

Qaysi subbuyruq chaqirilganini tekshiramiz.

    switch os.Args[1] {

Har bir subbuyruq uchun biz uning o’z bayroqlarini tahlil qilamiz va oxiridagi pozitsion argumentlarga kirish imkoniga ega bo’lamiz.

    case "foo":
        fooCmd.Parse(os.Args[2:])
        fmt.Println("subcommand 'foo'")
        fmt.Println("  enable:", *fooEnable)
        fmt.Println("  name:", *fooName)
        fmt.Println("  tail:", fooCmd.Args())
    case "bar":
        barCmd.Parse(os.Args[2:])
        fmt.Println("subcommand 'bar'")
        fmt.Println("  level:", *barLevel)
        fmt.Println("  tail:", barCmd.Args())
    default:
        fmt.Println("expected 'foo' or 'bar' subcommands")
        os.Exit(1)
    }
}
$ go build command-line-subcommands.go 

Avval foo subbuyrug’ini chaqiramiz.

$ ./command-line-subcommands foo -enable -name=joe a1 a2
subcommand 'foo'
  enable: true
  name: joe
  tail: [a1 a2]

Endi bar’ni sinab ko’ramiz.

$ ./command-line-subcommands bar -level 8 a1
subcommand 'bar'
  level: 8
  tail: [a1]

Ammo bar foo’ning bayroqlarini qabul qilmaydi.

$ ./command-line-subcommands bar -enable a1
flag provided but not defined: -enable
Usage of bar:
  -level int
        level

Keyingi misolda dasturlarni parametrlashning yana bir keng tarqalgan usuli bo’lgan muhit o’zgaruvchilarini ko’rib chiqamiz.

Keyingi misol: .