<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FlagSet on PlumePHP</title><link>https://plumephp.com/tags/flagset/</link><description>Recent content in FlagSet on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 28 Aug 2023 20:22:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/flagset/index.xml" rel="self" type="application/rss+xml"/><item><title>Go CLI 子命令入门：用 flag.FlagSet 写清楚的命令行工具</title><link>https://plumephp.com/go-cli-flagset-subcommands-2023/</link><pubDate>Mon, 28 Aug 2023 20:22:00 +0800</pubDate><guid>https://plumephp.com/go-cli-flagset-subcommands-2023/</guid><description>&lt;h2 id="一个命令变多后main-很容易乱"&gt;一个命令变多后，main 很容易乱&lt;/h2&gt;
&lt;p&gt;Go 很适合写命令行工具。最开始你可能只有一个参数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;todo -file tasks.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后来需求变成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;todo add -title &lt;span class="s2"&gt;&amp;#34;学习 Go&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;todo list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;todo &lt;span class="k"&gt;done&lt;/span&gt; -id &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时如果还把所有参数都塞进全局 &lt;code&gt;flag&lt;/code&gt;，&lt;code&gt;main.go&lt;/code&gt; 会很快变乱。标准库 &lt;code&gt;flag.FlagSet&lt;/code&gt; 可以为每个子命令单独解析参数。你不一定要马上引入 Cobra 这类库，小工具用标准库就能组织得很清楚。&lt;/p&gt;</description></item></channel></rss>