2014-07-01 14 views
17

Tài liệu Go (http://golang.org/pkg/flag/) nói:Xác định FlagSets độc lập trong GoLang

Loại FlagSet cho phép một để xác định tập độc lập với cờ, chẳng hạn như để thực hiện lệnh con trong một giao diện dòng lệnh.

Tôi cần chức năng này nhưng tôi không thể tìm ra cách thuyết phục pkg cờ để làm điều đó. Khi tôi định nghĩa hai FlagSets, việc phân tích cú pháp một trong số chúng sẽ cho tôi lỗi và cảnh báo nếu dòng lệnh có các lá cờ có nghĩa là thứ hai. Ví dụ:

f1 := flag.NewFlagSet("f1", flag.ContinueOnError) 
apply := f1.Bool("apply", false, "") 
silent := f1.Bool("silent", false, "") 
if err := f1.Parse(os.Args[1:]); err == nil { 
    fmt.Println(*apply, *silent) 
} 
f2 := flag.NewFlagSet("f2", flag.ContinueOnError) 
reset := f2.Bool("reset", false, "") 
if err := f2.Parse(os.Args[1:]); err == nil { 
    fmt.Println(*reset) 
} 

tôi nhận được tất cả các loại cảnh báo nếu tôi cố gắng làm cmd -apply HOẶC cmd -reset. Tôi muốn tách riêng các FlagSets này vì tôi chỉ muốn có -silent hoạt động cho -apply.

Tôi đang thiếu gì?

+0

mà không đi vào vấn đề cụ thể này - cho phép tôi khuyên bạn nên một lá cờ thay thế tuyệt vời phân tích cú pháp mà tôi đang sử dụng (không phải công việc của tôi, tôi giống như nó). https://github.com/jessevdk/go-flags –

+1

Phân tích cú pháp 'FlagSet' sẽ tiêu thụ tất cả các tùy chọn và sẽ không bỏ qua một số tùy chọn, vì vậy bạn sẽ phải xác định trước khi phân tích cú pháp FlagSet mà một ứng dụng được áp dụng. Nếu "thiết lập lại" và "áp dụng" là tiểu ban với các cờ khác nhau, hãy xác định tiểu ban nào chạy và phân tích cú pháp FlagSet đó. Những gì bạn đang cố gắng làm không thể được thực hiện. – Volker

Trả lời

33

Bạn có nghĩa là để phân biệt giữa các tiểu ban đầu tiên, và sau đó gọi Parse ở bên phải FlagSet.

f1 := flag.NewFlagSet("f1", flag.ContinueOnError) 
silent := f1.Bool("silent", false, "") 
f2 := flag.NewFlagSet("f2", flag.ContinueOnError) 
loud := f2.Bool("loud", false, "") 

switch os.Args[1] { 
    case "apply": 
    if err := f1.Parse(os.Args[2:]); err == nil { 
     fmt.Println("apply", *silent) 
    } 
    case "reset": 
    if err := f2.Parse(os.Args[2:]); err == nil { 
     fmt.Println("reset", *loud) 
    } 
} 

http://play.golang.org/p/eaEEx_EReX

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