英文:
"3 state" command line arguments in Go
问题
我正在编写一个需要访问互联网的应用程序。对于一些主机,连接需要通过代理进行。我知道代理可以在环境变量中设置,但我想从应用程序本身进行设置。
我需要一个命令行参数,可以以三种不同的方式使用:
- 完全不给出 -> 不使用代理
- --use-proxy -> 使用默认代理
- --use-proxy "http://my-proxy.com:880" -> 使用给定的代理
以下使用默认或给定的地址,但不能用于忽略代理:
> use_proxy := flag.String("use-proxy", "http://my-proxy.com:880", "使用代理...")
这个只实现了第1和第2点:
use_proxy := flag.Bool("use-proxy", false , "使用代理...")
if *use_proxy {
...
proxyUrl, err := url.Parse("http://my-proxy.com:880")
...
}
这个问题可以通过两个标志来解决,但我宁愿只使用一个:
> myapp --use-proxy --proxy "http://my-proxy.com:880"
英文:
I'm writing an application that needs access to Internet. From some hosts the connection needs to go through proxy. I know that proxy can be set on an environment variable, but I want to do it from the application itself.
I need a command line argument that can be used in three different ways:
- not given at all -> no proxy
- --use-proxy -> use default proxy
- --use-proxy "http://my-proxy.com:880" -> uses given proxy
Following uses default or given address but cannot be used to ignore proxy:
> use_proxy := flag.String("use-proxy", "http://my-proxy.com:880", "Use proxy...")
This one accomplishes only points 1 & 2:
use_proxy := flag.Bool("use-proxy", false , "Use proxy...")
if *use_proxy {
...
proxyUrl, err := url.Parse("http://my-proxy.com:880")
...
}
The problem could be solved with two flags but I'd rather use just one:
> myapp --use-proxy --proxy "http://my-proxy.com:880"
答案1
得分: 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
英文:
If your app definitely won't use any other command line arguments, then you can just make --use-proxy
a boolean flag, and then get the proxy URL from the first command line argument, i.e. from os.Args
.
This probably isn't a good idea long term though, as it restricts adding additional arguments/options to your program.
Most argument parsers won't handle a case like this, since it makes parsing command line options ambiguous.
Other options could be to allow a keyword for the default value, e.g.:
myapp --use-proxy "http://my-proxy.com:880"
myapp --use-proxy default
or to use two options, both of which enable the proxy, but having only one take an argument, e.g.:
myapp --use-proxy <proxy URL>
myapp --use-default-proxy
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论