2017-10-19 111 views
-1

Go提供簡單的CLI切換aka標誌。隱藏標誌默認值

var debug = flag.Bool("debug", false, "enable debugging") 
var hostname = flag.String("hostname", "127.0.0.1", "hostname") 
flag.Parse() 

正如預期這會產生

> ./program -h 
Usage: 
    -debug 
      enable debugging 
    -hostname string 
      hostname (default "127.0.0.1") 

我想隱藏特定標誌的(default "127.0.0.1")一部分。

在SO上搜索和建議使用flag.FlagSet。

var shown flag.FlagSet 
var hidden flag.FlagSet 
var debug = shown.Bool("debug", false, "enable debugging") 
var hostname = hidden.String("hostname", "127.0.0.1", "hostname") 
flag.Usage = func() { 
    shown.PrintDefaults() 
} 
flag.Parse() 
//shown.Parse(os.Args[0:]) // tried to solve "flag provided but not defined" 

輸出部分只顯示「調試」標誌,但是這會中斷實際標誌的使用。

> ./program -debug 
flag provided but not defined: -debug 
Usage of ./program: 
    -debug 
      enable debugging 

這也不是很理想,因爲我想看到可用的標誌,只是隱藏默認值。

希望的輸出:

> ./program -h 
Usage: 
    -debug 
      enable debugging 
    -hostname string 
      hostname 
+2

打印默認值有一個原因。不要禁用它們。 – Volker

+2

你有沒有試過給它一個空的默認值,並檢查你的程序是空的,並用真正的默認值替代? –

+0

@Volker請詳細說明。 – liepumartins

回答

0

最佳溶液迄今所提出的一個Eugene。謝謝!

var debug = flag.Bool("debug", false, "enable debugging") 
var hostname = flag.String("hostname", "", "hostname") 
flag.Parse() 

defaultHostname := "127.0.0.1" 

if *hostname == "" { 
    *hostname = defaultHostname 
}