Có cách nào để đặt cờ nhất định là bắt buộc hay tôi phải tự mình kiểm tra sự hiện diện của mình?Có thể đặt cờ dòng lệnh trong Go được đặt thành bắt buộc không?
Trả lời
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.
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"`
...
}
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
}
}
Đ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.
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)
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)
}
- 1. boost :: program_options - Có thể thực thi cờ bắt buộc không?
- 2. gói cờ trong Go - tôi có phải luôn đặt giá trị mặc định không?
- 3. Có thể đặt cờ python -O (tối ưu hóa) trong một tập lệnh không?
- 4. cài đặt không nhận ra cờ "-o"
- 5. không biên dịch nếu cờ bắt buộc không có mặt
- 6. Có thể truyền 'bắt buộc' thành chỉ thị AngularJS không?
- 7. Không thể đặt cờ trình biên dịch trong Xcode 4.3.3
- 8. Cờ dòng lệnh không được hỗ trợ: --ignore-certificate-errors
- 9. Làm cách nào để đặt bit cờ "không phân đoạn" cho gói TCP trong Go?
- 10. Có lệnh dòng lệnh để xác minh phiên bản .NET nào đã được cài đặt không.
- 11. Điều gì có thể khiến cờ đặt lại TCP/IP (RST) KHÔNG được gửi?
- 12. C++ - Cách đặt lại cờ thao tác dòng đầu ra
- 13. Cách cài đặt gói thành phần Delphi từ dòng lệnh?
- 14. Tôi có thể tạo ràng buộc mặc định được đặt tên trong câu lệnh thêm cột trong SQL Server không?
- 15. Cách kiểm tra xem thuộc tính bắt buộc có được đặt trên một trường
- 16. Có thể đặt đối tượng thành không?
- 17. Làm cách nào tôi có thể xem các lệnh biên dịch nội bộ không thành công trong quá trình cài đặt "go get"?
- 18. Cài đặt vim-go trong linux?
- 19. cách chạy cài đặt nhóm không có cờ yên tĩnh
- 20. Lỗi cài đặt NSIS Cờ
- 21. cmake - nhận các cờ dòng lệnh được sử dụng "-D"
- 22. Cài đặt plugin không thành công vì các mục bắt buộc bị thiếu
- 23. glReadPixels() đặt cờ GL_INVALID_OPERATION không có lý do
- 24. Cài đặt một vimball từ dòng lệnh
- 25. Cách bắt đầu textmate trong dòng lệnh
- 26. GetOpenFileName() với cờ OFN_ALLOWMULTISELECT đặt
- 27. Đặt JVM qua dòng lệnh trên Windows
- 28. Có thể khởi chạy hộp thoại cài đặt proxy của IE từ dòng lệnh không?
- 29. $ GOPATH không được đặt thành $ GOROOT, tại sao không?
- 30. Đối số chưa được đặt tên có phải là điều trong Go không?