Go by Example: Command-Line Subcommands

Một vài công cụ dòng lệnh, giống như công cụ go tool hoặc git có nhiều lệnh con, mõi lệnh con có bộ cờ riêng của nó. Ví dụ, go buildgo get là hai lệnh con khác nhau của công cụ go. Package (gói) flag cho phép chúng ta dễ dàng xác định các lệnh con đơn giản có bộ cờ riêng của chúng.

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

Chúng ta khai báo một lệnh con bằng cách sử dụng hàm NewFlagSet và tiếp tục định nghĩa các cờ mới cụ thể cho lệnh con này.

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

Đối với một lệnh con khác, chúng ta có thể xác định các cờ được hỗ trợ khác nhau.

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

Lệnh con được mong đợi là đối số đầu tiên cho chương trình.

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

Kiểm tra lệnh con được kích hoạt.

    switch os.Args[1] {

Đối với mỗi lệnh con, chúng tôi phân tích cú pháp các cờ của nó và có quyền truy cập vào các đối số vị trí cuối cùng.

    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 

Đầu tiên kích hoạt lệnh con foo.

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

Bây giờ thử bar.

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

Nhưng bar sẽ không chấp nhận các cờ của foo.

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

Tiếp theo, chúng ta sẽ xem xét biến môi trường, một cách phổ biến khác để tham số hóa các chương trình.

Ví dụ tiếp theo: Environment Variables.