<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>语言进阶 on 鹿鸣青野的blog</title><link>https://www.sylgalaxy.xyz/tags/%E8%AF%AD%E8%A8%80%E8%BF%9B%E9%98%B6/</link><description>Recent content in 语言进阶 on 鹿鸣青野的blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 13 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.sylgalaxy.xyz/tags/%E8%AF%AD%E8%A8%80%E8%BF%9B%E9%98%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>encoding/json 与配置文件</title><link>https://www.sylgalaxy.xyz/posts/go-02-05-encoding-json/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-05-encoding-json/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的 nlohmann/json 到 Go 的 encoding/json：结构体标签驱动的序列化&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;Go 的 &lt;code&gt;encoding/json&lt;/code&gt; 是标准库内置的 JSON 序列化/反序列化包。与 C++ 需要第三方库（nlohmann/json、rapidjson）不同，Go 通过**结构体字段标签（struct tag）**声明式地描述 JSON 映射关系，&lt;code&gt;json.Marshal&lt;/code&gt; / &lt;code&gt;json.Unmarshal&lt;/code&gt; 一键完成转换。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：Go 的 JSON 哲学是&amp;quot;&lt;strong&gt;结构体即 schema&lt;/strong&gt;&amp;quot;——先用结构体定义数据形状，标签控制字段名、可选性、忽略规则。这也让配置文件读写（JSON/YAML）变得极其自然。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JSON 库&lt;/td&gt;
&lt;td&gt;nlohmann/json 等第三方&lt;/td&gt;
&lt;td&gt;&lt;code&gt;encoding/json&lt;/code&gt; 标准库&lt;/td&gt;
&lt;td&gt;开箱即用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对象映射&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json j = json::parse(s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json.Unmarshal(data, &amp;amp;v)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;需要目标结构体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;序列化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;j.dump()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json.Marshal(v)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 []byte + error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字段改名&lt;/td&gt;
&lt;td&gt;手动构造&lt;/td&gt;
&lt;td&gt;struct tag &lt;code&gt;`json:&amp;quot;name&amp;quot;`&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;声明式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;忽略字段&lt;/td&gt;
&lt;td&gt;手动排除&lt;/td&gt;
&lt;td&gt;&lt;code&gt;`json:&amp;quot;-&amp;quot;`&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标签控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选字段&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;&lt;code&gt;omitempty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;零值不输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动态 JSON&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json::object()&lt;/code&gt; / 数组&lt;/td&gt;
&lt;td&gt;&lt;code&gt;map[string]any&lt;/code&gt; / &lt;code&gt;[]any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用 any 容器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置文件&lt;/td&gt;
&lt;td&gt;Boost.PropertyTree / YAML 库&lt;/td&gt;
&lt;td&gt;读 JSON 或第三方 YAML（gopkg.in/yaml.v3）&lt;/td&gt;
&lt;td&gt;JSON 为主&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三序列化与反序列化"&gt;三、序列化与反序列化&lt;/h2&gt;
&lt;h3 id="31-基本用法"&gt;3.1 基本用法&lt;/h3&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;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Age&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&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&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;p&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Tom&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Age&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&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:#75715e"&gt;// 序列化：结构体 → JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Marshal&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; panic(&lt;span style="color:#a6e22e"&gt;err&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:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(string(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;)) &lt;span style="color:#75715e"&gt;// {&amp;#34;Name&amp;#34;:&amp;#34;Tom&amp;#34;,&amp;#34;Age&amp;#34;:30}&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:#75715e"&gt;// 反序列化：JSON → 结构体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Unmarshal&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; panic(&lt;span style="color:#a6e22e"&gt;err&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:#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\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// {Name:Tom Age:30}&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;h3 id="32-结构体标签关键"&gt;3.2 结构体标签（关键）&lt;/h3&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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Config&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Server&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;server&amp;#34;`&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 字段名映射为 server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Port&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;port&amp;#34;`&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 默认 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Debug&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;debug,omitempty&amp;#34;`&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; &lt;span style="color:#a6e22e"&gt;Secret&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;-&amp;#34;`&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 永远不参与 JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Tags&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;tags,omitempty&amp;#34;`&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;}
&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:#a6e22e"&gt;c&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Config&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;Server&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Secret&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;不输出&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;data&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Marshal&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&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;Println&lt;/span&gt;(string(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;)) &lt;span style="color:#75715e"&gt;// {&amp;#34;server&amp;#34;:&amp;#34;localhost&amp;#34;,&amp;#34;port&amp;#34;:0}（debug/tags 因 omitempty 省略，port 没有 omitempty 所以零值照样输出，secret 被 json:&amp;#34;-&amp;#34; 忽略）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;标签规则&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>标准库核心包：fmt / strings / os / io / time</title><link>https://www.sylgalaxy.xyz/posts/go-02-04-fmt-strings-os-io/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-04-fmt-strings-os-io/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的 iostream / string / fstream / chrono 到 Go 标准库核心包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;Go 标准库是&amp;quot;开箱即用&amp;quot;的典范——网络、JSON、加密、压缩、时间、文件全都在标准库里。本笔记聚焦日常开发最高频的 5 个包：&lt;code&gt;fmt&lt;/code&gt;（格式化）、&lt;code&gt;strings&lt;/code&gt;（字符串）、&lt;code&gt;os&lt;/code&gt;（文件/环境）、&lt;code&gt;io&lt;/code&gt;（读写抽象）、&lt;code&gt;time&lt;/code&gt;（时间）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：这些包配合 Go 的&amp;quot;接口即抽象&amp;quot;哲学（&lt;code&gt;io.Reader&lt;/code&gt; / &lt;code&gt;io.Writer&lt;/code&gt;），形成了统一的数据流处理模型——&lt;strong&gt;你写的函数只需要面向接口，就能处理文件、内存、网络任何来源&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;格式化输出&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::cout &amp;lt;&amp;lt; x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Println(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 内置格式动词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;格式化字符串&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sprintf(buf, &amp;quot;%d&amp;quot;, x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Sprintf(&amp;quot;%d&amp;quot;, x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 string，无缓冲区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字符串操作&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::string&lt;/code&gt; / &lt;code&gt;&amp;lt;cstring&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strings&lt;/code&gt; 包&lt;/td&gt;
&lt;td&gt;函数式，无成员方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字符串拼接&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s1 + s2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strings.Join&lt;/code&gt; / &lt;code&gt;strings.Builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大量拼接用 Builder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文件读取&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::ifstream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.Open&lt;/code&gt; + &lt;code&gt;io.ReadAll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;接口化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文件写入&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::ofstream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.WriteFile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一键写整个文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;时间获取&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::chrono::system_clock::now()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time.Now()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 Time 结构体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;休眠&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::this_thread::sleep_for&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time.Sleep&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用法相似&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计时&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::chrono::duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time.Since(t)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 Duration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三fmt--格式化"&gt;三、fmt —— 格式化&lt;/h2&gt;
&lt;h3 id="31-输出函数"&gt;3.1 输出函数&lt;/h3&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:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 无换行、无空格: ab&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;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 空格分隔 + 换行: a b&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 %d&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;go&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 格式化: go 1&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:#75715e"&gt;// 返回字符串版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Sprintf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%s-%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// &amp;#34;v-3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-常用格式动词"&gt;3.2 常用格式动词&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;动词&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认格式（任意类型）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Printf(&amp;quot;%v&amp;quot;, 42)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%+v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;结构体带字段名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Printf(&amp;quot;%+v&amp;quot;, p)&lt;/code&gt; → &lt;code&gt;{Name:tom Age:18}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%#v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 语法表示&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Printf(&amp;quot;%#v&amp;quot;, p)&lt;/code&gt; → &lt;code&gt;main.Person{Name:&amp;quot;tom&amp;quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;类型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Printf(&amp;quot;%T&amp;quot;, 42)&lt;/code&gt; → &lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;十进制整数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;42&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;十六进制&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2a&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%f&lt;/code&gt; / &lt;code&gt;%.2f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浮点 / 保留两位&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.14&lt;/code&gt; / &lt;code&gt;3.14&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;hello&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;带引号字符串&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;hello&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;%p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指针地址&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xc0000b2000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="33-对齐与宽度"&gt;3.3 对齐与宽度&lt;/h3&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:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%-10s|%10s\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// left | right&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:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%05d\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;42&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 00042（前导零）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="四strings--字符串处理"&gt;四、strings —— 字符串处理&lt;/h2&gt;
&lt;p&gt;Go 的 &lt;code&gt;string&lt;/code&gt; 是不可变值类型，所有操作都返回新字符串。&lt;/p&gt;</description></item><item><title>错误处理：error / panic / recover</title><link>https://www.sylgalaxy.xyz/posts/go-02-02-error-panic-recover/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-02-error-panic-recover/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的 try/catch/throw 到 Go 的显式错误返回值、panic 与 defer+recover&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;Go 的错误处理哲学和 C++ &lt;strong&gt;完全相反&lt;/strong&gt;：不抛异常，而是把错误当作&lt;strong&gt;普通返回值&lt;/strong&gt;显式传递。函数签名里直接写明&amp;quot;可能返回错误&amp;quot;，调用方必须处理。这套设计的核心目标：&lt;strong&gt;错误路径在代码里一目了然，绝不静默吞掉&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Go 提供三层错误机制：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;机制&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;类似 C++&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error&lt;/code&gt; 返回值&lt;/td&gt;
&lt;td&gt;可预期、应处理的错误（文件不存在、网络失败…）&lt;/td&gt;
&lt;td&gt;返回码 / &lt;code&gt;std::error_code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;panic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不可恢复的严重错误（越界、空指针…）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;throw&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在 defer 中捕获 panic&lt;/td&gt;
&lt;td&gt;&lt;code&gt;catch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：能用 &lt;code&gt;error&lt;/code&gt; 就不要 &lt;code&gt;panic&lt;/code&gt;。&lt;code&gt;panic&lt;/code&gt; 是&amp;quot;程序无法继续&amp;quot;的最后手段，&lt;code&gt;recover&lt;/code&gt; 只用于极少数场景（如防止 goroutine 崩溃拖垮整个程序）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;抛出错误&lt;/td&gt;
&lt;td&gt;&lt;code&gt;throw std::runtime_error(&amp;quot;...&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;return errors.New(&amp;quot;...&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 是返回值，不是跳转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;捕获错误&lt;/td&gt;
&lt;td&gt;&lt;code&gt;try { } catch (const std::exception&amp;amp; e)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;if err != nil { ... }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 用 if 判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;错误类型&lt;/td&gt;
&lt;td&gt;异常类层级&lt;/td&gt;
&lt;td&gt;&lt;code&gt;error&lt;/code&gt; 接口&lt;/td&gt;
&lt;td&gt;Go 只有一个 error 接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;清理资源&lt;/td&gt;
&lt;td&gt;RAII / 析构&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;函数级，非作用域级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;致命错误&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::terminate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;panic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;都是不可恢复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;兜底捕获&lt;/td&gt;
&lt;td&gt;&lt;code&gt;catch (...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer func() { recover() }()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;recover 必须在 defer 中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;错误包装&lt;/td&gt;
&lt;td&gt;异常嵌套&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Errorf(&amp;quot;%w&amp;quot;, err)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%w&lt;/code&gt; 支持解包判断&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三error-接口"&gt;三、error 接口&lt;/h2&gt;
&lt;p&gt;Go 的 &lt;code&gt;error&lt;/code&gt; 是一个&lt;strong&gt;预定义接口&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>泛型 generics</title><link>https://www.sylgalaxy.xyz/posts/go-02-03-generics/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-03-generics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的 template 到 Go 1.18+ 的类型参数：更克制的泛型设计&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;Go 1.18 正式引入泛型（类型参数 Type Parameters）。与 C++ 模板相比，Go 泛型&lt;strong&gt;刻意保持简单&lt;/strong&gt;：没有特化、偏特化、模板元编程、运算符重载，只有&amp;quot;类型参数 + 约束（constraint）&amp;ldquo;两个核心概念。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：Go 泛型的定位是&lt;strong&gt;解决&amp;quot;写一遍、多个类型用&amp;quot;的容器与工具函数问题&lt;/strong&gt;，不是用来做编译期计算的。能用接口解决的场景，优先接口；泛型是接口的补充而非替代。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;声明&lt;/td&gt;
&lt;td&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;func F[T any](...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 用 &lt;code&gt;[T]&lt;/code&gt; 方括号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型约束&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::is_integral_v&amp;lt;T&amp;gt;&lt;/code&gt; / requires&lt;/td&gt;
&lt;td&gt;&lt;code&gt;T int | float64&lt;/code&gt; 或 &lt;code&gt;constraints.Ordered&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 用类型集（union）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;template&amp;lt;&amp;gt; struct X&amp;lt;int&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;Go 没有特化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;偏特化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt; struct X&amp;lt;T*&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;Go 没有偏特化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;默认参数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;template &amp;lt;typename T = int&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;无默认类型参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泛型类&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::vector&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type Vec[T any] []T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;泛型类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泛型函数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;T max(T a, T b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;func Max[T constraints.Ordered](a, b T) T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;语法不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编译期计算&lt;/td&gt;
&lt;td&gt;模板元编程 / constexpr&lt;/td&gt;
&lt;td&gt;❌ 无&lt;/td&gt;
&lt;td&gt;Go 泛型是运行时类型，非代码生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运算符重载&lt;/td&gt;
&lt;td&gt;可对类型重载&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;泛型内不能直接用 &lt;code&gt;+&lt;/code&gt; 除非约束允许&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三泛型函数"&gt;三、泛型函数&lt;/h2&gt;
&lt;h3 id="31-基本语法"&gt;3.1 基本语法&lt;/h3&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:#75715e"&gt;// [T any] 声明类型参数；T 在参数和返回值中可用&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;Min&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;any&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ❌ 编译错误：any 没有约束，不能比较大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// if a &amp;lt; b { return a }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&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;&lt;strong&gt;问题&lt;/strong&gt;：&lt;code&gt;any&lt;/code&gt; 意味着&amp;quot;任意类型&amp;rdquo;，编译器不知道 &lt;code&gt;T&lt;/code&gt; 是否支持 &lt;code&gt;&amp;lt;&lt;/code&gt;。必须用&lt;strong&gt;约束&lt;/strong&gt;声明&amp;quot;T 是支持比较的有序类型&amp;quot;：&lt;/p&gt;</description></item><item><title>接口 interface</title><link>https://www.sylgalaxy.xyz/posts/go-02-01-interface/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-01-interface/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的虚函数/抽象类到 Go 的接口：鸭子类型、隐式实现与组合式设计&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;Go 的 &lt;code&gt;interface&lt;/code&gt; 是一组&lt;strong&gt;方法签名&lt;/strong&gt;的集合，它定义了类型&amp;quot;能做什么&amp;quot;，而不是&amp;quot;是什么&amp;quot;。与 C++ 的抽象类最大的不同：Go 接口是&lt;strong&gt;隐式实现&lt;/strong&gt;——一个类型只要实现了接口里的所有方法，就自动满足该接口，&lt;strong&gt;不需要显式声明&lt;/strong&gt; &lt;code&gt;implements&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：Go 接口让&amp;quot;面向接口编程&amp;quot;从设计原则变成了语言级强制。它催生了组合优于继承、依赖注入、mock 测试等一整套惯用法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;抽象接口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class Shape { virtual double area() = 0; }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type Shape interface { Area() float64 }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 只有方法签名，没有数据成员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实现&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class Circle : public Shape { ... }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;func (c Circle) Area() float64 { ... }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;隐式实现&lt;/strong&gt;，无需继承声明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多态&lt;/td&gt;
&lt;td&gt;虚函数表 vtable + 指针/引用&lt;/td&gt;
&lt;td&gt;接口值（类型 + 数据指针）&lt;/td&gt;
&lt;td&gt;运行时动态分派，机制不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;空接口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;void*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;interface{}&lt;/code&gt; / &lt;code&gt;any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表示任意类型，但不建议滥用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;接口嵌套&lt;/td&gt;
&lt;td&gt;多重继承（菱形问题）&lt;/td&gt;
&lt;td&gt;接口嵌入接口&lt;/td&gt;
&lt;td&gt;无菱形问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型断言&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dynamic_cast&amp;lt;T*&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v, ok := x.(T)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 更安全：带 ok 判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;判断实现&lt;/td&gt;
&lt;td&gt;&lt;code&gt;typeid&lt;/code&gt; / 编译期检查&lt;/td&gt;
&lt;td&gt;编译期自动检查&lt;/td&gt;
&lt;td&gt;只要方法对上即可&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三接口的定义与实现"&gt;三、接口的定义与实现&lt;/h2&gt;
&lt;h3 id="31-定义接口"&gt;3.1 定义接口&lt;/h3&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:#75715e"&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;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Shape&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Area&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Perimeter&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&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;h3 id="32-隐式实现"&gt;3.2 隐式实现&lt;/h3&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:#75715e"&gt;// Circle 不需要写 &amp;#34;implements Shape&amp;#34;，只要方法对上就自动满足&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Circle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Radius&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;float64&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&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;c&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Circle&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Area&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.14159&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Radius&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Radius&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&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;c&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Circle&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Perimeter&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.14159&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Radius&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Rectangle 同样自动实现 Shape&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rectangle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Width&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Height&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;float64&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&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;r&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rectangle&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Area&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Width&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Height&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&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;r&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rectangle&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Perimeter&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Width&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Height&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;h3 id="33-使用接口"&gt;3.3 使用接口&lt;/h3&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:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printShape&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Shape&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;面积=%.2f, 周长=%.2f\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Area&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Perimeter&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&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;c&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Circle&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;Radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rectangle&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;Width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&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:#a6e22e"&gt;printShape&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&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; &lt;span style="color:#a6e22e"&gt;printShape&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&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:#75715e"&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;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Shape&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;c&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;Println&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Area&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;对照 C++&lt;/strong&gt;：C++ 必须 &lt;code&gt;class Circle : public Shape&lt;/code&gt; 显式继承；Go 只要方法签名对上就行，&lt;strong&gt;实现与接口完全解耦&lt;/strong&gt;——甚至可以给别人的类型补上方法让它满足你的接口。&lt;/p&gt;</description></item><item><title>类型断言与 type-switch</title><link>https://www.sylgalaxy.xyz/posts/go-02-06-type-switch/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/go-02-06-type-switch/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从 C++ 的 dynamic_cast / typeid 到 Go 的类型断言、类型开关与反射初探&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一简述"&gt;一、简述&lt;/h2&gt;
&lt;p&gt;接口变量在运行时存储了&amp;quot;动态类型&amp;quot;。当我们需要&lt;strong&gt;把接口值还原成具体类型&lt;/strong&gt;、或&lt;strong&gt;按不同类型走不同逻辑&lt;/strong&gt;时，就用类型断言（type assertion）和类型开关（type switch）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：Go 类型断言是 &lt;code&gt;x.(T)&lt;/code&gt; 语法——它是&amp;quot;安全的 dynamic_cast&amp;quot;：带 &lt;code&gt;ok&lt;/code&gt; 判断时永远不会 panic。类型开关 &lt;code&gt;switch v := x.(type)&lt;/code&gt; 则是处理&amp;quot;未知类型集合&amp;quot;最优雅的方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二c-对照速查表"&gt;二、C++ 对照速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;关键差异&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;向下转型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dynamic_cast&amp;lt;T*&amp;gt;(ptr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v, ok := x.(T)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 更简洁，双返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不安全转型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;static_cast&lt;/code&gt; / &lt;code&gt;reinterpret_cast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v := x.(T)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 会 panic（不推荐）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型判断&lt;/td&gt;
&lt;td&gt;&lt;code&gt;typeid(x) == typeid(T)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x.(type)&lt;/code&gt;（type switch）&lt;/td&gt;
&lt;td&gt;语法不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型名称&lt;/td&gt;
&lt;td&gt;&lt;code&gt;typeid(x).name()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fmt.Sprintf(&amp;quot;%T&amp;quot;, x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;运行时类型名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反射&lt;/td&gt;
&lt;td&gt;RTTI / &lt;code&gt;&amp;lt;typeinfo&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reflect&lt;/code&gt; 包&lt;/td&gt;
&lt;td&gt;用法差异大&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三类型断言基础"&gt;三、类型断言基础&lt;/h2&gt;
&lt;h3 id="31-语法与两种形式"&gt;3.1 语法与两种形式&lt;/h3&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:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;any&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;42&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:#75715e"&gt;// 形式一：带 ok（推荐，安全）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;v&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;.(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ok&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;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;是 int:&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;v&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&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;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;不是 int&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 形式二：不带 ok（不推荐，失败直接 panic）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;v2&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;.(&lt;span style="color:#66d9ef"&gt;int&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;&lt;span style="color:#75715e"&gt;// v3 := x.(string) // ❌ panic: interface conversion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;规则&lt;/strong&gt;：永远用带 &lt;code&gt;ok&lt;/code&gt; 的形式。不带 ok 的写法相当于 C++ 的 &lt;code&gt;static_cast&lt;/code&gt;——假设你知道类型，错了就崩。&lt;/p&gt;</description></item></channel></rss>