2013-03-26 38 views
3

我在寫一個需要訪問Internet的應用程序。從一些主機連接需要通過代理。我知道代理可以設置在一個環境變量上,但我想從應用程序本身來完成。 我需要一個可以用三種不同的方式使用的命令行參數:Go中的「3態」命令行參數

  1. 根本不給 - >無代理
  2. --use代理 - >使用默認的代理
  3. --use-代理「http://my-proxy.com:880」 - >使用指定的代理

以下用途默認或指定的地址,但不能用於忽略代理:

use_proxy:= flag.String( 「使用代理」, 「http://my-proxy.com:880」, 「使用代理...」)

這一個完成分只有1 & 2:

use_proxy := flag.Bool("use-proxy", false , "Use proxy...") 
if *use_proxy { 
    ... 
    proxyUrl, err := url.Parse("http://my-proxy.com:880") 
    ... 
} 

問題可以用兩個標誌來解決,但我寧願只使用一個:

MYAPP --use代理--proxy「http://my-proxy.com:880

+0

問題是分析器不會接受沒有值的參數。您至少需要像'myapp --use-proxy ='中那樣的'='。然後你可以通過沒有通過標誌來區分。 – 2013-03-26 09:42:57

+0

你的應用程序將如何解釋命令行,如'myapp --use-proxy --some-other-flag'? – 2013-03-26 09:52:16

+0

關於我最後一條評論的精度:解析器接受沒有值的參數,但只接受類型爲「boolValue」的Val(它是硬編碼的)。 – 2013-03-26 09:55:18

回答

3

如果您的應用程序絕對不會使用任何其他命令行參數,那麼您可以將--use-proxy設置爲布爾標誌,然後從第一個命令行參數(即os.Args)獲取代理URL。

雖然這可能不是一個好主意,但它限制了向程序添加額外的參數/選項。

大多數參數解析器不會處理這種情況,因爲它會使解析命令行選項變得模糊不清。

其他選擇可能是允許默認值的關鍵字,例如:

myapp --use-proxy "http://my-proxy.com:880" 
myapp --use-proxy default 

,或者使用兩個選項,這兩個啓用代理,但只有一個帶參數,如:

myapp --use-proxy <proxy URL> 
myapp --use-default-proxy