<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>09. 工具链 on Keith's Site</title><link>https://cqroot.github.io/docs/go/09-toolchains/</link><description>Recent content in 09. 工具链 on Keith's Site</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 23 Aug 2026 23:04:11 +0800</lastBuildDate><atom:link href="https://cqroot.github.io/docs/go/09-toolchains/index.xml" rel="self" type="application/rss+xml"/><item><title>01. Go 语言中的测试覆盖率</title><link>https://cqroot.github.io/docs/go/09-toolchains/01-test_cover/</link><pubDate>Sun, 23 Aug 2026 22:58:26 +0800</pubDate><guid>https://cqroot.github.io/docs/go/09-toolchains/01-test_cover/</guid><description>&lt;h2 id="1--cover"&gt;1. &lt;code&gt;-cover&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;go test -cover&lt;/code&gt; 可以启用代码覆盖率分析。&lt;/p&gt;
&lt;p&gt;当您指定 &lt;code&gt;-coverprofile&lt;/code&gt;、&lt;code&gt;-covermode&lt;/code&gt; 或 &lt;code&gt;-coverpkg&lt;/code&gt; 中的任何一个参数时，&lt;code&gt;go test&lt;/code&gt; 命令会自动启用覆盖率分析，相当于隐式包含了 &lt;code&gt;-cover&lt;/code&gt; 标志。&lt;/p&gt;
&lt;h2 id="2--covermode"&gt;2. &lt;code&gt;-covermode&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-covermode&lt;/code&gt; 可以设置覆盖率分析的模式。有三种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;：&lt;strong&gt;默认&lt;/strong&gt;。记录语句是否被执行过（布尔值）。开销最小；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;count&lt;/code&gt;：记录语句被执行的次数，即整数计数。开销中等；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;atomic&lt;/code&gt;：类似 &lt;code&gt;count&lt;/code&gt;，但用于并发程序，使用原子操作计数。开销最大，适用于并行测试环境。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;当与 &lt;code&gt;-race&lt;/code&gt; 一起使用时，无论是否显式指定，&lt;code&gt;-covermode&lt;/code&gt; 都会被强制设为 &lt;code&gt;atomic&lt;/code&gt;，以确保并发安全。若在命令行中同时指定 &lt;code&gt;-race&lt;/code&gt; 和其他模式，&lt;code&gt;go test&lt;/code&gt; 也会以 &lt;code&gt;atomic&lt;/code&gt; 为准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="3--coverpkg"&gt;3. &lt;code&gt;-coverpkg&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-coverpkg&lt;/code&gt; 可以指定要分析覆盖率的包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go test -cover -coverpkg&lt;span style="color:#f92672"&gt;=&lt;/span&gt;package1,package2,...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;默认只分析被测试的包；&lt;/li&gt;
&lt;li&gt;可以指定多个包（逗号分隔）；&lt;/li&gt;
&lt;li&gt;支持通配符模式。如 &lt;code&gt;go test -coverpkg=./...&lt;/code&gt; 或 &lt;code&gt;go test -coverpkg=myproject/...&lt;/code&gt; 会测试当前模块所有包，&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4--coverprofile"&gt;4. &lt;code&gt;-coverprofile&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-coverprofile&lt;/code&gt; 可以将覆盖率数据输出到文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 生成覆盖率文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go test -cover -coverprofile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;coverage.out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-coverprofile&lt;/code&gt; 可以生成详细的覆盖率数据文件，生成的文件可以用于生成 HTML 报告或其他分析。&lt;/p&gt;
&lt;h2 id="5-覆盖率数据分析"&gt;5. 覆盖率数据分析&lt;/h2&gt;
&lt;p&gt;当使用 &lt;code&gt;-coverprofile&lt;/code&gt; 生成覆盖率数据文件后，可以使用 &lt;code&gt;go tool cover&lt;/code&gt; 来可视化分析结果：&lt;/p&gt;</description></item><item><title>02. Go 中的代码静态分析工具：go vet</title><link>https://cqroot.github.io/docs/go/09-toolchains/02-go_vet/</link><pubDate>Sun, 23 Aug 2026 23:04:11 +0800</pubDate><guid>https://cqroot.github.io/docs/go/09-toolchains/02-go_vet/</guid><description>&lt;p&gt;&lt;code&gt;go vet&lt;/code&gt; 是 Go 自带的静态分析工具，用于检查代码中语法正确但可能有问题的模式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;code&gt;go vet&lt;/code&gt; 不会检查代码风格问题，那是 gofmt 等 formatter 的职责。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="示例"&gt;示例&lt;/h2&gt;
&lt;p&gt;对于以下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%v %v&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一般的 IDE 在编辑时就会提示问题，但是直接运行这段代码是可以执行的。对该项目执行以下命令进行检查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go vet ./...
&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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main.go:6:14: fmt.Printf format %s has arg 123 of wrong type int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main.go:7:14: fmt.Printf format %d has arg &amp;#34;hello&amp;#34; of wrong type string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main.go:8:17: fmt.Printf format %v reads arg #2, but call has 1 arg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main.go:9:14: fmt.Printf format %s reads arg #1, but call has 0 args
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>