Go语言标准库之flag
<h1 class="post-title">Go语言flag包基本使用</h1><div class="post-content">
<p>Go语言内置的<code>flag</code>包实现了命令行参数的解析,<code>flag</code>包使得开发命令行工具更为简单。</p>
<h1 id="os-args">os.Args</h1>
<p>如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用<code>os.Args</code>来获取命令行参数。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main
import (
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">os</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">os.Args demo</span>
<span style="color: rgba(0, 0, 0, 1)">func main() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">os.Args是一个[]string</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> len(os.Args) > <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">for</span> index, arg :=<span style="color: rgba(0, 0, 0, 1)"> range os.Args {
fmt.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">args[%d]=%v\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, index, arg)
}
}
}</span></pre>
</div>
<p>将上面的代码执行<code>go build -o "args_demo"</code>编译之后,执行:</p>
<div class="cnblogs_code">
<pre>$ ./<span style="color: rgba(0, 0, 0, 1)">args_demo a b c d
args[</span><span style="color: rgba(128, 0, 128, 1)">0</span>]=./<span style="color: rgba(0, 0, 0, 1)">args_demo
args[</span><span style="color: rgba(128, 0, 128, 1)">1</span>]=<span style="color: rgba(0, 0, 0, 1)">a
args[</span><span style="color: rgba(128, 0, 128, 1)">2</span>]=<span style="color: rgba(0, 0, 0, 1)">b
args[</span><span style="color: rgba(128, 0, 128, 1)">3</span>]=<span style="color: rgba(0, 0, 0, 1)">c
args[</span><span style="color: rgba(128, 0, 128, 1)">4</span>]=d</pre>
</div>
<p><code>os.Args</code>是一个存储命令行参数的字符串切片,它的第一个元素是执行文件的名称。</p>
<h1 id="flag包基本使用">flag包基本使用</h1>
<p>本文介绍了flag包的常用函数和基本用法,更详细的内容请查看官方文档。</p>
<h2 id="导入flag包">导入flag包</h2>
<div class="cnblogs_code">
<pre>import flag</pre>
</div>
<h2>flag参数类型</h2>
<p>flag包支持的命令行参数类型有<code>bool</code>、<code>int</code>、<code>int64</code>、<code>uint</code>、<code>uint64</code>、<code>float</code><code>float64</code>、<code>string</code>、<code>duration</code>。</p>
<table>
<thead>
<tr><th>flag参数</th><th>有效值</th></tr>
</thead>
<tbody>
<tr>
<td>字符串flag</td>
<td>合法字符串</td>
</tr>
<tr>
<td>整数flag</td>
<td>1234、0664、0x1234等类型,也可以是负数。</td>
</tr>
<tr>
<td>浮点数flag</td>
<td>合法浮点数</td>
</tr>
<tr>
<td>bool类型flag</td>
<td>1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。</td>
</tr>
<tr>
<td>时间段flag</td>
<td>任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。<br>合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。</td>
</tr>
</tbody>
</table>
<h2 id="定义命令行flag参数">定义命令行flag参数</h2>
<p>有以下两种常用的定义命令行<code>flag</code>参数的方法。</p>
<h3 id="flag-type">flag.Type()</h3>
<p>基本格式如下:</p>
<p><code>flag.Type(flag名, 默认值, 帮助信息)*Type</code>
例如我们要定义姓名、年龄、婚否三个命令行参数,我们可以按如下方式定义:</p>
<div class="cnblogs_code">
<pre>name := flag.String(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张三</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">姓名</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
age :</span>= flag.Int(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">年龄</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
married :</span>= flag.Bool(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">married</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">false</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">婚否</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
delay :</span>= flag.Duration(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">时间间隔</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p>需要注意的是,此时<code>name</code>、<code>age</code>、<code>married</code>、<code>delay</code>均为对应类型的指针。</p>
<h3 id="flag-typevar">flag.TypeVar()</h3>
<p>基本格式如下: <code>flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)</code> 例如我们要定义姓名、年龄、婚否三个命令行参数,我们可以按如下方式定义:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> name <span style="color: rgba(0, 0, 255, 1)">string</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> age <span style="color: rgba(0, 0, 255, 1)">int</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> married <span style="color: rgba(0, 0, 255, 1)">bool</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> delay time.Duration
flag.StringVar(</span>&name, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张三</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">姓名</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.IntVar(</span>&age, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">年龄</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.BoolVar(</span>&married, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">married</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">false</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">婚否</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.DurationVar(</span>&delay, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">时间间隔</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<h2>flag.Parse()</h2>
<p>通过以上两种方法定义好命令行flag参数后,需要通过调用<code>flag.Parse()</code>来对命令行参数进行解析。</p>
<p>支持的命令行参数格式有以下几种:</p>
<ul>
<li><code>-flag xxx</code> (使用空格,一个<code>-</code>符号)</li>
<li><code>--flag xxx</code> (使用空格,两个<code>-</code>符号)</li>
<li><code>-flag=xxx</code> (使用等号,一个<code>-</code>符号)</li>
<li><code>--flag=xxx</code> (使用等号,两个<code>-</code>符号)</li>
</ul>
<p>其中,布尔类型的参数必须使用等号的方式指定。</p>
<p>Flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”–“之后停止。</p>
<h2 id="flag其他函数">flag其他函数</h2>
<div class="cnblogs_code">
<pre>flag.Args()<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">/返回命令行参数后的其他参数,以[]string类型</span>
flag.NArg()<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回命令行参数后的其他参数个数</span>
flag.NFlag() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回使用的命令行参数个数</span></pre>
</div>
<h2>完整示例</h2>
<h3 id="定义">定义</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">func main() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义命令行参数方式1</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> name <span style="color: rgba(0, 0, 255, 1)">string</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> age <span style="color: rgba(0, 0, 255, 1)">int</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> married <span style="color: rgba(0, 0, 255, 1)">bool</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> delay time.Duration
flag.StringVar(</span>&name, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张三</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">姓名</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.IntVar(</span>&age, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">年龄</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.BoolVar(</span>&married, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">married</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">false</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">婚否</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
flag.DurationVar(</span>&delay, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">延迟的时间间隔</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">解析命令行参数</span>
<span style="color: rgba(0, 0, 0, 1)"> flag.Parse()
fmt.Println(name, age, married, delay)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回命令行参数后的其他参数</span>
<span style="color: rgba(0, 0, 0, 1)"> fmt.Println(flag.Args())
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回命令行参数后的其他参数个数</span>
<span style="color: rgba(0, 0, 0, 1)"> fmt.Println(flag.NArg())
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回使用的命令行参数个数</span>
<span style="color: rgba(0, 0, 0, 1)"> fmt.Println(flag.NFlag())
}</span></pre>
</div>
<h3>使用</h3>
<p>命令行参数使用提示:</p>
<div class="cnblogs_code">
<pre>$ ./flag_demo -<span style="color: rgba(0, 0, 0, 1)">help
Usage of .</span>/<span style="color: rgba(0, 0, 0, 1)">flag_demo:
</span>-age <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">
年龄 (</span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(128, 0, 128, 1)">18</span><span style="color: rgba(0, 0, 0, 1)">)
</span>-<span style="color: rgba(0, 0, 0, 1)">d duration
时间间隔
</span>-<span style="color: rgba(0, 0, 0, 1)">married
婚否
</span>-name <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
姓名 (</span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张三</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p>正常使用命令行flag参数:</p>
<pre><code class="language-bash">$ ./flag_demo -name 小明 --age 18 -married=false -d=1h30m
小明 18 false 1h30m0s
[]
0
4
</code></pre>
<p>使用非flag命令行参数:</p>
<pre><code class="language-bash">$ ./flag_demo a b c
张三 18 false 0s
3
0
</code></pre>
</div><br><br>
来源:https://www.cnblogs.com/aaronthon/p/10883711.html
頁:
[1]