<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>inasayang&#39;s blog</title>
    <link>/</link>
    <description>Recent blog posts on inasayang&#39;s blog</description>
    
    <generator>Hugo (https://gohugo.io)</generator>
    
    <language>zh-cn</language>
    
    <managingEditor>xiayangzzw@gmail.com (inasayang)</managingEditor>
    
    <webMaster>xiayangzzw@gmail.com (inasayang)</webMaster>
    
    <lastBuildDate>Tue, 11 Aug 2026 00:00:00 Z</lastBuildDate>
    
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    

    <item>
      <title>Go | First Response Pattern</title>
      <link>/posts/250807_gofirstresponsepattern/</link>
      <pubDate>Thu, 07 Aug 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// Avoid timeout - Replicate servers and use first response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;type&lt;/span&gt; Result &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;type&lt;/span&gt; Search &lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt;(query &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;) Result
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;fakeSearch&lt;/span&gt;(kind &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;) Search {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt;(query &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;) Result {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		time.&lt;span style=&#34;color:#8caaee&#34;&gt;Sleep&lt;/span&gt;(time.&lt;span style=&#34;color:#8caaee&#34;&gt;Duration&lt;/span&gt;(rand.&lt;span style=&#34;color:#8caaee&#34;&gt;Intn&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;)) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; time.Millisecond)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;Result&lt;/span&gt;(fmt.&lt;span style=&#34;color:#8caaee&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;%s result for %q&amp;#34;&lt;/span&gt;, kind, query))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;First&lt;/span&gt;(query &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;, replicas &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;...&lt;/span&gt;Search) Result {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;make&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;chan&lt;/span&gt; Result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	searchReplica &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt;(i &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;) { c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;-&lt;/span&gt; replicas[i](query) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;range&lt;/span&gt; replicas {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;searchReplica&lt;/span&gt;(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;-&lt;/span&gt;c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	start &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; time.&lt;span style=&#34;color:#8caaee&#34;&gt;Now&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;First&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#8caaee&#34;&gt;fakeSearch&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;replica1&amp;#34;&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#8caaee&#34;&gt;fakeSearch&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;replica2&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#8caaee&#34;&gt;fakeSearch&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;replica3&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	elapsed &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; time.&lt;span style=&#34;color:#8caaee&#34;&gt;Since&lt;/span&gt;(start)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#8caaee&#34;&gt;Println&lt;/span&gt;(result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#8caaee&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;%.3fms\n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#99d1db&#34;&gt;float64&lt;/span&gt;(elapsed.&lt;span style=&#34;color:#8caaee&#34;&gt;Nanoseconds&lt;/span&gt;())&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ef9f76&#34;&gt;1e6&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是 Go 并发经典实践之一：“用副本竞速的方式避免超时，返回最早的可用结果”——常见于高可用分布式系统的请求快速返回（比如多个搜索副本、微服务副本集请谁先响应）。&lt;/p&gt;
&lt;h2 id=&#34;主要思想&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%b8%bb%e8%a6%81%e6%80%9d%e6%83%b3&#34;&gt;
        #
    &lt;/a&gt;
    主要思想
&lt;/div&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务背景&lt;/strong&gt;：你有好几个“备用服务器/副本/搜索实现”，哪个响应最快用哪个，“慢的都不用等”，避免整个请求因单点慢或偶发延迟变慢。&lt;/li&gt;
&lt;li&gt;这是现实世界中 Google、Amazon 等公司搜索引擎“边缘副本”、“异地容灾高可用”大量使用的技术方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;现实应用场景&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e7%8e%b0%e5%ae%9e%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af&#34;&gt;
        #
    &lt;/a&gt;
    现实应用场景
&lt;/div&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;微服务多活&lt;/strong&gt;：多个服务副本响应同一请求，优先拿到第一个并快速返回，极大降低99.99延迟。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN/边缘计算&lt;/strong&gt;：拉取数据时向多节点并发请求，客户端只拿第一个响应的内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多家供应商比价/辅助搜索聚合&lt;/strong&gt;：哪个接口快就显示谁的内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用context控制goroutine-leak&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8context%e6%8e%a7%e5%88%b6goroutine-leak&#34;&gt;
        #
    &lt;/a&gt;
    使用context控制goroutine leak
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;这个简单写法确实会导致 goroutine 泄露（goroutine leak）的问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你发起了多个副本 goroutine，每个都会做完自己的“搜索”然后把结果写入同一个 channel &lt;code&gt;c&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;但 &lt;code&gt;First&lt;/code&gt; 只从 channel 取第一个结果：&lt;code&gt;return &amp;lt;-c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其它 goroutine 后续写入 channel 时，如果没人读，&lt;strong&gt;它们会永远阻塞在 &lt;code&gt;c &amp;lt;- ...&lt;/code&gt; 这一行上&lt;/strong&gt;——此时这些 goroutine 无法退出，即内存泄露。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;First&lt;/span&gt;(query &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;, replicas &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;...&lt;/span&gt;Search) Result {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	ctx, cancel &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; context.&lt;span style=&#34;color:#8caaee&#34;&gt;WithCancel&lt;/span&gt;(context.&lt;span style=&#34;color:#8caaee&#34;&gt;Background&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;defer&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;cancel&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;make&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;chan&lt;/span&gt; Result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	searchReplica &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt;(i &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;select&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;case&lt;/span&gt; c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;-&lt;/span&gt; replicas[i](query):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;-&lt;/span&gt;ctx.&lt;span style=&#34;color:#8caaee&#34;&gt;Done&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;range&lt;/span&gt; replicas {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#ca9ee6&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;searchReplica&lt;/span&gt;(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;-&lt;/span&gt;c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#8caaee&#34;&gt;cancel&lt;/span&gt;() &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 让其他 goroutine 自动退出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主流程一旦拿到第一个结果，cancel() 会通知其他所有 goroutine 退出。&lt;/p&gt;
&lt;p&gt;复杂情况下可配合 context、WaitGroup 做到无资源泄露。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.concurrency.rocks/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.concurrency.rocks/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      
      <guid isPermaLink="true">/posts/250807_gofirstresponsepattern/</guid>
    </item>
    

    <item>
      <title>C | _Generic泛型选择</title>
      <link>/posts/250725_cgeneric/</link>
      <pubDate>Fri, 25 Jul 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://inasayang.notion.site/_Generic-Generic-Selection-23bb97323d23800c8ae7ed3be092827a&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Notion链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_Generic&lt;/code&gt; 在 C 语言中被称为&lt;strong&gt;泛型选择&lt;/strong&gt;（Generic Selection）或&lt;strong&gt;类型泛型表达式&lt;/strong&gt;。这是 C11 标准引入的特性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要用于&lt;strong&gt;类型感知的宏编程&lt;/strong&gt;，实现类似函数重载的效果&lt;/li&gt;
&lt;li&gt;在&lt;strong&gt;编译时&lt;/strong&gt;处理，编译器会直接替换为对应的表达式&lt;/li&gt;
&lt;li&gt;基于&lt;strong&gt;类型&lt;/strong&gt;进行选择&lt;/li&gt;
&lt;li&gt;是一个&lt;strong&gt;表达式&lt;/strong&gt;，会被替换为某个值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 编译时根据类型选择
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;_Generic&lt;/span&gt;(i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;float&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 编译后直接变成：char *result = &amp;#34;integer&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_Generic&lt;/code&gt; 是一个&lt;strong&gt;表达式&lt;/strong&gt;，不是语句，错误示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// ❌ 错误！不能写多行代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;_Generic&lt;/span&gt;(i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;It&amp;#39;s an integer&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;n&amp;#34;&lt;/span&gt;);  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 编译错误
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;float&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;多行逻辑解决办法&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%a4%9a%e8%a1%8c%e9%80%bb%e8%be%91%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95&#34;&gt;
        ##
    &lt;/a&gt;
    多行逻辑解决办法
&lt;/div&gt;
&lt;/h1&gt;
&lt;h2 id=&#34;1-使用函数调用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#1-%e4%bd%bf%e7%94%a8%e5%87%bd%e6%95%b0%e8%b0%83%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    1. &lt;strong&gt;使用函数调用&lt;/strong&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;handle_int&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing integer&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 可以有复杂逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;handle_float&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing float&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;float&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;_Generic&lt;/span&gt;(i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;handle_int&lt;/span&gt;(),      &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 调用函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;handle_float&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-使用逗号运算符&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#2-%e4%bd%bf%e7%94%a8%e9%80%97%e5%8f%b7%e8%bf%90%e7%ae%97%e7%ac%a6&#34;&gt;
        #
    &lt;/a&gt;
    2. &lt;strong&gt;使用逗号运算符&lt;/strong&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;_Generic&lt;/span&gt;(i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;It&amp;#39;s an integer&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;),  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 逗号运算符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;It&amp;#39;s a float&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;float&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-结合条件表达式&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#3-%e7%bb%93%e5%90%88%e6%9d%a1%e4%bb%b6%e8%a1%a8%e8%be%be%e5%bc%8f&#34;&gt;
        #
    &lt;/a&gt;
    3. &lt;strong&gt;结合条件表达式&lt;/strong&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;_Generic&lt;/span&gt;(i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;positive integer&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;non-positive integer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;float&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-如果需要复杂逻辑建议用宏包装&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#4-%e5%a6%82%e6%9e%9c%e9%9c%80%e8%a6%81%e5%a4%8d%e6%9d%82%e9%80%bb%e8%be%91%e5%bb%ba%e8%ae%ae%e7%94%a8%e5%ae%8f%e5%8c%85%e8%a3%85&#34;&gt;
        #
    &lt;/a&gt;
    4. &lt;strong&gt;如果需要复杂逻辑，建议用宏包装&lt;/strong&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#define HANDLE_TYPE(x) do { \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char *result = _Generic((x), \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;        int: handle_int(), \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;        float: handle_float(), \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;        default: &amp;#34;other&amp;#34; \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    ); \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;/* 在这里可以添加更多处理逻辑 */&lt;/span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt; \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    printf(&amp;#34;Result: %s\n&amp;#34;, result); \\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;} while(0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 使用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;HANDLE_TYPE&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;完整示例&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%ae%8c%e6%95%b4%e7%a4%ba%e4%be%8b&#34;&gt;
        ##
    &lt;/a&gt;
    完整示例
&lt;/div&gt;
&lt;/h1&gt;
&lt;h2 id=&#34;示例1&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e7%a4%ba%e4%be%8b1&#34;&gt;
        #
    &lt;/a&gt;
    示例1：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#737994;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#define TYPE_NAME(x) _Generic((x), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    int: &amp;#34;integer&amp;#34;, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    float: &amp;#34;float&amp;#34;, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    double: &amp;#34;double&amp;#34;, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char: &amp;#34;character&amp;#34;, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char*: &amp;#34;string&amp;#34;, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    default: &amp;#34;unknown type&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; num &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; pi &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;3.14159f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; e &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2.71828&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; letter &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;message &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;num (%d) is a %s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, num, &lt;span style=&#34;color:#8caaee&#34;&gt;TYPE_NAME&lt;/span&gt;(num));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;pi (%.2f) is a %s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, pi, &lt;span style=&#34;color:#8caaee&#34;&gt;TYPE_NAME&lt;/span&gt;(pi));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;e (%.5f) is a %s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, e, &lt;span style=&#34;color:#8caaee&#34;&gt;TYPE_NAME&lt;/span&gt;(e));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;letter (&amp;#39;%c&amp;#39;) is a %s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, letter, &lt;span style=&#34;color:#8caaee&#34;&gt;TYPE_NAME&lt;/span&gt;(letter));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;message (&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;) is a %s&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, message, &lt;span style=&#34;color:#8caaee&#34;&gt;TYPE_NAME&lt;/span&gt;(message));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;num&lt;/span&gt; (&lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;) is a integer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;pi&lt;/span&gt; (&lt;span style=&#34;color:#ef9f76&#34;&gt;3.14&lt;/span&gt;) is a &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;e&lt;/span&gt; (&lt;span style=&#34;color:#ef9f76&#34;&gt;2.71828&lt;/span&gt;) is a &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;letter&lt;/span&gt; (&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;) is a character
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;message&lt;/span&gt; (&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;) is a string
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;示例2&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e7%a4%ba%e4%be%8b2&#34;&gt;
        #
    &lt;/a&gt;
    示例2：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#737994;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#737994;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;math.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 为不同类型定义不同的处理函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;process_int&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing integer: %d&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; x;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 返回平方
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;process_float&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing float: %.2f&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;sqrtf&lt;/span&gt;(x);  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 返回平方根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;process_double&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing double: %.6f&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;log&lt;/span&gt;(x);  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 返回自然对数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;process_char&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing character: &amp;#39;%c&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;z&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;?&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; x;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 小写转大写
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;process_default&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Processing unsupported type&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 使用 _Generic 创建泛型处理宏
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#define PROCESS(x) _Generic((x), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    int:    process_int, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    float:  process_float, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    double: process_double, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char:   process_char, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    default: process_default \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;)(x)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 另一个例子：类型泛型的比较函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#define MAX(a, b) _Generic((a) + (b), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    int:    ((int)(a) &amp;gt; (int)(b) ? (int)(a) : (int)(b)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    float:  ((float)(a) &amp;gt; (float)(b) ? (float)(a) : (float)(b)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    double: ((double)(a) &amp;gt; (double)(b) ? (double)(a) : (double)(b)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    default: 0 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 类型泛型的格式化输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#define PRINT_VALUE(x) _Generic((x), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    int:    printf(&amp;#34;Integer: %d\n&amp;#34;, (x)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    float:  printf(&amp;#34;Float: %.2f\n&amp;#34;, (x)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    double: printf(&amp;#34;Double: %.6f\n&amp;#34;, (x)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char:   printf(&amp;#34;Character: &amp;#39;%c&amp;#39; (ASCII: %d)\n&amp;#34;, (x), (int)(x)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    char*:  printf(&amp;#34;String: \&amp;#34;%s\&amp;#34;\n&amp;#34;, (x)), \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;    default: printf(&amp;#34;Unknown type\n&amp;#34;) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;=== 泛型处理函数示例 ===&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; f &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;16.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; d &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2.718281828&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;h&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Original values:&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(f);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(d);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;Processing results:&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; result_i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;PROCESS&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; result_f &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;PROCESS&lt;/span&gt;(f);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; result_d &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;PROCESS&lt;/span&gt;(d);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; result_c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;PROCESS&lt;/span&gt;(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;Processed values:&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(result_i);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(result_f);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(result_d);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(result_c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;=== 泛型最大值函数示例 ===&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; max_int &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;25&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt; max_float &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;3.14f&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;2.71f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt; max_double &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;1.234567&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;1.234568&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;MAX(10, 25) = %d&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, max_int);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;MAX(3.14f, 2.71f) = %.2f&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, max_float);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;MAX(1.234567, 1.234568) = %.6f&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, max_double);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;=== 混合类型示例 ===&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;str &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;long&lt;/span&gt; big_num &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;9876543210LL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;PRINT_VALUE&lt;/span&gt;(big_num);  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 会触发 default 情况
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;泛型处理函数示例&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Original &lt;span style=&#34;color:#99d1db&#34;&gt;values&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Integer&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Float&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;16.00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Double&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;2.718282&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Character&lt;/span&gt;: &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;h&amp;#39;&lt;/span&gt; (&lt;span style=&#34;color:#99d1db&#34;&gt;ASCII&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;104&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processing &lt;span style=&#34;color:#99d1db&#34;&gt;results&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processing &lt;span style=&#34;color:#99d1db&#34;&gt;integer&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processing &lt;span style=&#34;color:#e78284&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;16.00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processing &lt;span style=&#34;color:#e78284&#34;&gt;double&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2.718282&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processing &lt;span style=&#34;color:#99d1db&#34;&gt;character&lt;/span&gt;: &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;h&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Processed &lt;span style=&#34;color:#99d1db&#34;&gt;values&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Integer&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Float&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;4.00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Double&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;1.000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;Character&lt;/span&gt;: &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;H&amp;#39;&lt;/span&gt; (&lt;span style=&#34;color:#99d1db&#34;&gt;ASCII&lt;/span&gt;: &lt;span style=&#34;color:#ef9f76&#34;&gt;72&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;泛型最大值函数示例&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;25&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;3.14f&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;2.71f&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;3.14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;MAX&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;1.234567&lt;/span&gt;, &lt;span style=&#34;color:#ef9f76&#34;&gt;1.234568&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;1.234568&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e78284&#34;&gt;混合类型示例&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;: &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unknown type
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://en.cppreference.com/w/c/language/generic.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://en.cppreference.com/w/c/language/generic.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4 Thinking&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>c</category>
      
      
      <guid isPermaLink="true">/posts/250725_cgeneric/</guid>
    </item>
    

    <item>
      <title>Go | 跨包访问非导出符号</title>
      <link>/posts/250421_call_unexported_fn_and_var/25_04_21_call_unexported_fn_and_var/</link>
      <pubDate>Mon, 21 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;&lt;code&gt;//go:linkname&lt;/code&gt; 是 &lt;code&gt;Go&lt;/code&gt; 语言中的一个编译指令（&lt;code&gt;compiler directive&lt;/code&gt;），用于在编译期间将一个符号（函数或变量）的名称重命名成另一个符号，达到在不同包之间绕过封装直接访问非导出（&lt;code&gt;unexported&lt;/code&gt;）标识符的效果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要导入 &lt;code&gt;unsafe&lt;/code&gt; 包&lt;/li&gt;
&lt;li&gt;函数或变量必须声明&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用未导出函数示例1&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%87%bd%e6%95%b0%e7%a4%ba%e4%be%8b1&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出函数（示例1）：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; mypkg
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname privateFunc runtime.internalFunc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;privateFunc&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里 &lt;code&gt;mypkg&lt;/code&gt; 包里的 &lt;code&gt;privateFunc&lt;/code&gt; 会被链接为 &lt;code&gt;runtime&lt;/code&gt; 包中的非导出函数 &lt;code&gt;internalFunc&lt;/code&gt;，调用&lt;code&gt;privateFunc()&lt;/code&gt; 就是调用的 &lt;code&gt;runtime.internalFunc()&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;使用未导出函数示例2&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%87%bd%e6%95%b0%e7%a4%ba%e4%be%8b2&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出函数（示例2）：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;github.com/xxx/yyy/zzz&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 确保包被导入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname newUUID github.com/xxx/yyy/zzz.newUUID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;newUUID&lt;/span&gt;() &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;newUUID&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fmt.&lt;span style=&#34;color:#8caaee&#34;&gt;Println&lt;/span&gt;(s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用未导出变量&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%8f%98%e9%87%8f&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出变量：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; yourpkg
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname someValue github.com/xxx/yyy/zzz.someValue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;var&lt;/span&gt; someValue &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded>
      
      <category>go</category>
      
      <category>unsafe</category>
      
      
      <guid isPermaLink="true">/posts/250421_call_unexported_fn_and_var/25_04_21_call_unexported_fn_and_var/</guid>
    </item>
    

    <item>
      <title>Go | 使用PGO优化编译示例</title>
      <link>/posts/250415_golangpgoexample/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;PGO (Profile-Guided Optimization) 是一种编译优化技术，通过收集程序的实际运行时数据来指导编译器进行更有针对性的优化。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-pgo file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        specify the file path of a profile for profile-guided optimization (PGO).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        When the special name &amp;#34;auto&amp;#34; is specified, for each main package in the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        build, the go command selects a file named &amp;#34;default.pgo&amp;#34; in the package&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        directory if that file exists, and applies it to the (transitive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dependencies of the main package (other packages are not affected).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Special name &amp;#34;off&amp;#34; turns off PGO. The default is &amp;#34;auto&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段说明解释了 &lt;code&gt;-pgo&lt;/code&gt; 参数的几种用法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pgo=文件路径&lt;/code&gt; - 指定一个具体的性能分析文件路径用于PGO优化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pgo=auto&lt;/code&gt; - 自动模式(默认)，会在每个main包的目录中查找名为&amp;quot;default.pgo&amp;quot;的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pgo=off&lt;/code&gt; - 明确关闭PGO优化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当使用自动模式时，PGO优化只会应用到main包及其依赖项，而不会影响其他不相关的包。&lt;/p&gt;
&lt;h2 id=&#34;收集性能分析数据&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%94%b6%e9%9b%86%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90%e6%95%b0%e6%8d%ae&#34;&gt;
        #
    &lt;/a&gt;
    收集性能分析数据
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// main.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;runtime/pprof&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;computeIntensive&lt;/span&gt;() &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10000000&lt;/span&gt;; i&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;+=&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 第一次运行时开启性能分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;len&lt;/span&gt;(os.Args) &amp;gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; os.Args[&lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;profile&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        f, _ &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#8caaee&#34;&gt;Create&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;profile.pprof&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;defer&lt;/span&gt; f.&lt;span style=&#34;color:#8caaee&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pprof.&lt;span style=&#34;color:#8caaee&#34;&gt;StartCPUProfile&lt;/span&gt;(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;defer&lt;/span&gt; pprof.&lt;span style=&#34;color:#8caaee&#34;&gt;StopCPUProfile&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 执行计算密集型操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;computeIntensive&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#99d1db&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Result:&amp;#34;&lt;/span&gt;, result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -o myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用收集的分析数据进行优化编译&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%94%b6%e9%9b%86%e7%9a%84%e5%88%86%e6%9e%90%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e4%bc%98%e5%8c%96%e7%bc%96%e8%af%91&#34;&gt;
        #
    &lt;/a&gt;
    使用收集的分析数据进行优化编译
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -pgo profile.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; -o myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果有多个pprof文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# 使用pprof工具合并多个分析文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go tool pprof -proto cpu1.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; cpu2.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; cpu3.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; &amp;gt; combined.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# 使用合并后的分析文件进行构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -pgo combined.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; -o myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;测试&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%b5%8b%e8%af%95&#34;&gt;
        #
    &lt;/a&gt;
    测试
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time ./myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time ./myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;PGO 优化通常在较大、复杂的应用中效果更显著，特别是有明显热点路径的程序。对于简单程序，优化效果可能不明显，甚至因为优化开销而略微变慢。&lt;/li&gt;
&lt;li&gt;PGO 主要适用于计算密集型应用。&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      <category>pgo</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/250415_golangpgoexample/</guid>
    </item>
    

    <item>
      <title>Rust | LTO和Thin LTO编译器</title>
      <link>/posts/250415_ltothinlto/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;lto-link-time-optimization&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-link-time-optimization&#34;&gt;
        #
    &lt;/a&gt;
    LTO (Link Time Optimization)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;链接时优化是一种编译器优化技术，它在程序的链接阶段而非传统的编译阶段执行代码优化。&lt;/p&gt;
&lt;h3 id=&#34;lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编译阶段&lt;/strong&gt;：编译器在编译单个源文件时，不仅生成机器代码，还保存中间表示（IR，Intermediate Representation）到目标文件中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接阶段&lt;/strong&gt;：链接器收集所有模块的IR，将它们合并为一个统一的程序表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局优化&lt;/strong&gt;：对整个程序执行优化，基于对所有代码的完整视图&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨模块优化&lt;/strong&gt;：可以进行跨越多个源文件的优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内联函数&lt;/strong&gt;：更强大的函数内联能力，包括跨编译单元边界&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死代码消除&lt;/strong&gt;：更有效地移除未使用的代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更精确的别名分析&lt;/strong&gt;：改进指针分析和内存访问优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码大小减少&lt;/strong&gt;：通过移除不必要的代码减小二进制大小&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lto-的缺点&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e7%bc%ba%e7%82%b9&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的缺点
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内存消耗大&lt;/strong&gt;：处理大型程序时需要大量内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译时间长&lt;/strong&gt;：链接过程变得更加复杂和耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;thin-lto-轻量级链接时优化&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e8%bd%bb%e9%87%8f%e7%ba%a7%e9%93%be%e6%8e%a5%e6%97%b6%e4%bc%98%e5%8c%96&#34;&gt;
        #
    &lt;/a&gt;
    Thin LTO (轻量级链接时优化)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Thin LTO 是 LLVM 编译器基础设施引入的 LTO 变种，旨在解决传统 LTO 的性能和扩展性问题。&lt;/p&gt;
&lt;h3 id=&#34;thin-lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;索引生成&lt;/strong&gt;：每个目标文件都独立生成索引，包含符号和引用信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行优化&lt;/strong&gt;：基于索引信息，将全局优化工作分解成多个可并行执行的任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块级优化&lt;/strong&gt;：在各个模块上并行执行优化，而不是合并所有IR&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;thin-lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;减少内存使用&lt;/strong&gt;：不需要加载整个程序的IR到内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行编译&lt;/strong&gt;：通过并行化加速编译过程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量编译支持&lt;/strong&gt;：更好地支持增量构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留大部分传统LTO的优化效果&lt;/strong&gt;：仍能执行跨模块优化&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;LTO&lt;/th&gt;
					&lt;th&gt;Thin LTO&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;/td&gt;
					&lt;td&gt;接近LTO但略低&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;/tr&gt;
			&lt;tr&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;/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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;rust-中使用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#rust-%e4%b8%ad%e4%bd%bf%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    Rust 中使用
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[profile.release]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;fat&amp;#34;   &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;thin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LTO 通常与其他优化标志一起使用。&lt;/p&gt;</content:encoded>
      
      <category>rust</category>
      
      <category>llvm</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/250415_ltothinlto/</guid>
    </item>
    

    <item>
      <title>Linux | 如何在终端使用Progress bar</title>
      <link>/posts/240824_terminalprogressbar/</link>
      <pubDate>Sat, 24 Aug 2024 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;原理：使用 ANSI 转义序列来控制光标位置&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;progress_bar&lt;/span&gt;(total):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;range&lt;/span&gt;(total &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        percent &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; (i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;/&lt;/span&gt; total) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# bar = &amp;#39;█&amp;#39; * (i // 2) + &amp;#39;-&amp;#39; * (total // 2 - i // 2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bar &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\u2588&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; (i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;-&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; (total &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;-&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;.&lt;/span&gt;stdout&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#e78284&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;\r&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;Progress: |&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{&lt;/span&gt;bar&lt;span style=&#34;color:#a6d189&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;| &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{&lt;/span&gt;percent&lt;span style=&#34;color:#a6d189&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;.2f&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;%&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;.&lt;/span&gt;stdout&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;.&lt;/span&gt;flush()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        time&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#ef9f76&#34;&gt;0.1&lt;/span&gt;)  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# 模拟工作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#99d1db&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;progress_bar(&lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\r&lt;/code&gt;：这个字符的作用是将光标移动到当前行的开头，而不是换到下一行。这样可以覆盖当前行的内容，实现动态更新。&lt;strong&gt;必须写在字符串的最前面，以确保光标移动到当前行的开头。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;i // 2&lt;/code&gt; 的原因是为了将进度条的长度控制在一个合适的范围内,减少进度条的字符数量，易于阅读&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>linux</category>
      
      <category>python</category>
      
      
      <guid isPermaLink="true">/posts/240824_terminalprogressbar/</guid>
    </item>
    

    <item>
      <title>Go | 检测当前系统位数</title>
      <link>/posts/240309_gocheckosbits/</link>
      <pubDate>Sat, 09 Mar 2024 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;声明一个常量来表示当前操作系统的位数&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%a3%b0%e6%98%8e%e4%b8%80%e4%b8%aa%e5%b8%b8%e9%87%8f%e6%9d%a5%e8%a1%a8%e7%a4%ba%e5%bd%93%e5%89%8d%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e7%9a%84%e4%bd%8d%e6%95%b0&#34;&gt;
        #
    &lt;/a&gt;
    声明一个常量来表示当前操作系统的位数
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;const&lt;/span&gt; NativeWordBits = &lt;span style=&#34;color:#ef9f76&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (^&lt;span style=&#34;color:#99d1db&#34;&gt;uint&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;63&lt;/span&gt;) &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 64 or 32 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;^uint(0)&lt;/code&gt;：对于无符号整型 uint(0)（其所有位都是0），按位取反操作会产生一个所有位都是1的数字。这个结果的数值上等同于 uint 能表示的最大值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt; 63&lt;/code&gt;：这个操作的结果依赖于 uint 的大小：
&lt;ul&gt;
&lt;li&gt;在64位平台上，uint 类型为64位，&lt;code&gt;^uint(0)&lt;/code&gt; 产生一个所有位都为1的64位数字。向右移动63位后，最左边的一位（最高位）会移动到最右边，结果为1（二进制的000&amp;hellip;001）&lt;/li&gt;
&lt;li&gt;在32位平台上，尽管仍然执行相同的操作，但是由于 uint 的大小只有32位，所以这个操作实际上产生的结果是 0，因为32位无法表示一个向右移动了63位的值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;32 &amp;lt;&amp;lt; (... &amp;gt;&amp;gt; 63)&lt;/code&gt;：最终这个表达式将32左移上一步的结果。在32位平台上，由于上一步的结果是 0，&lt;code&gt;32 &amp;lt;&amp;lt; 0&lt;/code&gt; 保持不变，仍然是 32。这反映了32位系统的字长。在64位平台上，上一步的结果是 1，因此 &lt;code&gt;32 &amp;lt;&amp;lt; 1&lt;/code&gt; 相当于将32乘以2，结果是 64。这反映了64位系统的字长。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;检查当前操作系统是32位的还是64位的&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%a3%80%e6%9f%a5%e5%bd%93%e5%89%8d%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e6%98%af32%e4%bd%8d%e7%9a%84%e8%bf%98%e6%98%af64%e4%bd%8d%e7%9a%84&#34;&gt;
        #
    &lt;/a&gt;
    检查当前操作系统是32位的还是64位的
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;const&lt;/span&gt; Is64bitOS = ^&lt;span style=&#34;color:#99d1db&#34;&gt;uint&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;63&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;const&lt;/span&gt; Is32bitOS = ^&lt;span style=&#34;color:#99d1db&#34;&gt;uint&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Go101&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      <category>bitwise</category>
      
      
      <guid isPermaLink="true">/posts/240309_gocheckosbits/</guid>
    </item>
    

    <item>
      <title>Rust | Clone vs Copy</title>
      <link>/posts/230913_rustcopyclone/</link>
      <pubDate>Wed, 13 Sep 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h3 id=&#34;copy的含义&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#copy%e7%9a%84%e5%90%ab%e4%b9%89&#34;&gt;
        ##
    &lt;/a&gt;
    Copy的含义
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Copy&lt;/code&gt;的全名是&lt;code&gt;std::marker::Copy&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;std::marker&lt;/code&gt;模块里面所有的&lt;code&gt;trait&lt;/code&gt;都是特殊的&lt;code&gt;trait&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它们是跟编译器密切绑定的，&lt;code&gt;impl&lt;/code&gt;这些&lt;code&gt;trait&lt;/code&gt;对编译器的行为有重要影响。在编译器眼里，它们与其他的&lt;code&gt;trait&lt;/code&gt;不一样。这几个&lt;code&gt;trait&lt;/code&gt;内部都没有方法，它们的唯一任务是给类型打一个“标记”，表明它符合某种约定——这些约定会影响编译器的静态检查以及代码生成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那么，&lt;code&gt;Copy&lt;/code&gt;这个&lt;code&gt;trait&lt;/code&gt;在编译器的眼里代表的是什么意思呢？&lt;/p&gt;
&lt;p&gt;简单点总结就是，如果一个类型&lt;code&gt;impl&lt;/code&gt;了&lt;code&gt;Copy trait&lt;/code&gt;，意味着任何时候，我们都可以通过简单的内存复制（在C语言里按字节复制&lt;code&gt;memcpy&lt;/code&gt;）实现该类型的复制，并且不会产生任何内存安全问题。&lt;/p&gt;
&lt;p&gt;一旦一个类型实现了&lt;code&gt;Copy trait&lt;/code&gt;，那么它在变量绑定、函数参数传递、函数返回值传递等场景下，都是&lt;code&gt;copy&lt;/code&gt;语义，而不再是默认的&lt;code&gt;move&lt;/code&gt;语义。&lt;/p&gt;
&lt;p&gt;最简单的赋值语句&lt;code&gt;x = y&lt;/code&gt;来说明&lt;code&gt;move&lt;/code&gt;语义和&lt;code&gt;copy&lt;/code&gt;语义的根本区别&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;move&lt;/code&gt;语义是“&lt;strong&gt;剪切、粘贴&lt;/strong&gt;”操作，变量&lt;code&gt;y&lt;/code&gt;把所有权递交给了&lt;code&gt;x&lt;/code&gt;之后，&lt;code&gt;y&lt;/code&gt;就彻底失效了，后面继续使用&lt;code&gt;y&lt;/code&gt;就会出编译错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;copy&lt;/code&gt;语义是“&lt;strong&gt;复制、粘贴&lt;/strong&gt;”操作，变量&lt;code&gt;y&lt;/code&gt;把所有权递交给了&lt;code&gt;x&lt;/code&gt;之后，它自己还留了一个副本，在这句赋值语句之后，&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;依然都可以继续使用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在&lt;code&gt;Rust&lt;/code&gt;里，&lt;code&gt;move&lt;/code&gt;语义和&lt;code&gt;copy&lt;/code&gt;语义具体执行的操作，是不允许由程序员自定义的。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;move&lt;/code&gt;语义或者&lt;code&gt;copy&lt;/code&gt;语义都是执行的&lt;code&gt;memcpy&lt;/code&gt;，无法更改，这个过程中绝对不存在其他副作用。&lt;/p&gt;
&lt;p&gt;如果考虑后端优化，在许多情况下，不必要的内存复制实际上已经彻底优化掉了，不必担心执行效率的问题。没有必要每次都把&lt;code&gt;move&lt;/code&gt;或者&lt;code&gt;copy&lt;/code&gt;操作与具体的汇编代码联系起来，因为场景不同，优化结果不同，生成的代码也是不同的。只需记住的是语义。&lt;/p&gt;
&lt;h3 id=&#34;copy的实现条件&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#copy%e7%9a%84%e5%ae%9e%e7%8e%b0%e6%9d%a1%e4%bb%b6&#34;&gt;
        ##
    &lt;/a&gt;
    Copy的实现条件
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;并不是所有的类型都可以实现&lt;code&gt;Copy trait&lt;/code&gt;。&lt;code&gt;Rust&lt;/code&gt;规定，对于自定义类型，只有所有成员都实现了&lt;code&gt;Copy trait&lt;/code&gt;，这个类型才有资格实现&lt;code&gt;Copy trait&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;常见的数字类型、&lt;code&gt;bool&lt;/code&gt;类型、共享借用指针&lt;code&gt;&amp;amp;&lt;/code&gt;，都是具有&lt;code&gt;Copy&lt;/code&gt;属性的类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Box&lt;/code&gt;、&lt;code&gt;Vec&lt;/code&gt;、可写借用指针&lt;code&gt;&amp;amp;mut&lt;/code&gt;等类型都是不具备&lt;code&gt;Copy&lt;/code&gt;属性的类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于数组类型，如果内部的元素类型是&lt;code&gt;Copy&lt;/code&gt;，那么这个数组也是&lt;code&gt;Copy&lt;/code&gt;类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于元组&lt;code&gt;tuple&lt;/code&gt;类型，如果每一个元素都是&lt;code&gt;Copy&lt;/code&gt;类型，那么这个&lt;code&gt;tuple&lt;/code&gt;也是&lt;code&gt;Copy&lt;/code&gt;类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;struct&lt;/code&gt;和&lt;code&gt;enum&lt;/code&gt;类型不会自动实现&lt;code&gt;Copy trait&lt;/code&gt;。只有当&lt;code&gt;struct&lt;/code&gt;和&lt;code&gt;enum&lt;/code&gt;内部的每个元素都是&lt;code&gt;Copy&lt;/code&gt;类型时，编译器才允许我们针对此类型实现&lt;code&gt;Copy trait&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#e5c890&#34;&gt;T&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;i32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; t1 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; T(&lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; t2 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; t1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt; (&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, t1.&lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;, t2.&lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译错误。原因是在&lt;code&gt;let t2 = t1&lt;/code&gt;；这条语句中执行的是&lt;code&gt;move&lt;/code&gt;语义。但是可以手动为它&lt;code&gt;impl Copy trait&lt;/code&gt;，这样它就具备了&lt;code&gt;copy&lt;/code&gt;语义&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Rust&lt;/code&gt;中只有&lt;code&gt;POD&lt;/code&gt;（&lt;code&gt;C++&lt;/code&gt;语言中的&lt;code&gt;Plain Old Data&lt;/code&gt;）类型才有资格实现&lt;code&gt;Copy trait&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;Rust&lt;/code&gt;中，如果一个类型只包含&lt;code&gt;POD&lt;/code&gt;数据类型的成员，并且没有自定义析构函数，那它就是&lt;code&gt;POD&lt;/code&gt;类型。&lt;/p&gt;
&lt;p&gt;比如：整数、浮点数、只包含&lt;code&gt;POD&lt;/code&gt;类型的数组等，都属于&lt;code&gt;POD&lt;/code&gt;类型；而&lt;code&gt;Box&lt;/code&gt; &lt;code&gt;String&lt;/code&gt; &lt;code&gt;Vec&lt;/code&gt;等不能按字节复制的类型，都不属于&lt;code&gt;POD&lt;/code&gt;类型。&lt;/p&gt;
&lt;p&gt;并不是所有满足&lt;code&gt;POD&lt;/code&gt;的类型都应该实现&lt;code&gt;Copy trait&lt;/code&gt;，是否实现&lt;code&gt;Copy&lt;/code&gt;取决于&lt;em&gt;业务需求&lt;/em&gt;。&lt;/p&gt;
&lt;h3 id=&#34;clone的含义&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#clone%e7%9a%84%e5%90%ab%e4%b9%89&#34;&gt;
        ##
    &lt;/a&gt;
    Clone的含义
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Clone&lt;/code&gt;的全名是&lt;code&gt;std::clone::Clone&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;trait&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;Clone&lt;/span&gt; : &lt;span style=&#34;color:#99d1db&#34;&gt;Sized&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;clone&lt;/span&gt;(&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#e5c890&#34;&gt;Self&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;clone_from&lt;/span&gt;(&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;self&lt;/span&gt;, source: &lt;span style=&#34;color:#ca9ee6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#e5c890&#34;&gt;Self&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e78284&#34;&gt;＊&lt;/span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;self&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; source.clone()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个关联方法，分别是&lt;code&gt;clone_from&lt;/code&gt;和&lt;code&gt;clone&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;clone_from&lt;/code&gt;是有默认实现的，依赖于&lt;code&gt;clone&lt;/code&gt;方法的实现&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clone&lt;/code&gt;方法没有默认实现，需要手动实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;clone&lt;/code&gt;方法一般用于“基于语义的复制”操作。所以，跟具体类型的作用息息相关。比如，对于&lt;code&gt;Box&lt;/code&gt;类型，&lt;code&gt;clone&lt;/code&gt;执行的是“深复制”；而对于&lt;code&gt;Rc&lt;/code&gt;类型，&lt;code&gt;clone&lt;/code&gt;做的事情就是把引用计数值加1。&lt;/p&gt;
&lt;p&gt;虽然&lt;code&gt;Rust&lt;/code&gt;中的&lt;code&gt;clone&lt;/code&gt;方法一般是用来执行复制操作的，但是如果在自定义的&lt;code&gt;clone&lt;/code&gt;函数中做点别的什么工作，编译器也没办法禁止。可以根据需要在&lt;code&gt;clone&lt;/code&gt;函数中编写任意的逻辑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对于实现了&lt;code&gt;copy&lt;/code&gt;的类型，它的&lt;code&gt;clone&lt;/code&gt;方法应该跟&lt;code&gt;copy&lt;/code&gt;语义相容，等同于按字节复制&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;自动derive&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e8%87%aa%e5%8a%a8derive&#34;&gt;
        ##
    &lt;/a&gt;
    自动derive
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;绝大多数情况下，实现&lt;code&gt;Copy&lt;/code&gt; &lt;code&gt;Clone&lt;/code&gt;这样的&lt;code&gt;trait&lt;/code&gt;都是一个重复而无聊的工作。因此，&lt;code&gt;Rust&lt;/code&gt;提供了一个&lt;code&gt;attribute&lt;/code&gt;，可以利用编译器自动生成这部分代码。示例如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;#[derive(Copy, Clone)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#e5c890&#34;&gt;MyStruct&lt;/span&gt;(&lt;span style=&#34;color:#e78284&#34;&gt;i32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;derive&lt;/code&gt;会让编译器自动生成&lt;code&gt;impl Copy&lt;/code&gt;和&lt;code&gt;impl Clone&lt;/code&gt;这样的代码。自动生成的&lt;code&gt;clone&lt;/code&gt;方法，会依次调用每个成员的&lt;code&gt;clone&lt;/code&gt;方法。&lt;/p&gt;
&lt;p&gt;通过&lt;code&gt;derive&lt;/code&gt;方式自动实现&lt;code&gt;Copy&lt;/code&gt;和手工实现&lt;code&gt;Copy&lt;/code&gt;有微小的区别。当类型具有泛型参数的时候，比如&lt;code&gt;struct MyStruct&amp;lt;T&amp;gt;{}&lt;/code&gt;，通过&lt;code&gt;derive&lt;/code&gt;自动生成的代码会自动添加一个&lt;code&gt;T:Copy&lt;/code&gt;的约束。&lt;/p&gt;
&lt;h3 id=&#34;总结&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34;&gt;
        ##
    &lt;/a&gt;
    总结
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Copy&lt;/code&gt;内部没有方法，&lt;code&gt;Clone&lt;/code&gt;内部有两个方法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Copy trait&lt;/code&gt;是给编译器用的，告诉编译器这个类型默认采用&lt;code&gt;copy&lt;/code&gt;语义，而不是&lt;code&gt;move&lt;/code&gt;语义。&lt;code&gt;Clone trait&lt;/code&gt;是给程序员用的，我们必须手动调用&lt;code&gt;clone&lt;/code&gt;方法，它才能发挥作用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Copy trait&lt;/code&gt;不是想实现就能实现的，它对类型是有要求的，有些类型不可能&lt;code&gt;impl Copy&lt;/code&gt;。而&lt;code&gt;Clone trait&lt;/code&gt;则没有什么前提条件，任何类型都可以实现（&lt;code&gt;unsized&lt;/code&gt;类型除外，因为无法使用&lt;code&gt;unsized&lt;/code&gt;类型作为返回值）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Copy trait&lt;/code&gt;规定了这个类型在执行变量绑定、函数参数传递、函数返回等场景下的操作方式。即这个类型在这种场景下，必然执行的是“&lt;strong&gt;简单内存复制&lt;/strong&gt;”操作，这是由编译器保证的，程序员无法控制。&lt;code&gt;Clone trait&lt;/code&gt;里面的&lt;code&gt;clone&lt;/code&gt;方法究竟会执行什么操作，则是取决于程序员自己写的逻辑。一般情况下，&lt;code&gt;clone&lt;/code&gt;方法应该执行一个“深复制”操作，但这不是强制性的，如果你愿意，在里面启动一个人工智能程序都是有可能的&lt;/li&gt;
&lt;li&gt;如果确实不需要&lt;code&gt;Clone trait&lt;/code&gt;执行其他自定义操作（绝大多数情况都是这样），编译器提供了一个工具，我们可以在一个类型上添加&lt;code&gt;#[derive(Clone)]&lt;/code&gt;，来让编译器自动生成那些重复的代码。编译器自动生成的&lt;code&gt;clone&lt;/code&gt;方法非常机械，就是依次调用每个成员的&lt;code&gt;clone&lt;/code&gt;方法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Rust&lt;/code&gt;语言规定了在&lt;code&gt;T: Copy&lt;/code&gt;的情况下，&lt;code&gt;Clone trait&lt;/code&gt;代表的含义。即：当某变量&lt;code&gt;t: T&lt;/code&gt;符合&lt;code&gt;T: Copy&lt;/code&gt;时，它调用&lt;code&gt;t.clone()&lt;/code&gt; 方法的含义必须等同于“&lt;strong&gt;简单内存复制&lt;/strong&gt;”。也就是说，&lt;code&gt;clone&lt;/code&gt;的行为必须等同于&lt;code&gt;let x = std::ptr::read(&amp;amp;t);&lt;/code&gt;，也等同于&lt;code&gt;let x = t;&lt;/code&gt;。当&lt;code&gt;T: Copy&lt;/code&gt;时，不要在&lt;code&gt;Clone trait&lt;/code&gt;里面乱写逻辑。所以，当需要指定一个类型是&lt;code&gt;Copy&lt;/code&gt;的时候，最好使用&lt;code&gt;#[derive(Copy,Clone)]&lt;/code&gt;方式，避免手动实现&lt;code&gt;Clone&lt;/code&gt;导致错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;深入浅出Rust&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>rust</category>
      
      
      <guid isPermaLink="true">/posts/230913_rustcopyclone/</guid>
    </item>
    

    <item>
      <title>Go | 使一个结构体类型不可比较</title>
      <link>/posts/230808_gomakestructnotcompare/</link>
      <pubDate>Tue, 08 Aug 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;可以放置一个非导出的零尺寸的不可比较类型的字段在结构体类型中以使此结构体类型不可比较&lt;/p&gt;
&lt;p&gt;结构体&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;type T struct {
	dummy [0]func()
	AnotherField int
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;var x map[T]int // 编译错误：非法的键值类型

var a, b T
_ = a == b // 编译错误：非法的比较
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
      
      <category>go</category>
      
      <category>struct</category>
      
      
      <guid isPermaLink="true">/posts/230808_gomakestructnotcompare/</guid>
    </item>
    

    <item>
      <title>Go | 0尺寸结构体</title>
      <link>/posts/230807_gozerostruct/</link>
      <pubDate>Mon, 07 Aug 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;下面四个结构体的尺寸大小各是多少？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;type A struct {
	x int64
	y int64
}
type A1 struct {
	x int64
	y int64
	z struct{}
}
type A2 struct {
	z struct{}
	x int64
	y int64
}
type A3 struct {
	x int64
	z struct{}
	y int64
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;答案&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A： 16
A1： 24
A2： 16
A3： 16
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;为什么A1的结构体会不同呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个可寻址的结构值的所有字段都可以被取地址，A1可以被取地址，则z也可以被取地址&lt;/li&gt;
&lt;li&gt;如果非零尺寸的结构体值的最后一个字段的尺寸是零，那么取此最后一个字段的地址将会返回一个越出了结构体值分配的内存块的地址（可能指向另一个被分配的内存块）&lt;/li&gt;
&lt;li&gt;标准的Go编译器会确保取一个非零尺寸的结构体值的最后一个字段的地址时，绝对不会返回越出分配给此结构体值的内存块的地址&lt;/li&gt;
&lt;li&gt;Go标准编译器通过在需要时在结构体最后的零尺寸字段之后填充一些字节来实现这一点
&lt;ul&gt;
&lt;li&gt;具体补多少，需要达到内存对齐即可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果一个结构体的全部字段的类型都是零尺寸的(因此整个结构体也是零尺寸的)，那么就不需要再填充字节，因为标准编译器会专门处理零尺寸的内存块&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Golang101&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      
      <guid isPermaLink="true">/posts/230807_gozerostruct/</guid>
    </item>
    

    <item>
      <title>Rust | Ownership</title>
      <link>/posts/230620_rustownership/</link>
      <pubDate>Tue, 20 Jun 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;一段不安全的代码&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%b8%80%e6%ae%b5%e4%b8%8d%e5%ae%89%e5%85%a8%e7%9a%84%e4%bb%a3%e7%a0%81&#34;&gt;
        #
    &lt;/a&gt;
    一段不安全的代码
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;foo&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; a;          &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 变量a的作用域开始
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;c &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;xyz&amp;#34;&lt;/span&gt;;   &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 变量c的作用域开始
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;a;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}                   &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 变量a和c的作用域结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;变量 &lt;code&gt;a&lt;/code&gt; 和 &lt;code&gt;c&lt;/code&gt; 都是局部变量，函数结束后将局部变量 &lt;code&gt;a&lt;/code&gt; 的地址返回，但局部变量 &lt;code&gt;a&lt;/code&gt; 存在栈中，在离开作用域后，&lt;code&gt;a&lt;/code&gt; 所申请的栈上内存都会被系统回收，从而造成了 &lt;code&gt;悬空指针(Dangling Pointer)&lt;/code&gt; 的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​		虽然编译可以通过，但是运行的时候会出现错误。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变量 &lt;code&gt;c&lt;/code&gt;常量字符串，存储于常量区， &lt;code&gt;&amp;quot;xyz&amp;quot;&lt;/code&gt; 只有当整个程序结束后系统才能回收这片内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;栈stack与堆heap&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%a0%88stack%e4%b8%8e%e5%a0%86heap&#34;&gt;
        #
    &lt;/a&gt;
    栈(Stack)与堆(Heap)
&lt;/div&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;栈中的所有数据都必须占用已知且固定大小的内存空间&lt;/li&gt;
&lt;li&gt;对于大小未知或者可能变化的数据，需要存储在堆上
&lt;ul&gt;
&lt;li&gt;当向堆上放入数据时，需要请求一定大小的内存空间。操作系统在堆的某处找到一块足够大的空位，把它标记为已使用，并返回一个表示该位置地址的&lt;strong&gt;指针&lt;/strong&gt;, 该过程被称为&lt;strong&gt;在堆上分配内存&lt;/strong&gt;，有时简称为 “分配”(&lt;code&gt;allocating&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;接着，该指针会被推入&lt;strong&gt;栈&lt;/strong&gt;中，因为指针的大小是已知且固定的，在后续使用过程中，你将通过栈中的&lt;strong&gt;指针&lt;/strong&gt;，来获取数据在堆上的实际内存位置，进而访问该数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;写入
&lt;ul&gt;
&lt;li&gt;入栈比在堆上分配内存要快&lt;/li&gt;
&lt;li&gt;入栈时操作系统无需分配新的空间，只需要将新数据放入栈顶即可&lt;/li&gt;
&lt;li&gt;在堆上分配内存则需要更多的工作，这是因为操作系统必须首先找到一块足够存放数据的内存空间，接着做一些记录为下一次分配做准备&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;读取
&lt;ul&gt;
&lt;li&gt;得益于 CPU 高速缓存，使得处理器可以减少对内存的访问，高速缓存和内存的访问速度差异在 10 倍以上&lt;/li&gt;
&lt;li&gt;栈数据往往可以直接存储在 CPU 高速缓存中，而堆数据只能存储在内存中&lt;/li&gt;
&lt;li&gt;访问堆上的数据比访问栈上的数据慢，因为必须先访问栈再通过栈上的指针来访问内存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;所有权原则&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%89%80%e6%9c%89%e6%9d%83%e5%8e%9f%e5%88%99&#34;&gt;
        #
    &lt;/a&gt;
    所有权原则
&lt;/div&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rust 中每一个值都被一个变量所拥有，该变量被称为值的所有者&lt;/li&gt;
&lt;li&gt;一个值同时只能被一个变量所拥有，或者说一个值只能拥有一个所有者&lt;/li&gt;
&lt;li&gt;当所有者(变量)离开作用域范围时，这个值将被丢弃(drop)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;变量绑定背后的数据交互&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%8f%98%e9%87%8f%e7%bb%91%e5%ae%9a%e8%83%8c%e5%90%8e%e7%9a%84%e6%95%b0%e6%8d%ae%e4%ba%a4%e4%ba%92&#34;&gt;
        #
    &lt;/a&gt;
    变量绑定背后的数据交互
&lt;/div&gt;
&lt;/h2&gt;
&lt;h4 id=&#34;转移所有权&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e8%bd%ac%e7%a7%bb%e6%89%80%e6%9c%89%e6%9d%83&#34;&gt;
        ###
    &lt;/a&gt;
    转移所有权
&lt;/div&gt;
&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; y &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个值都是通过自动拷贝的方式来赋值的，都被存在栈中，完全无需在堆上分配内存&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s1 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s2 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; s1;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于基本类型（存储在栈上），Rust 会自动拷贝，但是 &lt;code&gt;String&lt;/code&gt; 不是基本类型，而且是存储在堆上的，因此不能自动拷贝。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;String&lt;/code&gt; 类型是一个复杂类型，由&lt;strong&gt;存储在栈中的堆指针&lt;/strong&gt;、&lt;strong&gt;字符串长度&lt;/strong&gt;、&lt;strong&gt;字符串容量&lt;/strong&gt;共同组成，其中&lt;strong&gt;堆指针&lt;/strong&gt;是最重要的，它指向了真实存储字符串内容的堆内存，至于长度和容量，如果你有 Go 语言的经验，这里就很好理解：容量是堆内存分配空间的大小，长度是目前已经使用的大小。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;String&lt;/code&gt; 类型指向了一个堆上的空间，这里存储着它的真实数据, 下面对上面代码中的 &lt;code&gt;let s2 = s1&lt;/code&gt; 分成两种情况讨论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拷贝 &lt;code&gt;String&lt;/code&gt; 和存储在堆上的字节数组 如果该语句是拷贝所有数据(深拷贝)，那么无论是 &lt;code&gt;String&lt;/code&gt; 本身还是底层的堆上数据，都会被全部拷贝，这对于性能而言会造成非常大的影响&lt;/li&gt;
&lt;li&gt;只拷贝 &lt;code&gt;String&lt;/code&gt; 本身 这样的拷贝非常快，因为在 64 位机器上就拷贝了 &lt;code&gt;8字节的指针&lt;/code&gt;、&lt;code&gt;8字节的长度&lt;/code&gt;、&lt;code&gt;8字节的容量&lt;/code&gt;，总计 24 字节，但是带来了新的问题：&lt;strong&gt;一个值只允许有一个所有者&lt;/strong&gt;，而现在这个值（堆上的真实字符串数据）有了两个所有者：&lt;code&gt;s1&lt;/code&gt; 和 &lt;code&gt;s2&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当变量离开作用域后，Rust 会自动调用 &lt;code&gt;drop&lt;/code&gt; 函数并清理变量的堆内存。&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;s1&lt;/code&gt; 和 &lt;code&gt;s2&lt;/code&gt; 离开作用域，它们都会尝试释放相同的内存。这是一个叫做 &lt;strong&gt;二次释放（double free）&lt;/strong&gt; 的错误。&lt;/p&gt;
&lt;p&gt;所以，Rust 这样解决问题：&lt;strong&gt;当 &lt;code&gt;s1&lt;/code&gt; 赋予 &lt;code&gt;s2&lt;/code&gt; 后，Rust 认为 &lt;code&gt;s1&lt;/code&gt; 不再有效，因此也无需在 &lt;code&gt;s1&lt;/code&gt; 离开作用域后 &lt;code&gt;drop&lt;/code&gt; 任何东西，这就是把所有权从 &lt;code&gt;s1&lt;/code&gt; 转移给了 &lt;code&gt;s2&lt;/code&gt;，&lt;code&gt;s1&lt;/code&gt; 在被赋予 &lt;code&gt;s2&lt;/code&gt; 后就马上失效了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;看看在所有权转移后再来使用旧的所有者&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;let s1 = String::from(&amp;#34;hello&amp;#34;);
let s2 = s1;
println!(&amp;#34;{}, world!&amp;#34;, s1);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rust 会禁止你使用无效的引用&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; x: &lt;span style=&#34;color:#ca9ee6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello, world&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; y &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;,x,y);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;x&lt;/code&gt; 只是引用了存储在二进制中的字符串 &lt;code&gt;&amp;quot;hello, world&amp;quot;&lt;/code&gt;，并没有持有所有权。&lt;/p&gt;
&lt;p&gt;因此 &lt;code&gt;let y = x&lt;/code&gt; 中，仅仅是对该引用进行了拷贝，此时 &lt;code&gt;y&lt;/code&gt; 和 &lt;code&gt;x&lt;/code&gt; 都引用了同一个字符串。&lt;/p&gt;
&lt;h4 id=&#34;克隆深拷贝&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%85%8b%e9%9a%86%e6%b7%b1%e6%8b%b7%e8%b4%9d&#34;&gt;
        ###
    &lt;/a&gt;
    克隆(深拷贝)
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Rust 永远也不会自动创建数据的 “深拷贝”&lt;/strong&gt;。任何&lt;strong&gt;自动&lt;/strong&gt;的复制都不是深拷贝。&lt;/p&gt;
&lt;p&gt;如果&lt;strong&gt;确实&lt;/strong&gt;需要深度复制 &lt;code&gt;String&lt;/code&gt; 中堆上的数据，而不仅仅是栈上的数据，可以使用一个叫做 &lt;code&gt;clone&lt;/code&gt; 的方法。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s1 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s2 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; s1.clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;s1 = &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;, s2 = &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, s1, s2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;s2&lt;/code&gt; 完整的复制了 &lt;code&gt;s1&lt;/code&gt; 的数据&lt;/p&gt;
&lt;h4 id=&#34;拷贝浅拷贝&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%8b%b7%e8%b4%9d%e6%b5%85%e6%8b%b7%e8%b4%9d&#34;&gt;
        ###
    &lt;/a&gt;
    拷贝(浅拷贝)
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;浅拷贝只发生在栈上&lt;/p&gt;
&lt;p&gt;Rust 有一个叫做 &lt;code&gt;Copy&lt;/code&gt; 的特征，可以用在类似整型这样在栈中存储的类型。如果一个类型拥有 &lt;code&gt;Copy&lt;/code&gt; 特征，一个旧的变量在被赋值给其他变量后仍然可用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;任何基本类型的组合可以 &lt;code&gt;Copy&lt;/code&gt; ，不需要分配内存或某种形式资源的类型是可以 &lt;code&gt;Copy&lt;/code&gt; 的&lt;/strong&gt;。如下是一些 &lt;code&gt;Copy&lt;/code&gt; 的类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有整数类型&lt;/li&gt;
&lt;li&gt;布尔类型&lt;/li&gt;
&lt;li&gt;所有浮点数类型&lt;/li&gt;
&lt;li&gt;字符类型&lt;/li&gt;
&lt;li&gt;元组，当且仅当其包含的类型也都是 &lt;code&gt;Copy&lt;/code&gt; 的时候&lt;/li&gt;
&lt;li&gt;不可变引用 &lt;code&gt;&amp;amp;T&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;引用与解引用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%bc%95%e7%94%a8%e4%b8%8e%e8%a7%a3%e5%bc%95%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    引用与解引用
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;常规引用是一个指针类型，指向了对象存储的内存地址。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; x &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; y &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;x;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;assert_eq!&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;, x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;assert_eq!&lt;/span&gt;(&lt;span style=&#34;color:#ef9f76&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;y);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;不可变引用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%b8%8d%e5%8f%af%e5%8f%98%e5%bc%95%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    不可变引用
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s1 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; len &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_length(&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;s1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;The length of &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#39; is &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;.&amp;#34;&lt;/span&gt;, s1, len);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;calculate_length&lt;/span&gt;(s: &lt;span style=&#34;color:#ca9ee6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#e78284&#34;&gt;usize&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s.len()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://pic1.zhimg.com/80/v2-fc68ea4a1fe2e3fe4c5bb523a0a8247c_1440w.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;&amp;amp;s1&lt;/code&gt; 语法，我们创建了一个&lt;strong&gt;指向 &lt;code&gt;s1&lt;/code&gt; 的引用&lt;/strong&gt;，但是并不拥有它。因为并不拥有这个值，当引用离开作用域后，其指向的值也不会被丢弃。&lt;/p&gt;
&lt;h2 id=&#34;可变引用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e5%8f%af%e5%8f%98%e5%bc%95%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    可变引用
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;mut&lt;/span&gt; s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    change(&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;mut&lt;/span&gt; s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;change&lt;/span&gt;(some_string: &lt;span style=&#34;color:#ca9ee6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#e5c890&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    some_string.push_str(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;, world&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;s&lt;/code&gt; 是可变类型，其次创建一个可变的引用 &lt;code&gt;&amp;amp;mut s&lt;/code&gt; 和接受可变引用参数 &lt;code&gt;some_string: &amp;amp;mut String&lt;/code&gt; 的函数。&lt;/p&gt;
&lt;p&gt;可变引用同时只能存在一个&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;mut&lt;/span&gt; s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; r1 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;s;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; r2 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;s;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt; and &lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, r1, r2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 新编译器中，r1,r2作用域在这里结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; r3 &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;mut&lt;/span&gt; s;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8caaee&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;&lt;/span&gt;, r3);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 老编译器中，r1、r2、r3作用域在这里结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 新编译器中，r3作用域在这里结束
&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;r1&lt;/code&gt; 借用和 &lt;code&gt;r2&lt;/code&gt; 借用在 &lt;code&gt;println!&lt;/code&gt; 后，就结束了，此时 &lt;code&gt;r3&lt;/code&gt; 可以顺利借用到可变引用。&lt;/p&gt;
&lt;h3 id=&#34;悬垂引用dangling-references&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%82%ac%e5%9e%82%e5%bc%95%e7%94%a8dangling-references&#34;&gt;
        ##
    &lt;/a&gt;
    悬垂引用(Dangling References)
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;指针指向某个值后，这个值被释放掉了，而指针仍然存在，其指向的内存可能不存在任何值或已被其它变量重新使用。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;dangle&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#ca9ee6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt; { &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// dangle 返回一个字符串的引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;); &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// s 是一个新字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;s &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 返回字符串 s 的引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 这里 s 离开作用域并被丢弃。其内存被释放。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 危险！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解决方法是直接返回 &lt;code&gt;String&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ca9ee6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;no_dangle&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e78284&#34;&gt;let&lt;/span&gt; s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;String&lt;/span&gt;::from(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;String&lt;/code&gt; 的 &lt;strong&gt;所有权被转移给外面的调用者&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://course.rs/basic/ownership/ownership.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://course.rs/basic/ownership/ownership.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://course.rs/basic/ownership/borrowing.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://course.rs/basic/ownership/borrowing.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>rust</category>
      
      <category>ownership</category>
      
      
      <guid isPermaLink="true">/posts/230620_rustownership/</guid>
    </item>
    

    <item>
      <title>Linux | tmpfs &amp; tmpdir</title>
      <link>/posts/230226_linuxtmpfs/</link>
      <pubDate>Sun, 26 Feb 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;tmpfs&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#tmpfs&#34;&gt;
        #
    &lt;/a&gt;
    tmpfs
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;T&lt;/strong&gt;e&lt;strong&gt;mp&lt;/strong&gt;orary &lt;strong&gt;F&lt;/strong&gt;ile &lt;strong&gt;S&lt;/strong&gt;ystem的简称，数据存储在易失性内存中，而不是一个持久的存储设备。一个类似的结构是RAM磁盘，它显示为一个虚拟磁盘驱动器，并承载一个磁盘文件系统。&lt;/p&gt;
&lt;p&gt;存储在tmpfs中的所有内容都是临时性的，即不会在非易失性存储器如硬盘上直接创建文件（尽管根据操作系统的页面替换策略，交换空间被用作备份存储）。重启时，tmpfs中的所有内容都会丢失。&lt;/p&gt;
&lt;p&gt;临时文件所使用的内存会随着它所包含的文件而增长和缩小。&lt;/p&gt;
&lt;p&gt;许多 Unix 发行版默认为文件系统的 /tmp 分支或共享内存启用和使用 tmpfs。可以通过 df 观察到。&lt;/p&gt;
&lt;p&gt;而在几乎所有的Linux发行版上，都会在/run/或/var/run/上挂载一个tmpfs，以存储临时的运行时文件，如PID文件和Unix域套接字。临时的系统文件，如固件变量，存放在/sys。&lt;/p&gt;
&lt;p&gt;由于RAM的速度比磁盘存储的速度高，tmpfs允许缓存在其中时速度更快，导致整个系统的效率更高，尽管带有页面缓存的操作系统看到的好处较少，因为如果可用内存足够，最近使用的文件页面会保留在内存中。由于RAM在重启时被清除，tmpfs防止系统变得过于杂乱，而不需要用户手动删除临时文件。此外，在RAM中存储文件可以防止磁盘过快填充，并通过减少写入量延长固态硬盘的寿命。&lt;/p&gt;
&lt;p&gt;使用RAM来存储文件，而不是物理磁盘，这可以提高性能，减少由于磁盘故障造成的数据丢失风险。与物理磁盘相比，tmpfs的一个优点是速度更快，因为读写是在内存中进行的，而不是在较慢的物理磁盘上。然而，需要注意的是，tmpfs受到系统可用内存数量的限制，文件系统可能需要定期调整大小或清除，以避免内存耗尽。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌───────────┬──────────────┬────────────────┐
│ /dev/shm  │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp      │ can be tmpfs │ FHS 1.0        │
├───────────┼──────────────┼────────────────┤
│ /var/tmp  │ never tmpfs  │ FHS 1.0        │
└───────────┴──────────────┴────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;tmp&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#tmp&#34;&gt;
        ##
    &lt;/a&gt;
    /tmp
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;/tmp是一个目录，被系统和应用程序用来存储只在短时间内需要的临时文件。这些文件通常在系统重新启动时被删除。正因为如此，/tmp经常被用来存储运行中的应用程序需要的文件，如日志文件或临时数据。&lt;/p&gt;
&lt;h3 id=&#34;vartmp&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#vartmp&#34;&gt;
        ##
    &lt;/a&gt;
    /var/tmp
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;/var/tmp用于长期存储临时文件，这些文件应在重启后持续存在。&lt;/p&gt;
&lt;p&gt;一般来说，存储在/var/tmp中的文件不会被自动删除，而且它们的目的是在重启后仍然存在。然而，在某些情况下，/var/tmp中的文件可能会被删除，例如，当系统管理员进行系统维护或磁盘空间变满时。&lt;/p&gt;
&lt;p&gt;值得注意的是，Linux文件系统层次标准（FHS）建议不要自动删除/var/tmp中的文件。然而，一些系统管理员可能会选择配置他们的系统来删除/var/tmp中一定时间内没有被访问或修改的文件。&lt;/p&gt;
&lt;h3 id=&#34;devshm&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#devshm&#34;&gt;
        ##
    &lt;/a&gt;
    /dev/shm
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;/dev/shm是基于Unix的操作系统中的一个特殊目录，用于创建和访问共享内存段。共享内存是一种技术，它允许多个进程访问一个共同的内存区域，该区域可用于在它们之间共享数据。&lt;/p&gt;
&lt;p&gt;在基于Unix的系统中，/dev/shm是一个虚拟文件系统，它提供了一个使用RAM磁盘的共享内存实现。当一个进程在/dev/shm中创建一个共享内存段时，操作系统会在RAM盘中创建一个新的文件，该文件有一个代表共享内存段的唯一名称。然后，这个文件可以被其他有必要权限的进程作为共享内存段使用，以访问它。&lt;/p&gt;
&lt;p&gt;通过/dev/shm使用共享内存的好处是，它比其他进程间的通信方法（如管道或套接字）更快，因为数据不在进程间复制。相反，进程可以直接访问同一区域的内存，这可以提高性能并减少开销。&lt;/p&gt;
&lt;p&gt;需要注意的是，/dev/shm中的共享内存段的内容是不稳定的，当系统重启或创建共享内存段的进程明确删除这些内存段时，这些内容就会丢失。因此，确保使用/dev/shm中的共享内存段的进程正确管理它们的创建和删除，以避免任何数据丢失或系统不稳定是很重要的。&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Tmpfs&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://en.wikipedia.org/wiki/Tmpfs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://superuser.com/questions/45342/when-should-i-use-dev-shm-and-when-should-i-use-tmp&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://superuser.com/questions/45342/when-should-i-use-dev-shm-and-when-should-i-use-tmp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Temporary_folder&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://en.wikipedia.org/wiki/Temporary_folder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;chatGPT&lt;/li&gt;
&lt;/ol&gt;</content:encoded>
      
      <category>linux</category>
      
      <category>tmpfs</category>
      
      
      <guid isPermaLink="true">/posts/230226_linuxtmpfs/</guid>
    </item>
    

    <item>
      <title>Go | Build Constraints 构建约束</title>
      <link>/posts/230102_gobuildconstraints/</link>
      <pubDate>Mon, 02 Jan 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      一个构建约束(构建标签)是文件应包含在包中的条件。构建约束由开始的行注释给出。

      </description>
      <content:encoded>&lt;p&gt;一个构建约束(构建标签)是文件应包含在包中的条件。构建约束由开始的行注释给出。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;约束可以出现在任何类型的源文件中（不仅仅是 Go），但它们必须出现在文件顶部附近，前面只有空行和其他行注释。
这些规则意味着在 Go 文件中，构建约束必须出现在 package 子句之前。&lt;/p&gt;
&lt;p&gt;为了区分构建约束和包文档，构建约束后面应该跟一个空行。&lt;/p&gt;
&lt;p&gt;构建约束注释被评估为包含由 ||、&amp;amp;&amp;amp; 和 ! 组合的构建标记的表达式,运算符和括号。&lt;/p&gt;
&lt;p&gt;例如，当满足&lt;code&gt;linux&lt;/code&gt;和&lt;code&gt;386&lt;/code&gt;约束时，或者满足&lt;code&gt;darwin&lt;/code&gt;而&lt;code&gt;cgo&lt;/code&gt;不满足时，以下构建约束约束文件构建：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build (linux &amp;amp;&amp;amp; 386) || (darwin &amp;amp;&amp;amp; !cgo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个文件有多个 &lt;code&gt;//go:build&lt;/code&gt; 行是错误的。&lt;/p&gt;
&lt;p&gt;在特定构建期间，满足以下构建标签：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标操作系统，由 &lt;code&gt;runtime.GOOS&lt;/code&gt; 拼写，使用 &lt;code&gt;GOOS&lt;/code&gt; 环境变量设置。&lt;/li&gt;
&lt;li&gt;目标体系结构，由 &lt;code&gt;runtime.GOARCH&lt;/code&gt; 拼写，使用 &lt;code&gt;GOARCH&lt;/code&gt; 环境变量设置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unix&lt;/code&gt;，如果 &lt;code&gt;GOOS&lt;/code&gt; 是 &lt;code&gt;Unix&lt;/code&gt; 或类 &lt;code&gt;Unix&lt;/code&gt; 系统。&lt;/li&gt;
&lt;li&gt;正在使用的编译器，&lt;code&gt;gc&lt;/code&gt;或&lt;code&gt;gccgo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cgo&lt;/code&gt;，如果支持 &lt;code&gt;cgo&lt;/code&gt; 命令（请参阅&lt;code&gt;go help environment&lt;/code&gt;中的 &lt;code&gt;CGO_ENABLED&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;每个 Go 主要版本的术语，通过当前版本：从 Go 1.1 版开始的“go1.1”，从 Go 1.12 开始的“go1.12”，等等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-tags&lt;/code&gt; 标志给出的任何附加标签（参见&lt;code&gt;go help build&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果文件名在去除扩展名和可能的 &lt;code&gt;_test&lt;/code&gt; 后缀后匹配以下任何模式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOOS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOARCH
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOOS_GOARCH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（示例：&lt;code&gt;source_windows_amd64.go&lt;/code&gt;）其中 &lt;code&gt;GOOS&lt;/code&gt; 和 &lt;code&gt;GOARCH&lt;/code&gt; 分别代表任何已知的操作系统和体系结构值，然后该文件被认为具有需要这些术语的隐式构建约束（除了文件中的任何显式约束之外）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了 &lt;code&gt;android&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=android&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=linux&lt;/code&gt; 一样。&lt;/li&gt;
&lt;li&gt;除了 &lt;code&gt;illumos&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=illumos&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=solaris&lt;/code&gt; 一样。&lt;/li&gt;
&lt;li&gt;除了 &lt;code&gt;ios&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=ios&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=darwin&lt;/code&gt; 一样。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要阻止文件被考虑用于构建：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仅在使用 &lt;code&gt;cgo&lt;/code&gt; 时构建文件，并且仅在 &lt;code&gt;Linux&lt;/code&gt; 和 &lt;code&gt;OS X&lt;/code&gt; 上：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build cgo &amp;amp;&amp;amp; (linux || darwin)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的文件通常与另一个实现其他系统默认功能的文件配对，在这种情况下会带有约束：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build !(cgo &amp;amp;&amp;amp; (linux || darwin))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将文件命名为 &lt;code&gt;dns_windows.go&lt;/code&gt; 将导致它仅在为 &lt;code&gt;Windows&lt;/code&gt; 构建包时被包含；同样，只有在为 32 位 &lt;code&gt;x86&lt;/code&gt; 构建包时才会包含 &lt;code&gt;math_386.s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Go 版本 1.16 及更早版本使用不同的语法来构建约束，带有&lt;code&gt;// +build&lt;/code&gt;前缀。 gofmt 命令将在遇到旧语法时添加等效的 &lt;code&gt;//go:build&lt;/code&gt; 约束。&lt;/p&gt;
&lt;p&gt;例外，下列使用空格，逗号，多行在新版本中已失效：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用空格分隔的构建标记在逻辑上是或
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build linux darwin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;用逗号分隔的构建标记在逻辑上是和
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build windows,386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;在多行上构建约束是逻辑和
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build 386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整的约束标签可以在&lt;a href=&#34;https://github.com/golang/go/blob/master/src/go/build/syslist.go&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;这里&lt;/a&gt;找到&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/cmd/go#hdr-Build_constraints&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Build constraints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/230102_gobuildconstraints/</guid>
    </item>
    
  </channel>
</rss>
