2015-08-03 20 views

Trả lời

11

Gói flag không hỗ trợ cờ bắt buộc hoặc bắt buộc (nghĩa là cờ phải được chỉ định rõ ràng).

Những gì bạn có thể làm là sử dụng các giá trị mặc định hợp lý cho (tất cả) cờ. Và nếu một lá cờ là một cái gì đó giống như không có mặc định hợp lý, kiểm tra giá trị ở đầu của ứng dụng của bạn và ngăn chặn với một thông báo lỗi. Bạn nên thực hiện xác nhận giá trị cờ (không chỉ cho cờ bắt buộc), do đó, điều này không có nghĩa là bất kỳ chi phí lớn nào, và đây là một thực hành tốt nói chung.

3

Tôi thích gói github.com/jessevdk/go-flags để sử dụng trong CLI. Nó cung cấp thuộc tính required, để đặt cờ bắt buộc. Như thế:

var opts struct { 
... 
    // Example of a required flag 
    Name string `short:"n" long:"name" description:"A name" required:"true"` 
... 
} 
3

Như already mentioned, gói flag không cung cấp tính năng này trực tiếp và thường bạn có thể (và nên) có thể cung cấp một mặc định hợp lý. Đối với trường hợp bạn chỉ cần một số ít đối số rõ ràng (ví dụ: tên tệp đầu vào và đầu ra), bạn có thể sử dụng đối số vị trí (ví dụ: sau flag.Parse() kiểm tra xem flag.NArg()==2 và sau đó input, output := flag.Arg(0), flag.Arg(1)).

Nếu tuy nhiên, bạn có trường hợp điều này không hợp lý; nói một vài cờ nguyên bạn muốn chấp nhận theo thứ tự bất kỳ, trong đó bất kỳ giá trị số nguyên nào là hợp lý, nhưng không có giá trị mặc định. Sau đó, bạn có thể sử dụng chức năng flag.Visit để kiểm tra xem các cờ bạn quan tâm có được đặt rõ ràng hay không. Tôi nghĩ rằng đây là cách duy nhất để biết liệu một lá cờ được đặt rõ ràng là giá trị mặc định của nó (không tính một loại tùy chỉnh flag.Value với việc thực hiện Set giữ trạng thái).

Ví dụ, có lẽ cái gì đó như:

required := []string{"b", "s"} 
    flag.Parse() 

    seen := make(map[string]bool) 
    flag.Visit(func(f *flag.Flag) { seen[f.Name] = true }) 
    for _, req := range required { 
     if !seen[req] { 
      // or possibly use `log.Fatalf` instead of: 
      fmt.Fprintf(os.Stderr, "missing required -%s argument/flag\n", req) 
      os.Exit(2) // the same exit code flag.Parse uses 
     } 
    } 

Playground

Điều này sẽ tạo ra một lỗi nếu một trong hai "-b" hoặc "-s" cờ không được thiết lập một cách rõ ràng.

1

go-flags cho phép bạn khai báo cả hai lá cờ yêu cầu và đòi hỏi đối số vị trí:

var opts struct { 
    Flag string `short:"f" required:"true" name:"a flag"` 
    Args struct { 
     First string `positional-arg-name:"first arg"` 
     Sencond string `positional-arg-name:"second arg"` 
    } `positional-args:"true" required:"2"` 
} 
args, err := flags.Parse(&opts) 
1

Nếu bạn có con đường cờ, chỉ cần kiểm tra xem * đường dẫn chứa một số giá trị

var path = flag.String("f", "", "/path/to/access.log") 
flag.Parse() 
if *path == "" { 
    usage() 
    os.Exit(1) 
} 
Các vấn đề liên quan