325 lines
15 KiB
Plaintext
Generated
325 lines
15 KiB
Plaintext
Generated
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Go в примерах: Флаги командной строки (Command-Line Flags)</title>
|
||
<link rel=stylesheet href="site.css">
|
||
</head>
|
||
<script>
|
||
onkeydown = (e) => {
|
||
|
||
if (e.key == "ArrowLeft") {
|
||
window.location.href = 'command-line-arguments';
|
||
}
|
||
|
||
|
||
if (e.key == "ArrowRight") {
|
||
window.location.href = 'command-line-subcommands';
|
||
}
|
||
|
||
}
|
||
</script>
|
||
<body>
|
||
<div class="example" id="command-line-flags">
|
||
<h2><a href="./">Go в примерах</a>: Флаги командной строки (Command-Line Flags)</h2>
|
||
|
||
<table>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p><a href="http://en.wikipedia.org/wiki/Command-line_interface#Command-line_option"><em>Флаги командной строки</em></a>
|
||
являются распространенным способом задания параметров
|
||
для программ командной строки. Например, в <code>wc -l</code> - <code>-l</code>
|
||
является флагом командной строки.</p>
|
||
|
||
</td>
|
||
<td class="code empty leading">
|
||
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
<a href="http://play.golang.org/p/_r_-ZzDzQUH" target="_blank"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
|
||
<div class="highlight"><pre><span class="kn">package</span> <span class="nx">main</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Go предоставляет пакет <code>flag</code>, поддерживающий базовый
|
||
парсинг флагов командной строки. Мы будем использовать
|
||
этот пакет для реализации нашего примера программы
|
||
командной строки.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="kn">import</span> <span class="p">(</span>
|
||
<span class="s">"flag"</span>
|
||
<span class="s">"fmt"</span>
|
||
<span class="p">)</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Основные объявления флагов доступны для строковых,
|
||
целочисленных и логических параметров. Здесь мы
|
||
объявляем строковой флаг <code>word</code> со значением по
|
||
умолчанию <code>"foo"</code> и кратким описанием. Функция
|
||
<code>flag.String</code> возвращает строковый указатель (не
|
||
строковое значение); мы увидим, как использовать
|
||
этот указатель ниже.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre> <span class="nx">wordPtr</span> <span class="o">:=</span> <span class="nx">flag</span><span class="p">.</span><span class="nx">String</span><span class="p">(</span><span class="s">"word"</span><span class="p">,</span> <span class="s">"foo"</span><span class="p">,</span> <span class="s">"a string"</span><span class="p">)</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Объявляем флаги <code>numb</code> и <code>fork</code>, используя тот же
|
||
подход, что и выше.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre> <span class="nx">numbPtr</span> <span class="o">:=</span> <span class="nx">flag</span><span class="p">.</span><span class="nx">Int</span><span class="p">(</span><span class="s">"numb"</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="s">"an int"</span><span class="p">)</span>
|
||
<span class="nx">boolPtr</span> <span class="o">:=</span> <span class="nx">flag</span><span class="p">.</span><span class="nx">Bool</span><span class="p">(</span><span class="s">"fork"</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="s">"a bool"</span><span class="p">)</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Также возможно вызвать метод, который использует
|
||
существующую переменную, объявленную в другом месте
|
||
программы. Обратите внимание, что в данном случае
|
||
необходимо передать указатель.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre> <span class="kd">var</span> <span class="nx">svar</span> <span class="kt">string</span>
|
||
<span class="nx">flag</span><span class="p">.</span><span class="nx">StringVar</span><span class="p">(</span><span class="o">&</span><span class="nx">svar</span><span class="p">,</span> <span class="s">"svar"</span><span class="p">,</span> <span class="s">"bar"</span><span class="p">,</span> <span class="s">"a string var"</span><span class="p">)</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Как только все флаги объявлены, вызовите <code>flag.Parse()</code>,
|
||
чтобы выполнить парсинг командной строки.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre> <span class="nx">flag</span><span class="p">.</span><span class="nx">Parse</span><span class="p">()</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Здесь мы просто выведем результат парсинга и все
|
||
введеные аргументы. Обратите внимание, что нам
|
||
нужно разыменовать указатели, например, с
|
||
помощью <code>*wordPtr</code>, чтобы получить фактические
|
||
значения.</p>
|
||
|
||
</td>
|
||
<td class="code">
|
||
|
||
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"word:"</span><span class="p">,</span> <span class="o">*</span><span class="nx">wordPtr</span><span class="p">)</span>
|
||
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"numb:"</span><span class="p">,</span> <span class="o">*</span><span class="nx">numbPtr</span><span class="p">)</span>
|
||
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"fork:"</span><span class="p">,</span> <span class="o">*</span><span class="nx">boolPtr</span><span class="p">)</span>
|
||
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"svar:"</span><span class="p">,</span> <span class="nx">svar</span><span class="p">)</span>
|
||
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"tail:"</span><span class="p">,</span> <span class="nx">flag</span><span class="p">.</span><span class="nx">Args</span><span class="p">())</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
</table>
|
||
|
||
<table>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Чтобы поэкспериментировать с программой флагов командной
|
||
строки, лучше сначала скомпилировать ее, а затем
|
||
напрямую запустить полученный бинарный файл.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> go build command-line-flags.go
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Попробуйте встроенную программу, сначала задав ей
|
||
значения для всех флагов.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -word<span class="o">=</span>opt -numb<span class="o">=</span><span class="m">7</span> -fork -svar<span class="o">=</span>flag
|
||
<span class="go">word: opt</span>
|
||
<span class="go">numb: 7</span>
|
||
<span class="go">fork: true</span>
|
||
<span class="go">svar: flag</span>
|
||
<span class="go">tail: []</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Обратите внимание, что если вы опустите флаги, они
|
||
автоматически примут свои значения по умолчанию.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -word<span class="o">=</span>opt
|
||
<span class="go">word: opt</span>
|
||
<span class="go">numb: 42</span>
|
||
<span class="go">fork: false</span>
|
||
<span class="go">svar: bar</span>
|
||
<span class="go">tail: []</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Конечные позиционные аргументы могут быть
|
||
предоставлены после любых флагов.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -word<span class="o">=</span>opt a1 a2 a3
|
||
<span class="go">word: opt</span>
|
||
<span class="go">...</span>
|
||
<span class="go">tail: [a1 a2 a3]</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Обратите внимание, что пакет <code>flag</code> требует, чтобы все
|
||
флаги отображались перед позиционными аргументами
|
||
(в противном случае флаги будут интерпретироваться
|
||
как позиционные аргументы).</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -word<span class="o">=</span>opt a1 a2 a3 -numb<span class="o">=</span>7
|
||
<span class="go">word: opt</span>
|
||
<span class="go">numb: 42</span>
|
||
<span class="go">fork: false</span>
|
||
<span class="go">svar: bar</span>
|
||
<span class="go">tail: [a1 a2 a3 -numb=7]</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Используйте флаги <code>-h</code> или <code>--help</code>, чтобы получить
|
||
автоматически сгенерированный текст справки для
|
||
программы командной строки.</p>
|
||
|
||
</td>
|
||
<td class="code leading">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -h
|
||
<span class="go">Usage of ./command-line-flags:</span>
|
||
<span class="go"> -fork=false: a bool</span>
|
||
<span class="go"> -numb=42: an int</span>
|
||
<span class="go"> -svar="bar": a string var</span>
|
||
<span class="go"> -word="foo": a string</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="docs">
|
||
<p>Если вы укажете флаг, который не был указан для пакета
|
||
флагов, программа напечатает сообщение об ошибке
|
||
и снова покажет текст справки.</p>
|
||
|
||
</td>
|
||
<td class="code">
|
||
|
||
<div class="highlight"><pre><span class="gp">$</span> ./command-line-flags -wat
|
||
<span class="go">flag provided but not defined: -wat</span>
|
||
<span class="go">Usage of ./command-line-flags:</span>
|
||
<span class="go">...</span>
|
||
</pre></div>
|
||
|
||
</td>
|
||
</tr>
|
||
|
||
</table>
|
||
|
||
|
||
<p class="next">
|
||
Следующий пример: <a href="command-line-subcommands">Подкоманды командной строки (Command-Line Subcommands)</a>.
|
||
</p>
|
||
|
||
<p class="footer">
|
||
by <a href="https://markmcgranaghan.com">Mark McGranaghan</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/command-line-flags">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
|
||
<br/>
|
||
переведено Nick S. | <a href="https://github.com/badkaktus/gobyexample">исходники</a>
|
||
</p>
|
||
</div>
|
||
<script>
|
||
var codeLines = [];
|
||
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import (\u000A \"flag\"\u000A \"fmt\"\u000A)\u000A');codeLines.push('func main() {\u000A');codeLines.push(' wordPtr := flag.String(\"word\", \"foo\", \"a string\")\u000A');codeLines.push(' numbPtr := flag.Int(\"numb\", 42, \"an int\")\u000A boolPtr := flag.Bool(\"fork\", false, \"a bool\")\u000A');codeLines.push(' var svar string\u000A flag.StringVar(&svar, \"svar\", \"bar\", \"a string var\")\u000A');codeLines.push(' flag.Parse()\u000A');codeLines.push(' fmt.Println(\"word:\", *wordPtr)\u000A fmt.Println(\"numb:\", *numbPtr)\u000A fmt.Println(\"fork:\", *boolPtr)\u000A fmt.Println(\"svar:\", svar)\u000A fmt.Println(\"tail:\", flag.Args())\u000A}\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');
|
||
</script>
|
||
<script src="site.js" async></script>
|
||
</body>
|
||
</html>
|