<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Go on chengzhycn&#39;s blog</title>
		<link>https://blog.jinzhi.site/tags/go/</link>
		<description>Recent content in Go on chengzhycn&#39;s blog</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Wed, 17 Sep 2025 21:45:28 +0800</lastBuildDate>
		
			<atom:link href="https://blog.jinzhi.site/tags/go/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Go 汇编分析</title>
				<link>https://blog.jinzhi.site/posts/2025-09/go-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90/</link>
				<pubDate>Wed, 17 Sep 2025 21:45:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2025-09/go-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90/</guid>
				<description>&lt;p&gt;Go的汇编不是像 C/C++ 一样，对机器码的直接描述，而是兼容跨平台需求实现的半抽象化的指令集。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://go.dev/doc/asm&#34;&gt;https://go.dev/doc/asm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;汇编分析go-117&#34;&gt;汇编分析（Go 1.17）&lt;/h2&gt;&#xA;&lt;p&gt;我们用一个简单的例子来开始汇编分析：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;汇编结果，删去了一些无关的输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# go tool compile -S -l -N main.go&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.main STEXT &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0 &lt;span class=&#34;nv&#34;&gt;locals&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x18 &lt;span class=&#34;nv&#34;&gt;funcid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        TEXT    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.main&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, ABIInternal, &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;-0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CMPQ    SP, 16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;R14&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        JLS     &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0006 &lt;span class=&#34;m&#34;&gt;00006&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0006 &lt;span class=&#34;m&#34;&gt;00006&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        SUBQ    &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000a &lt;span class=&#34;m&#34;&gt;00010&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BP, 16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000f &lt;span class=&#34;m&#34;&gt;00015&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        LEAQ    16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVL    &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0019 &lt;span class=&#34;m&#34;&gt;00025&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVL    &lt;span class=&#34;nv&#34;&gt;$3&lt;/span&gt;, BX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x001e &lt;span class=&#34;m&#34;&gt;00030&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x001e &lt;span class=&#34;m&#34;&gt;00030&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        NOP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0020 &lt;span class=&#34;m&#34;&gt;00032&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CALL    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0025 &lt;span class=&#34;m&#34;&gt;00037&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002a &lt;span class=&#34;m&#34;&gt;00042&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002e &lt;span class=&#34;m&#34;&gt;00046&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        RET&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        NOP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CALL    runtime.morestack_noctxt&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0034 &lt;span class=&#34;m&#34;&gt;00052&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0034 &lt;span class=&#34;m&#34;&gt;00052&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        JMP     &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add STEXT nosplit &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;56&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x10 &lt;span class=&#34;nv&#34;&gt;locals&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x10 &lt;span class=&#34;nv&#34;&gt;funcid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        TEXT    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, NOSPLIT&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;ABIInternal, &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;-16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        SUBQ    &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BP, 8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0009 &lt;span class=&#34;m&#34;&gt;00009&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        LEAQ    8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$5&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add.arginfo1&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    AX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.i+24&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0013 &lt;span class=&#34;m&#34;&gt;00019&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.j+32&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0018 &lt;span class=&#34;m&#34;&gt;00024&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.~r2&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0020 &lt;span class=&#34;m&#34;&gt;00032&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.i+24&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0025 &lt;span class=&#34;m&#34;&gt;00037&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.j+32&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002a &lt;span class=&#34;m&#34;&gt;00042&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    AX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.~r2&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002e &lt;span class=&#34;m&#34;&gt;00046&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0033 &lt;span class=&#34;m&#34;&gt;00051&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0037 &lt;span class=&#34;m&#34;&gt;00055&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        RET&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;FUNCDATA&lt;/code&gt;和&lt;code&gt;PCDATA&lt;/code&gt;是由编译器引入的，主要包含垃圾回收时使用的信息，这里略过。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Go channel 实现</title>
				<link>https://blog.jinzhi.site/posts/2021-09/go-channel-%E5%AE%9E%E7%8E%B0/</link>
				<pubDate>Sun, 12 Sep 2021 09:30:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2021-09/go-channel-%E5%AE%9E%E7%8E%B0/</guid>
				<description>&lt;p&gt;Go的Channel在runtime里面是一个hchan的结构体，每次我们make一个新的channel时，runtime从heap内分配一个hchan结构体管理channel。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hchan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;qcount&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;           &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// total data in the queue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dataqsiz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;           &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// size of the circular queue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;unsafe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Pointer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// points to an array of dataqsiz elements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;elemsize&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;closed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;elemtype&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// element type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sendx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// send index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;recvx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// receive index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;recvq&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitq&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// list of recv waiters&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sendq&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitq&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// list of send waiters&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// lock protects all fields in hchan, as well as several&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// fields in sudogs blocked on this channel.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;    // Do not change another G&amp;#39;s status while holding this lock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// (in particular, do not ready a G), as this can deadlock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// with stack shrinking.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mutex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;qcount：当前channel queue内的element数目，当qcount等于dataqsiz时，表示channel buffer已经满了，send channel会被阻塞；&lt;/li&gt;&#xA;&lt;li&gt;dataqsiz：channel的buffer大小，也就是我们在make时设定的值。dataqsiz在channel创建后不会再变动，因此channel的buffer是不会动态扩容的；&lt;/li&gt;&#xA;&lt;li&gt;buf：buffered channel缓存elements的内存地址。是一个数组实现的环形队列；&lt;/li&gt;&#xA;&lt;li&gt;elemsize：element类型大小；&lt;/li&gt;&#xA;&lt;li&gt;closed：channel是否已经被关闭，防止关闭已经关闭的channel；&lt;/li&gt;&#xA;&lt;li&gt;elemtype：channel element 类型；&lt;/li&gt;&#xA;&lt;li&gt;sendx：buffer中下一个生产的element的index；&lt;/li&gt;&#xA;&lt;li&gt;recvx：buffer中下一个消费的element的index；&lt;/li&gt;&#xA;&lt;li&gt;recvq：阻塞的接收channel，是一个sudog的链表&lt;/li&gt;&#xA;&lt;li&gt;sendq：阻塞的发送channel，是一个sudog的链表&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当buffer没有满时，send channel发送elements时直接把elements放在buf内，增加sendx和qcount；当buffer满时，send channel被阻塞，并加入到sendq链表内，等待被唤醒；&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
