2013-08-25 26 views
12

Có thể không đặt giá trị mặc định trong gói cờ trong Go? Ví dụ, trong gói cờ bạn có thể viết ra những dòng sau:gói cờ trong Go - tôi có phải luôn đặt giá trị mặc định không?

filename := flag.String("file", "test.csv", "Filename to cope with") 

Trong đoạn mã trên, tôi không muốn thiết đặt giá trị mặc định, đó là test.csv trong trường hợp này, và thay vào đó luôn làm cho người sử dụng chỉ định tên tệp của riêng họ và nếu nó không được chỉ định thì tôi muốn gây ra lỗi và thoát khỏi chương trình.

Một trong những cách tôi đưa ra là lần đầu tiên tôi kiểm tra giá trị filename sau khi thực hiện flag.Parse() và nếu giá trị đó là test.csv thì tôi có chương trình thoát với thông báo lỗi thích hợp. Tuy nhiên, tôi không muốn viết mã dự phòng như vậy nếu nó có thể trốn - và thậm chí nếu nó không thể, tôi muốn nghe bất kỳ cách nào tốt hơn để đối phó với vấn đề ở đây.

Bạn có thể làm những loại hoạt động trong mô-đun argparse Python bằng cách này - Tôi chỉ muốn thực hiện điều tương tự nếu tôi có thể ...

Ngoài ra, tôi có thể thực hiện cả hai lập luận ngắn hạn và dài (trong khác từ cả hai đối số -f-file?) trong gói cờ?

Cảm ơn.

+0

Vui lòng chỉ hỏi một câu hỏi cho mỗi câu hỏi. – Kissaki

Trả lời

16

Tôi nghĩ rằng đó là thành ngữ để thiết kế các giá trị cờ của bạn theo cách ngụ ý "không có mặt" khi bằng với giá trị bằng không của các loại tương ứng. Ví dụ:

optFile := flag.String("file", "", "Source file") 
flag.Parse() 
fn := *optFile 
if fn == "" { 
     fn = "/dev/stdin" 
} 
f, err := os.Open(fn) 
... 

rao câu hỏi thứ 2: IINM, gói lá cờ do thiết kế không phân biệt giữa -flag--flag. IOW, bạn có thể có cả hai số -f--file trong bộ cờ của mình và viết bất kỳ phiên bản nào của - hoặc -- trước cả hai ffile. Tuy nhiên, xem xét một cờ được xác định khác -g, gói cờ sẽ không nhận ra -gf foo là equvalent của -g -f foo.

+0

Ah, tôi đã không nghĩ ra một cách để sử dụng không gian trống rỗng, cảm ơn! – Blaszard

+4

Gói 'flag' có cung cấp cách kiểm tra xem cờ có được đặt không? Tôi không nói về các giá trị mặc định, hoặc không có giá trị. Ý tôi là, cho dù một lá cờ có mặt trong dòng lệnh. – Kiril

+1

@Kiril, bạn có thể sử dụng chức năng [Visit] (https://godoc.org/flag#Visit). –

5

Khi tôi có cờ không thể có giá trị mặc định, tôi thường sử dụng giá trị REQUIRED hoặc nội dung tương tự. Tôi thấy điều này làm cho số đọc --help dễ đọc hơn.

Vì lý do tại sao nó không được nướng, tôi nghi ngờ nó không được coi là đủ quan trọng. Mặc định sẽ không phù hợp với mọi nhu cầu. Tuy nhiên, cờ --help cũng tương tự; nó không phù hợp với mọi nhu cầu, nhưng nó đủ tốt hầu hết thời gian.

Điều đó không có nghĩa là cờ bắt buộc là ý tưởng tồi. Nếu bạn đam mê đủ, gói flagutil có thể tốt đẹp. Bọc flag api hiện tại, làm cho Parse trả về lỗi mô tả cờ bị thiếu và thêm RequiredIntRequiredIntVar v.v. Nếu nó trở nên hữu ích/phổ biến, nó có thể được hợp nhất với gói flag chính thức.

+0

Cảm ơn gói 'flagutil'. Tôi sẽ cho nó một viên đạn. – Blaszard

Các vấn đề liên quan