2015-08-03 32 views

cevap

11

flag paketi zorunlu veya zorunlu bayrakları desteklemez (bayrak açıkça belirtilmelidir).

Yapabilecekleriniz, (tümü) bayraklar için mantıklı varsayılan değerler kullanmaktır. Ve eğer bir bayrak bir şey gibi hassas bir varsayılan değilse, uygulamanızın başlangıcındaki değeri kontrol edin ve bir hata mesajıyla durun. Yine de bayrak değerinin validasyonunu yapmalısınız (sadece gerekli bayraklar için değil), bu yüzden (büyük) genel bir yük anlamına gelmez ve bu genel olarak iyi bir uygulamadır.

3

CLI'da kullanmak üzere github.com/jessevdk/go-flags paketini beğeniyorum. Bayrağın zorunlu olarak ayarlanması için required özniteliği sağlanmıştır. Bunun gibi:

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

already mentioned olarak flag paket doğrudan bu özelliği sağlamaz ve genellikle (ve) mantıklı bir varsayılan sağlayamıyoruz olabilir. Sadece az sayıda bağımsız argümana (örneğin bir giriş ve çıkış dosya adı) ihtiyaç duyduğunuz durumlar için konumsal argümanlar kullanabilirsiniz (örneğin flag.Parse()'dan sonra flag.NArg()==2 ve ardından input, output := flag.Arg(0), flag.Arg(1)). Bununla birlikte, bunun mantıklı olmadığı bir durumunuz varsa; Herhangi bir tam sayı değerinin makul olduğu, ancak varsayılanın olmadığı herhangi bir sırayla kabul etmek istediğiniz birkaç tamsayı işaretini söyleyin. Sonra, önem verdiğiniz bayrakların açıkça ayarlanmış olup olmadığını kontrol etmek için flag.Visit işlevini kullanabilirsiniz. Bu, bir bayrakın varsayılan değerine açıkça ayarlanmış olup olmadığını söylemenin tek yolu olduğunu düşünüyorum (durumu koruyan Set özel bir flag.Value türünü değil). belki bir şey gibi Örneğin

:

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

ya "-b" veya bayrak açıkça ayarlanmadı "-s" Bu bir hata üretecektir.

1

go-flags hem gerekli bayraklar ve gerekli konumsal argümanları beyan sağlar: Eğer bayrak yolunu varsa yolu bazı değer içerir * eğer

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

, basitçe kontrol

var path = flag.String("f", "", "/path/to/access.log") 
flag.Parse() 
if *path == "" { 
    usage() 
    os.Exit(1) 
} 
İlgili konular