<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Believe it</title>
  
  <subtitle>相信不屈不挠的努力,相信战胜死亡的年轻</subtitle>
  <link href="http://fightinggg.github.io/apollo/atom.xml" rel="self"/>
  
  <link href="http://fightinggg.github.io/apollo/"/>
  <updated>2023-05-17T05:00:00.000Z</updated>
  <id>http://fightinggg.github.io/apollo/</id>
  
  <author>
    <name>fightinggg</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>智慧的疆界：从图灵机到人工智能</title>
    <link href="http://fightinggg.github.io/apollo/RUSDW0.html"/>
    <id>http://fightinggg.github.io/apollo/RUSDW0.html</id>
    <published>2023-05-17T05:00:00.000Z</published>
    <updated>2023-05-17T05:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RUSDW0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><blockquote><p> 图灵已经找到了计算能力的基石，但寻找智慧的基石这项工作，仍然没有见到成功的曙光，世界在等待着下一个“图灵”的出现。</p></blockquote><p>谁会是下一个图灵呢，是奥特曼吗，我们不得而知，GPT的发布如火如荼，吸引了全世界的注意力。</p><span id="more"></span><p>我并不看好目前的AI进展，不管是近十年深度学习的飞速发展，还是Transformer近期的又一次颠覆，这些都不是真正的智能。真正的智能应该不需要训练，具备自主学习能力。就语言能力而言，真正的智能能从零开始自己解析语言，不需要任何数据教他。就像三体中提到的自译解析系统一样。</p><blockquote><p>虽然都声称已经成功开发出了非冯·诺依曼的新型计算机架构，然而就背后对应的非图灵机的新型计算模型而言，仍是毫无头绪。</p></blockquote><p>或许图灵机这个模型就无法实现这样的AI。那么任何冯诺依曼架构的计算机就都无法实现。或许非冯诺依曼架构才有新的可能？当然这都是我的猜想。</p><p>伟大的图灵吞食氰化物结束的自己传奇的一生，当时的社会是不够包容的（同性恋难以理解，但我尊重他的选择）。</p><blockquote><p>“伊莉莎效应”（ELIZA Effect）￼，这个词的意思是说人可以过度解读机器的结果，读出原本不具有的意义。</p></blockquote><p>gpt4就是是eliza effect的典型代表，短视频创作者们无所不用其极。</p><p>冯诺依曼曾推理出一个智能系统应当包含一个自复制系统，而一个自复制系统应该具备两个能力。</p><blockquote><p>首先，它必须能够构建一个组成元素和结构与自己一致的后代系统，然后它需要能够把对自身的描述传递给这个后代系统。冯·诺依曼把这两个部分分别称作“通用构造器”和“描述器”，而描述器中又包含了一个通用图灵机和保存在通用图灵机器能够读取的介质上的描述信息。这样，只要有合适的原料，通用构造器就可以根据描述器的指示，生产出下一台机器，并且把描述的信息也传递给这台新机器。随后，新机器启动，再进入下一个复制循环。</p></blockquote><p>在当时，没有设计出能够进行自我复制的机器，但是遵循冯诺依曼的思路进行自我复制的软件已经存在：DNA双螺旋结构。</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RUSDW0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt; 图灵已经找到了计算能力的基石，但寻找智慧的基石这项工作，仍然没有见到成功的曙光，世界在等待着下一个“图灵”的出现。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;谁会是下一个图灵呢，是奥特曼吗，我们不得而知，GPT的发布如火如荼，吸引了全世界的注意力。&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="http://fightinggg.github.io/apollo/categories/AI/"/>
    
    
    <category term="读书" scheme="http://fightinggg.github.io/apollo/tags/%E8%AF%BB%E4%B9%A6/"/>
    
    <category term="AI" scheme="http://fightinggg.github.io/apollo/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>Transformer</title>
    <link href="http://fightinggg.github.io/apollo/RS7SSC.html"/>
    <id>http://fightinggg.github.io/apollo/RS7SSC.html</id>
    <published>2023-03-28T05:05:00.000Z</published>
    <updated>2023-03-28T05:05:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RS7SSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="Transformer背景介绍"><a href="#Transformer背景介绍" class="headerlink" title="Transformer背景介绍"></a>Transformer背景介绍</h1><p>Transformer指的是一种架构，未来的<code>NLP(自然语言处理)</code>都可以使用此架构。Transformer由编码器、解码器(后面会介绍)等组成，他的输入是向量数组，输出是也是向量数组。</p><p>注意：Transformer架构的输出是把向量逐个输出的。</p><p>Transformer架构最初只用来做机器翻译，例如将英语翻译成德语。在翻译的过程中<code>待翻译语句</code>作为输入，而<code>翻译结果</code>作为输出。<code>待翻译语句</code>中的每一个<code>Token(词)</code>会被转化为向量作为输入，Transformer的输出向量最终被转化为<code>翻译结果</code>的<code>Token(词)</code>。由于Transformer逐一输出结果的特性，<code>翻译结果</code>是一个<code>Token(词)</code>一个<code>Token(词)</code>逐渐输出的。</p><p>Transformer架构不仅仅只可以用与机器翻译，Transformer现在也用于GPT中，就是GPT的最后一个字母T所代表的含义。由于Transformer逐一输出结果的特性，GPT也是一个<code>Token(词)</code>一个<code>Token(词)</code>逐渐输出的。</p><span id="more"></span><h1 id="注意力机制"><a href="#注意力机制" class="headerlink" title="注意力机制"></a>注意力机制</h1><p>注意力机制源自做翻译时的技巧，当我们翻译某个词的时候，我们应该注意这个词。例如我们如果要翻译以下句子为中文：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Hello World !</span><br></pre></td></tr></table></figure><p>假设他的标准答案是：<code>你好，世界！</code></p><p>当我们写下中文<code>你好</code>的时候，我们需要注意单词<code>Hello</code>，因为这个单词将被翻译成<code>你好</code>，当我们写下中文<code>世界</code>的时候，我们需要注意单词<code>World</code>。注意力机制就试图让机器明白以上道理。</p><p>更加严谨一点，在训练时，用公式表示即为：假设已知输入为向量数组$K$包含向量$K_1$,$K_2$,$K_3$等。假设预期输出为向量$V$包含向量$V_1$,$V_2$,$V_3$等，已知注意力为$A$，$A_{ij}$代表$V_i$的计算中，$K_{j}$所占的权重。</p><p>那么便有了计算公式$V_i&#x3D;F(f_{i1},f_{i2},f_{i3}…)$,$f_{ij}&#x3D;f(A_{ij},K_{j})$, 注意其中的$F$函数和$f$函数，如何设定都可以。</p><p>在测试时，假设一个测试数据为向量$Q$包含$Q_1Q_2Q_3$, 按照$V$的计算公式，其中只有$A$需要变更，因为$A_{ij}$代表$V_i$(而不是$Q_i$)的计算中，$K_{j}$所占的权重。这里只需要想办法换成想要的注意力即可，方法有很多，主要围绕$Q$和$V$的相似关系来计算，这里不做展开。下文介绍一种使用自注意力机制的方案来计算相似关系。</p><h1 id="自注意力机制"><a href="#自注意力机制" class="headerlink" title="自注意力机制"></a>自注意力机制</h1><p>自注意力机制源于另一个技巧，当我们翻译某个词的时候，我们应该注意另一个词。例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The program has a bug</span><br></pre></td></tr></table></figure><p>当我们翻译<code>bug</code>的时候，不能把它翻译成<code>虫子</code>。我们需要注意到前面的单词<code>program</code>，因此翻译成<code>问题</code></p><p>因此我们将一份训练数据的输入，即当做$K$,又当做$V$,也当做$Q$。于是就可以训练出前文说的注意力$A$</p><p>&#x2F;&#x2F; TODO</p><h1 id="多头自注意力机制"><a href="#多头自注意力机制" class="headerlink" title="多头自注意力机制"></a>多头自注意力机制</h1><p>由于自注意力机制可学习的参数较少，多头自注意力机制用来扩充自注意力机制的可学习参数。</p><p>多头自注意力机制，将输入投影到$N$个不同的空间，得到$N$个输入，分别做自注意力机制，得到$N$个输出，最终通过全连接层投影回来，得到一个输出。</p><p>在这个过程中，产生了投影的参数、全连接的参数，可学习参数就多起来了。</p><h1 id="位置编码"><a href="#位置编码" class="headerlink" title="位置编码"></a>位置编码</h1><p>自注意力模型，不受位置的影响。考虑一个输入是向量数组，若打乱输入顺序，不影响输出结果，这个是不合适的，可以考虑直接把位置也编码进输入中，方案是使用三角函数给输入向量的每一个维度都加上周期的三角函数值。</p><p>为什么是三角函数？这是收到计算机中数字编码的启发。若把计算机中的32位数字的每一个位拿来看，从0到最大值，32位的每一个位都是周期不同的01变换（最低位变换为010101…，次低位是001100110011…，再次为000011110000111100001111…），这其实也是一种三角函数。</p><h1 id="Transformer"><a href="#Transformer" class="headerlink" title="Transformer"></a>Transformer</h1><p>&#x2F;&#x2F; TODO</p><p><img src='/The-Transformer-model-architecture.png'>x</img></p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RS7SSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;Transformer背景介绍&quot;&gt;&lt;a href=&quot;#Transformer背景介绍&quot; class=&quot;headerlink&quot; title=&quot;Transformer背景介绍&quot;&gt;&lt;/a&gt;Transformer背景介绍&lt;/h1&gt;&lt;p&gt;Transformer指的是一种架构，未来的&lt;code&gt;NLP(自然语言处理)&lt;/code&gt;都可以使用此架构。Transformer由编码器、解码器(后面会介绍)等组成，他的输入是向量数组，输出是也是向量数组。&lt;/p&gt;
&lt;p&gt;注意：Transformer架构的输出是把向量逐个输出的。&lt;/p&gt;
&lt;p&gt;Transformer架构最初只用来做机器翻译，例如将英语翻译成德语。在翻译的过程中&lt;code&gt;待翻译语句&lt;/code&gt;作为输入，而&lt;code&gt;翻译结果&lt;/code&gt;作为输出。&lt;code&gt;待翻译语句&lt;/code&gt;中的每一个&lt;code&gt;Token(词)&lt;/code&gt;会被转化为向量作为输入，Transformer的输出向量最终被转化为&lt;code&gt;翻译结果&lt;/code&gt;的&lt;code&gt;Token(词)&lt;/code&gt;。由于Transformer逐一输出结果的特性，&lt;code&gt;翻译结果&lt;/code&gt;是一个&lt;code&gt;Token(词)&lt;/code&gt;一个&lt;code&gt;Token(词)&lt;/code&gt;逐渐输出的。&lt;/p&gt;
&lt;p&gt;Transformer架构不仅仅只可以用与机器翻译，Transformer现在也用于GPT中，就是GPT的最后一个字母T所代表的含义。由于Transformer逐一输出结果的特性，GPT也是一个&lt;code&gt;Token(词)&lt;/code&gt;一个&lt;code&gt;Token(词)&lt;/code&gt;逐渐输出的。&lt;/p&gt;</summary>
    
    
    
    <category term="AI" scheme="http://fightinggg.github.io/apollo/categories/AI/"/>
    
    <category term="GPT" scheme="http://fightinggg.github.io/apollo/categories/AI/GPT/"/>
    
    
    <category term="AI" scheme="http://fightinggg.github.io/apollo/tags/AI/"/>
    
    <category term="GPT" scheme="http://fightinggg.github.io/apollo/tags/GPT/"/>
    
    <category term="Transformer" scheme="http://fightinggg.github.io/apollo/tags/Transformer/"/>
    
  </entry>
  
  <entry>
    <title>2023你好</title>
    <link href="http://fightinggg.github.io/apollo/RPN780.html"/>
    <id>http://fightinggg.github.io/apollo/RPN780.html</id>
    <published>2023-02-06T05:00:00.000Z</published>
    <updated>2023-02-06T05:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RPN780.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><p>这里立Flag，没人看得到，没人看得到的Flag，就是能实现的Flag。</p><span id="more"></span><p>2023，每天读书1.5小时；</p><p>2023，周末每天读书6小时。</p><p>2023，每个月一篇技术Blog，一篇文学Blog。</p><p>2023，变成精致男孩，哈哈哈。</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RPN780.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里立Flag，没人看得到，没人看得到的Flag，就是能实现的Flag。&lt;/p&gt;</summary>
    
    
    
    <category term="Others" scheme="http://fightinggg.github.io/apollo/categories/Others/"/>
    
    
    <category term="flag" scheme="http://fightinggg.github.io/apollo/tags/flag/"/>
    
  </entry>
  
  <entry>
    <title>VPN与代理那些事</title>
    <link href="http://fightinggg.github.io/apollo/RFJ220.html"/>
    <id>http://fightinggg.github.io/apollo/RFJ220.html</id>
    <published>2022-07-24T13:42:00.000Z</published>
    <updated>2022-07-24T13:42:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RFJ220.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="VPN-与-Proxy"><a href="#VPN-与-Proxy" class="headerlink" title="VPN 与 Proxy"></a>VPN 与 Proxy</h1><p>VPN 和Proxy有什么区别呢，国内的各大平台极力屏蔽了VPN和Proxy这两个关键字，很多人都分不清他们的关系。</p><p>VPN全名虚拟专用网络，Proxy全名代理。</p><p>其实，VPN工作于操作系统级别，而Proxy工作在应用级别。如果你配置了VPN，那么所有的应用都进入了虚拟的网络；但如果你配置了代理，只有支持代理的那部分应用才可以进入到虚拟的网络，不支持代理的APP，则无法使用虚拟网络。</p><h1 id="VPN原理图"><a href="#VPN原理图" class="headerlink" title="VPN原理图"></a>VPN原理图</h1><p><img src='/vpn-原理.svg'></img></p><span id="more"></span><h1 id="Proxy原理图"><a href="#Proxy原理图" class="headerlink" title="Proxy原理图"></a>Proxy原理图</h1><p><img src='/Proxy原理.svg'></img></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>上面两张图已经完美诠释了VPN和Proxy的核心区别了。</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RFJ220.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;VPN-与-Proxy&quot;&gt;&lt;a href=&quot;#VPN-与-Proxy&quot; class=&quot;headerlink&quot; title=&quot;VPN 与 Proxy&quot;&gt;&lt;/a&gt;VPN 与 Proxy&lt;/h1&gt;&lt;p&gt;VPN 和Proxy有什么区别呢，国内的各大平台极力屏蔽了VPN和Proxy这两个关键字，很多人都分不清他们的关系。&lt;/p&gt;
&lt;p&gt;VPN全名虚拟专用网络，Proxy全名代理。&lt;/p&gt;
&lt;p&gt;其实，VPN工作于操作系统级别，而Proxy工作在应用级别。如果你配置了VPN，那么所有的应用都进入了虚拟的网络；但如果你配置了代理，只有支持代理的那部分应用才可以进入到虚拟的网络，不支持代理的APP，则无法使用虚拟网络。&lt;/p&gt;
&lt;h1 id=&quot;VPN原理图&quot;&gt;&lt;a href=&quot;#VPN原理图&quot; class=&quot;headerlink&quot; title=&quot;VPN原理图&quot;&gt;&lt;/a&gt;VPN原理图&lt;/h1&gt;&lt;p&gt;&lt;img src=&#39;/vpn-原理.svg&#39;&gt;&lt;/img&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="计算机网络" scheme="http://fightinggg.github.io/apollo/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="VPN" scheme="http://fightinggg.github.io/apollo/tags/VPN/"/>
    
    <category term="Proxy" scheme="http://fightinggg.github.io/apollo/tags/Proxy/"/>
    
  </entry>
  
  <entry>
    <title>CPU架构介绍</title>
    <link href="http://fightinggg.github.io/apollo/RF964O.html"/>
    <id>http://fightinggg.github.io/apollo/RF964O.html</id>
    <published>2022-07-19T05:34:00.000Z</published>
    <updated>2022-07-19T05:34:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RF964O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="CPU分类"><a href="#CPU分类" class="headerlink" title="CPU分类"></a>CPU分类</h1><p>CPU分两类，精简指令集CPU（RISC）和复杂指令集CPU（CISC）。Intel、AMD厂商主要做复杂指令集CPU；IBM，ARM厂商主要做精简指令集CPU。</p><p>精简指令集CPU能耗低，性能相对较弱，常用于移动设备；复杂指令集CPU能耗高，性能强，常用于桌面设备。</p><h1 id="CPU架构分类"><a href="#CPU架构分类" class="headerlink" title="CPU架构分类"></a>CPU架构分类</h1><p>不同厂商做的CPU，其架构也不尽相同，目前为止，比较多的架构有四种，ARM架构、X86架构、MIPS架构、PowerPC架构。</p><p>ARM架构CPU为精简指令集CPU；X86架构CPU为复杂指令集CPU；MIPS架构和PowerPC架构目前用的不太多了。笔者大学期间学习计算机组成原理的时候，学的就是MIPS架构。</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RF964O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;CPU分类&quot;&gt;&lt;a href=&quot;#CPU分类&quot; class=&quot;headerlink&quot; title=&quot;CPU分类&quot;&gt;&lt;/a&gt;CPU分类&lt;/h1&gt;&lt;p&gt;CPU分两类，精简指令集CPU（RISC）和复杂指令集CPU（CISC）。Intel、AMD厂商主要做复杂指令集CPU；IBM，ARM厂商主要做精简指令集CPU。&lt;/p&gt;
&lt;p&gt;精简指令集CPU能耗低，性能相对较弱，常用于移动设备；复杂指令集CPU能耗高，性能强，常用于桌面设备。&lt;/p&gt;
&lt;h1 id=&quot;CPU架构分类&quot;&gt;&lt;a href=&quot;#CPU架构分类&quot; class=&quot;headerlink&quot; title=&quot;CPU架构分类&quot;&gt;&lt;/a&gt;CPU架构分类&lt;/h1&gt;&lt;p&gt;不同厂商做的CPU，其架构也不尽相同，目前为止，比较多的架构有四种，ARM架构、X86架构、MIPS架构、PowerPC架构。&lt;/p&gt;
&lt;p&gt;ARM架构CPU为精简指令集CPU；X86架构CPU为复杂指令集CPU；MIPS架构和PowerPC架构目前用的不太多了。笔者大学期间学习计算机组成原理的时候，学的就是MIPS架构。&lt;/p&gt;</summary>
    
    
    
    <category term="CPU" scheme="http://fightinggg.github.io/apollo/categories/CPU/"/>
    
    
    <category term="CPU" scheme="http://fightinggg.github.io/apollo/tags/CPU/"/>
    
  </entry>
  
  <entry>
    <title>docker内部安装软件</title>
    <link href="http://fightinggg.github.io/apollo/RF3QFO.html"/>
    <id>http://fightinggg.github.io/apollo/RF3QFO.html</id>
    <published>2022-07-16T07:07:00.000Z</published>
    <updated>2022-07-16T07:07:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RF3QFO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="以哪个镜像作为基础镜像"><a href="#以哪个镜像作为基础镜像" class="headerlink" title="以哪个镜像作为基础镜像"></a>以哪个镜像作为基础镜像</h1><p><a href="https://hub.docker.com/layers/centos/library/centos/centos8/images/sha256-a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc?context=explore">centos:centos8</a></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --rm centos:centos8</span><br></pre></td></tr></table></figure><h1 id="换源"><a href="#换源" class="headerlink" title="换源"></a>换源</h1><h2 id="阿里源"><a href="#阿里源" class="headerlink" title="阿里源"></a>阿里源</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sed -i &#x27;s/mirrorlist/#mirrorlist/g&#x27; /etc/yum.repos.d/CentOS-* \</span><br><span class="line">&amp;&amp; sed -i &#x27;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&#x27; /etc/yum.repos.d/CentOS-* \</span><br><span class="line">&amp;&amp; curl https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -L -o /etc/yum.repos.d/CentOS-Base.repo \</span><br><span class="line">&amp;&amp; yum clean all \</span><br><span class="line">&amp;&amp; yum makecache</span><br></pre></td></tr></table></figure><h1 id="安装Git"><a href="#安装Git" class="headerlink" title="安装Git"></a>安装Git</h1><h2 id="yum-安装"><a href="#yum-安装" class="headerlink" title="yum 安装"></a>yum 安装</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install git -y</span><br></pre></td></tr></table></figure><h2 id="二进制安装"><a href="#二进制安装" class="headerlink" title="二进制安装"></a>二进制安装</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure><h1 id="安装Clang"><a href="#安装Clang" class="headerlink" title="安装Clang"></a>安装Clang</h1><h2 id="yum安装"><a href="#yum安装" class="headerlink" title="yum安装"></a>yum安装</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install clang -y</span><br></pre></td></tr></table></figure><h2 id="二进制安装-1"><a href="#二进制安装-1" class="headerlink" title="二进制安装"></a>二进制安装</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">```</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 安装SSH</span><br><span class="line"></span><br><span class="line">## yum安装</span><br><span class="line"></span><br><span class="line">```shell</span><br><span class="line">yum install openssh-server openssh-clients passwd  -y \</span><br><span class="line">&amp;&amp; sed -i &quot;s/^UsePAM yes/UsePAM no/g&quot; /etc/ssh/sshd_config \</span><br><span class="line">&amp;&amp; echo 123456 | passwd root --stdin \</span><br><span class="line">&amp;&amp; ssh-keygen -t rsa -P &#x27;&#x27; -f ~/.ssh/id_rsa \</span><br><span class="line">&amp;&amp; cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys \</span><br><span class="line">&amp;&amp; chmod 0600 ~/.ssh/authorized_keys \</span><br><span class="line">&amp;&amp; ssh-keygen -q -N &quot;&quot; -t rsa -f /etc/ssh/ssh_host_rsa_key \</span><br><span class="line">&amp;&amp; ssh-keygen -q -N &quot;&quot; -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key \</span><br><span class="line">&amp;&amp; ssh-keygen -q -N &quot;&quot; -t ed25519 -f /etc/ssh/ssh_host_ed25519_key</span><br></pre></td></tr></table></figure><h2 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/sbin/sshd</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RF3QFO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
  </summary>
      
    
    
    
    <category term="Docker" scheme="http://fightinggg.github.io/apollo/categories/Docker/"/>
    
    
    <category term="docker" scheme="http://fightinggg.github.io/apollo/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>白帽子讲Web安全</title>
    <link href="http://fightinggg.github.io/apollo/RCFBSC.html"/>
    <id>http://fightinggg.github.io/apollo/RCFBSC.html</id>
    <published>2022-05-25T05:41:00.000Z</published>
    <updated>2022-05-25T05:41:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/RCFBSC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><p><img src='/封面.png'></img></p><h1 id="1-总揽"><a href="#1-总揽" class="headerlink" title="1. 总揽"></a>1. 总揽</h1><p>很老的一本书，但是依然有阅读价值。</p><p>全书分为4个部分，其中比较重要的应该是第二章和第三章，第二章主要讲解客户端（浏览器）如何保障用户的安全，第三章主要讲解服务端如何保障用户安全。</p><h1 id="2-客户端安全"><a href="#2-客户端安全" class="headerlink" title="2. 客户端安全"></a>2. 客户端安全</h1><p>客户端这边容易受到攻击的主要有三个类型。</p><p>第一个是XSS攻击，全名跨站脚本攻击，通常指的是黑客通过某些手段，篡改了用户访问的页面，导致页面上执行了一些恶意的脚本。一个简单的例子：在你登陆淘宝之后，黑客篡改了你的淘宝页面（篡改了用户访问的页面），自动帮你购买了一些奇怪的东西（执行了一些恶意的脚本）。</p><p>第二个是CSRF攻击，全名跨站点请求伪造，通常指的是黑客通过某些手段，诱导用户访问某钓鱼页面，在该页面上完成了一些恶意的脚本。一个简单的例子： 在一些诱惑下你点开了一个页面（诱导用户访问某钓鱼页面），尽管你之后什么都没有做，但是你的淘宝购物车被恶意清空了（在该页面上完成了一些恶意的脚本）</p><p>第三个是ClickJacking攻击，全名点击劫持攻击，通常指的是黑客通过某些手段，诱导用户访问某钓鱼页面，该页面有个按钮，按钮上悬浮了一个透明的iframe，然后引诱你点击该按钮，当你点击该按钮时触发了iframe中的按钮。一个例子是：在一些诱惑下你点开了一个页面，然后在该页面的诱惑下你点击了一个按钮，结果你的淘宝购物车被恶意清空了。</p><span id="more"></span><h2 id="2-1-XSS"><a href="#2-1-XSS" class="headerlink" title="2.1. XSS"></a>2.1. XSS</h2><p>XSS的核心就是篡改用户访问的页面，攻击者是如何来实施篡改的呢？</p><h3 id="2-1-1-评论区XSS"><a href="#2-1-1-评论区XSS" class="headerlink" title="2.1.1. 评论区XSS"></a>2.1.1. 评论区XSS</h3><p>很多博客都有一些评论区，用户可以在其中输入一些文本，然后这些文本会展示在评论区。</p><p>部分评论区直接把用户的文本解析为HTML语言，</p><p>但如果用户输入了一些别有用心的文本，其中包含了一些可执行的脚本，然后被浏览器执行了，这就是XSS攻击。</p><h3 id="2-1-2-总结"><a href="#2-1-2-总结" class="headerlink" title="2.1.2. 总结"></a>2.1.2. 总结</h3><p>所以实际上XSS的是攻击者利用了系统的漏洞，导致系统没有按照开发者所期望的那样运行导致的。这种情况和SQL注入特别相似。</p><p>开发者所需要做的就是不要信任用户的输入，不要执行用户的输入内容即可，对于评论系统，可以只允许用户输入部分带限制的内容，借此来解决这个问题。</p><h2 id="2-2-CSRF"><a href="#2-2-CSRF" class="headerlink" title="2.2. CSRF"></a>2.2. CSRF</h2><p>CSRF的核心是跨站，很多开发者对跨站请求了解不多，在一些偶然的情况下，允许任何跨域请求来到自己的后台，这其实是非常危险的。</p><h3 id="2-2-1-CSRF例子"><a href="#2-2-1-CSRF例子" class="headerlink" title="2.2.1. CSRF例子"></a>2.2.1. CSRF例子</h3><p>开发者允许任何域的请求进行跨域，结果攻击者自己做了一个网站，在里面通过跨域调用，删除当前用户的所有数据，</p><p>这时候如果一个大冤种来到了这个网站，大冤种的数据就全部被删除了。</p><h3 id="2-2-2-总结"><a href="#2-2-2-总结" class="headerlink" title="2.2.2. 总结"></a>2.2.2. 总结</h3><p>不要允许不可信任的域发起跨域请求就能解决这个问题。当然有些请求不涉及到跨域，比如GET请求，这种就要求开发者不要把一些重要的敏感度高的请求用GET实现。</p><h2 id="2-3-ClickJacking"><a href="#2-3-ClickJacking" class="headerlink" title="2.3. ClickJacking"></a>2.3. ClickJacking</h2><p>  点击劫持，多发生于，iframe页面，这个和iframe有关，这里知道原理就行，就是一个透明的iframe在作妖，具体细节笔者不感兴趣。</p><h1 id="3…"><a href="#3…" class="headerlink" title="3…"></a>3…</h1><p>后面的内容一般般了，不写了</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/RCFBSC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&#39;/封面.png&#39;&gt;&lt;/img&gt;&lt;/p&gt;
&lt;h1 id=&quot;1-总揽&quot;&gt;&lt;a href=&quot;#1-总揽&quot; class=&quot;headerlink&quot; title=&quot;1. 总揽&quot;&gt;&lt;/a&gt;1. 总揽&lt;/h1&gt;&lt;p&gt;很老的一本书，但是依然有阅读价值。&lt;/p&gt;
&lt;p&gt;全书分为4个部分，其中比较重要的应该是第二章和第三章，第二章主要讲解客户端（浏览器）如何保障用户的安全，第三章主要讲解服务端如何保障用户安全。&lt;/p&gt;
&lt;h1 id=&quot;2-客户端安全&quot;&gt;&lt;a href=&quot;#2-客户端安全&quot; class=&quot;headerlink&quot; title=&quot;2. 客户端安全&quot;&gt;&lt;/a&gt;2. 客户端安全&lt;/h1&gt;&lt;p&gt;客户端这边容易受到攻击的主要有三个类型。&lt;/p&gt;
&lt;p&gt;第一个是XSS攻击，全名跨站脚本攻击，通常指的是黑客通过某些手段，篡改了用户访问的页面，导致页面上执行了一些恶意的脚本。一个简单的例子：在你登陆淘宝之后，黑客篡改了你的淘宝页面（篡改了用户访问的页面），自动帮你购买了一些奇怪的东西（执行了一些恶意的脚本）。&lt;/p&gt;
&lt;p&gt;第二个是CSRF攻击，全名跨站点请求伪造，通常指的是黑客通过某些手段，诱导用户访问某钓鱼页面，在该页面上完成了一些恶意的脚本。一个简单的例子： 在一些诱惑下你点开了一个页面（诱导用户访问某钓鱼页面），尽管你之后什么都没有做，但是你的淘宝购物车被恶意清空了（在该页面上完成了一些恶意的脚本）&lt;/p&gt;
&lt;p&gt;第三个是ClickJacking攻击，全名点击劫持攻击，通常指的是黑客通过某些手段，诱导用户访问某钓鱼页面，该页面有个按钮，按钮上悬浮了一个透明的iframe，然后引诱你点击该按钮，当你点击该按钮时触发了iframe中的按钮。一个例子是：在一些诱惑下你点开了一个页面，然后在该页面的诱惑下你点击了一个按钮，结果你的淘宝购物车被恶意清空了。&lt;/p&gt;</summary>
    
    
    
    <category term="计算机网络" scheme="http://fightinggg.github.io/apollo/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="读书,HTTP" scheme="http://fightinggg.github.io/apollo/tags/%E8%AF%BB%E4%B9%A6-HTTP/"/>
    
  </entry>
  
  <entry>
    <title>spring13-AspectJ</title>
    <link href="http://fightinggg.github.io/apollo/R9L6IO.html"/>
    <id>http://fightinggg.github.io/apollo/R9L6IO.html</id>
    <published>2022-03-31T01:52:00.000Z</published>
    <updated>2022-03-31T01:52:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R9L6IO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-AspectJ"><a href="#1-AspectJ" class="headerlink" title="1. AspectJ"></a>1. AspectJ</h1><h2 id="1-1-AspectJ介绍"><a href="#1-1-AspectJ介绍" class="headerlink" title="1.1. AspectJ介绍"></a>1.1. AspectJ介绍</h2><p>AspectJ官网<a href="%5BAspectJ%E5%AE%98%E7%BD%91%5D(https://www.eclipse.org/aspectj/downloads.php)">^4</a></p><p>AspectJ文档<a href="%5BAspectJ%E6%96%87%E6%A1%A3%5D(https://www.eclipse.org/aspectj/doc/released/progguide/index.html)">^1</a></p><h3 id="1-1-1-pointcuts"><a href="#1-1-1-pointcuts" class="headerlink" title="1.1.1. pointcuts"></a>1.1.1. pointcuts</h3><p>pointcuts指的是程序中的某些链接点（某些时机），例如<code>call(void Point.setX(int))</code>表示：调用类<code>Point</code>的<code>setX(int)</code>方法时</p><p>pointcuts可以使用与或非表达式（<code>||,&amp;&amp;,!</code>）连接，比如 <code>call(void Point.setX(int)) || call(void Point.setY(int))</code></p><p>pointcuts可以被定义为变量，如下面代码中的<code>move()</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pointcut move():</span><br><span class="line">    call(void FigureElement.setXY(int,int)) ||</span><br><span class="line">    call(void Point.setX(int))              ||</span><br><span class="line">    call(void Point.setY(int))              ||</span><br><span class="line">    call(void Line.setP1(Point))            ||</span><br><span class="line">    call(void Line.setP2(Point));</span><br></pre></td></tr></table></figure><p>当然pointcuts定义的时候还可以使用通配符，比如<code>call(void Figure.make*(..))</code>代表<code>Figure</code>的以make开头且返回值为void的方法（不关心参数）调用的时候。比如<code>call(public * Figure.* (..))</code>代表<code>Figure</code>的任何方法（不关心方法名，参数，返回值）调用的时候。</p><span id="more"></span><p>cflow是什么？</p><h3 id="1-1-2-advice"><a href="#1-1-2-advice" class="headerlink" title="1.1.2. advice"></a>1.1.2. advice</h3><p>pointcuts 指出了一些事件发生的时机，当这些事件真正发生的时候，我们需要advice表示该做些什么。advice如下，advice可以使用before代表在pointcuts发生以前做一些事情,如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">before(): move() &#123;</span><br><span class="line">    System.out.println(&quot;before move&quot;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用after代表在pointcuts发生以后做一些事情，如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">after(): move()&#123;</span><br><span class="line">    System.out.println(&quot;after move&quot;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>after还可以加上修饰符returning和throwing，分别表示在正常返回和在异常返回的情况，如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">after() returning: move()&#123;</span><br><span class="line">    System.out.println(&quot;after move&quot;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">after() throwing: move()&#123;</span><br><span class="line">    System.out.println(&quot;after move&quot;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>around表示环绕一个方法</p><h3 id="1-1-3-aspect"><a href="#1-1-3-aspect" class="headerlink" title="1.1.3. aspect"></a>1.1.3. aspect</h3><p>aspect是一个特别的类型，在其中可以定义pointcut和advice，如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">aspect MyAspect&#123;</span><br><span class="line"></span><br><span class="line">    pointcut move():</span><br><span class="line">        call(void FigureElement.setXY(int,int)) ||</span><br><span class="line">        call(void Point.setX(int))              ||</span><br><span class="line">        call(void Point.setY(int))              ||</span><br><span class="line">        call(void Line.setP1(Point))            ||</span><br><span class="line">        call(void Line.setP2(Point));</span><br><span class="line">    </span><br><span class="line">    after(): move()&#123;</span><br><span class="line">        System.out.println(&quot;after move&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当然aspect兼容java，你也可以定义各种方法，变量</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">aspect MyAspect&#123;</span><br><span class="line"></span><br><span class="line">    private Integer intValue;</span><br><span class="line">    </span><br><span class="line">    public Integer getInt()&#123;</span><br><span class="line">        return intValue;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    pointcut move():</span><br><span class="line">        call(void FigureElement.setXY(int,int)) ||</span><br><span class="line">        call(void Point.setX(int))              ||</span><br><span class="line">        call(void Point.setY(int))              ||</span><br><span class="line">        call(void Line.setP1(Point))            ||</span><br><span class="line">        call(void Line.setP2(Point));</span><br><span class="line">    </span><br><span class="line">    after(): move()&#123;</span><br><span class="line">        System.out.println(&quot;after move&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">   </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="1-2-在IntelliJ-IDEA上安装AspectJ"><a href="#1-2-在IntelliJ-IDEA上安装AspectJ" class="headerlink" title="1.2. 在IntelliJ IDEA上安装AspectJ"></a>1.2. 在IntelliJ IDEA上安装AspectJ</h2><h3 id="1-2-1-下载并安装AspectJ"><a href="#1-2-1-下载并安装AspectJ" class="headerlink" title="1.2.1. 下载并安装AspectJ"></a>1.2.1. 下载并安装AspectJ</h3><p>在官网<a href="%5BAspectJ%E5%AE%98%E7%BD%91%5D(https://www.eclipse.org/aspectj/downloads.php)">^4</a>下载最新版本的jar包，笔者这里的最新版本是<a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.9.6.jar">aspectj-1.9.6.jar</a> ，下载以后双击运行进行安装。</p><p><img src='/AspectJ_Install.png'>AspectJ安装</img></p><h3 id="1-2-2-安装插件"><a href="#1-2-2-安装插件" class="headerlink" title="1.2.2. 安装插件"></a>1.2.2. 安装插件</h3><p>安装AspectJ插件<a href="%5BAspectJ%E6%8F%92%E4%BB%B6%5D(https://plugins.jetbrains.com/plugin/4679-aspectj)">^2</a>即可</p><h3 id="1-2-3-启用AJC编译器"><a href="#1-2-3-启用AJC编译器" class="headerlink" title="1.2.3. 启用AJC编译器"></a>1.2.3. 启用AJC编译器</h3><p>在IDEA的设置中选择AJC编译器，并指定1.2.1中安装的ajctool的位置。</p><p><img src='/IDEA_Enable_AJC.png'>IDEA_Enable_AJC</img></p><h3 id="1-2-4-给项目添加AJC依赖"><a href="#1-2-4-给项目添加AJC依赖" class="headerlink" title="1.2.4. 给项目添加AJC依赖"></a>1.2.4. 给项目添加AJC依赖</h3><p>把1.2.1中安装的lib包放到项目的依赖中。</p><p><img src='/Add_AJC_Lib.png'>Add_AJC_Lib.png</img></p><h2 id="1-3-Hello-World"><a href="#1-3-Hello-World" class="headerlink" title="1.3. Hello World"></a>1.3. Hello World</h2><p>下面是一份Helloworld的代码,源程序只输出+号，但是被aspect所拦截，最终输出了<code>Hello + World!</code></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span>&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">HelloWorld</span>().hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aspect HelloWorldAspect &#123;</span><br><span class="line">    before(): call(<span class="keyword">public</span> * HelloWorld.*(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; Hello &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    after(): call(<span class="keyword">public</span> * HelloWorld.*(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; World! &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="1-4-Pointcuts表达式"><a href="#1-4-Pointcuts表达式" class="headerlink" title="1.4. Pointcuts表达式"></a>1.4. Pointcuts表达式</h2><ul><li><p>执行一个特定的方法的时候</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">execution(<span class="keyword">void</span> Point.setX(<span class="type">int</span>))</span><br></pre></td></tr></table></figure><p>例如下面的代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span>&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">HelloWorld</span>().hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aspect HelloWorldAspect &#123;</span><br><span class="line">    before(): execution(<span class="keyword">public</span> * HelloWorld.hello(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; Hello &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    after(): execution(<span class="keyword">public</span> * HelloWorld.hello(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; World! &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>被编译为了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    HelloWorld() &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            HelloWorldAspect.aspectOf().ajc$before$HelloWorldAspect$<span class="number">1</span>$<span class="number">75869607</span>();</span><br><span class="line">            System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Throwable var2) &#123;</span><br><span class="line">            HelloWorldAspect.aspectOf().ajc$after$HelloWorldAspect$<span class="number">2</span>$<span class="number">75869607</span>();</span><br><span class="line">            <span class="keyword">throw</span> var2;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        HelloWorldAspect.aspectOf().ajc$after$HelloWorldAspect$<span class="number">2</span>$<span class="number">75869607</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        (<span class="keyword">new</span> <span class="title class_">HelloWorld</span>()).hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>代码被直接写入到了hello方法执行的地方。</p></li><li><p>调用一个特定方法的时候</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">call(<span class="keyword">void</span> Point.setX(<span class="type">int</span>))</span><br></pre></td></tr></table></figure><p>例如下面的代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span>&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">HelloWorld</span>().hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aspect HelloWorldAspect &#123;</span><br><span class="line">    before(): call(<span class="keyword">public</span> * HelloWorld.*(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; Hello &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    after(): call(<span class="keyword">public</span> * HelloWorld.*(..))&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; World! &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>被编译为了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    HelloWorld() &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span> &#123;</span><br><span class="line">        System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">HelloWorld</span> <span class="variable">var10000</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HelloWorld</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            HelloWorldAspect.aspectOf().ajc$before$HelloWorldAspect$<span class="number">1</span>$cdc2ab29();</span><br><span class="line">            var10000.hello();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Throwable var2) &#123;</span><br><span class="line">            HelloWorldAspect.aspectOf().ajc$after$HelloWorldAspect$<span class="number">2</span>$cdc2ab29();</span><br><span class="line">            <span class="keyword">throw</span> var2;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        HelloWorldAspect.aspectOf().ajc$after$HelloWorldAspect$<span class="number">2</span>$cdc2ab29();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>可以看到，是在调用hello方法的前后增加了一些内容。</p></li><li><p>处理异常的时候</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">handler(ArrayOutOfBoundsException)</span><br></pre></td></tr></table></figure><p>如下面的代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.out.print(e.getMessage());</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">HelloWorld</span>().hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aspect HelloWorldAspect &#123;</span><br><span class="line">    before(): handler(Exception)&#123;</span><br><span class="line">        System.out.print(<span class="string">&quot; Hello &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>被编译为了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    HelloWorld() &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            System.out.print(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var3) &#123;</span><br><span class="line">            HelloWorldAspect.aspectOf().ajc$before$HelloWorldAspect$<span class="number">1</span>$ae9a1a78();</span><br><span class="line">            System.out.print(var3.getMessage());</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        (<span class="keyword">new</span> <span class="title class_">HelloWorld</span>()).hello();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>可以发现就是在catch该exception后的第一步操作</p><p>当然AspectJ还有很多很多可以定义point cut的关键词，笔者这里就不一一列举了，相见文档[^5]即可</p></li></ul><h2 id="1-5-总结"><a href="#1-5-总结" class="headerlink" title="1.5. 总结"></a>1.5. 总结</h2><p>所以AspectJ其实是对Java语法的拓展，通过特定的编译器，给Java带来了更强大的能力。</p><h1 id="2-Spring-对-AspectJ的支持"><a href="#2-Spring-对-AspectJ的支持" class="headerlink" title="2. Spring 对 AspectJ的支持"></a>2. Spring 对 AspectJ的支持</h1><p>官方文档<a href="%5BSpring%E5%AF%B9AspectJ%E7%9A%84%E6%94%AF%E6%8C%81%5D(https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-ataspectj)">^3</a></p><p>Spring支持AspectJ的一个子集,所支持的pointcut如下</p><blockquote><p>Spring AOP supports the following AspectJ pointcut designators (PCD) for use in pointcut expressions:</p><ul><li><code>execution</code>: For matching method execution join points. This is the primary pointcut designator to use when working with Spring AOP.</li><li><code>within</code>: Limits matching to join points within certain types (the execution of a method declared within a matching type when using Spring AOP).</li><li><code>this</code>: Limits matching to join points (the execution of methods when using Spring AOP) where the bean reference (Spring AOP proxy) is an instance of the given type.</li><li><code>target</code>: Limits matching to join points (the execution of methods when using Spring AOP) where the target object (application object being proxied) is an instance of the given type.</li><li><code>args</code>: Limits matching to join points (the execution of methods when using Spring AOP) where the arguments are instances of the given types.</li><li><code>@target</code>: Limits matching to join points (the execution of methods when using Spring AOP) where the class of the executing object has an annotation of the given type.</li><li><code>@args</code>: Limits matching to join points (the execution of methods when using Spring AOP) where the runtime type of the actual arguments passed have annotations of the given types.</li><li><code>@within</code>: Limits matching to join points within types that have the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP).</li><li><code>@annotation</code>: Limits matching to join points where the subject of the join point (the method being run in Spring AOP) has the given annotation.</li></ul></blockquote><p>spring中的aspectJ，并非使用拓展java语法，而是使用注解来拓展，spring中的aspectj也不是使用的aspectj编译器，而是使用的spring aop来完成代理。但spring也支持通过开关使用原生aspectj[^6]。</p><p>aspect的类型用注解@Aspect表示</p><p>pointcut字段用@Pointcut表示</p><p>advice分别用@Before、@After、@Around来表示</p><h1 id="3-引用"><a href="#3-引用" class="headerlink" title="3. 引用"></a>3. 引用</h1><p>[^5]: <a href="https://www.eclipse.org/aspectj/doc/released/progguide/quick.html#quick-pointcuts">Aspect pointcut 文档</a><br>[^6]: <a href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-using-aspectj">Spring中使用AspectJ编译器</a></p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R9L6IO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;1-AspectJ&quot;&gt;&lt;a href=&quot;#1-AspectJ&quot; class=&quot;headerlink&quot; title=&quot;1. AspectJ&quot;&gt;&lt;/a&gt;1. AspectJ&lt;/h1&gt;&lt;h2 id=&quot;1-1-AspectJ介绍&quot;&gt;&lt;a href=&quot;#1-1-AspectJ介绍&quot; class=&quot;headerlink&quot; title=&quot;1.1. AspectJ介绍&quot;&gt;&lt;/a&gt;1.1. AspectJ介绍&lt;/h2&gt;&lt;p&gt;AspectJ官网&lt;a href=&quot;%5BAspectJ%E5%AE%98%E7%BD%91%5D(https://www.eclipse.org/aspectj/downloads.php)&quot;&gt;^4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;AspectJ文档&lt;a href=&quot;%5BAspectJ%E6%96%87%E6%A1%A3%5D(https://www.eclipse.org/aspectj/doc/released/progguide/index.html)&quot;&gt;^1&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-1-1-pointcuts&quot;&gt;&lt;a href=&quot;#1-1-1-pointcuts&quot; class=&quot;headerlink&quot; title=&quot;1.1.1. pointcuts&quot;&gt;&lt;/a&gt;1.1.1. pointcuts&lt;/h3&gt;&lt;p&gt;pointcuts指的是程序中的某些链接点（某些时机），例如&lt;code&gt;call(void Point.setX(int))&lt;/code&gt;表示：调用类&lt;code&gt;Point&lt;/code&gt;的&lt;code&gt;setX(int)&lt;/code&gt;方法时&lt;/p&gt;
&lt;p&gt;pointcuts可以使用与或非表达式（&lt;code&gt;||,&amp;amp;&amp;amp;,!&lt;/code&gt;）连接，比如 &lt;code&gt;call(void Point.setX(int)) || call(void Point.setY(int))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;pointcuts可以被定义为变量，如下面代码中的&lt;code&gt;move()&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;pointcut move():&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    call(void FigureElement.setXY(int,int)) ||&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    call(void Point.setX(int))              ||&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    call(void Point.setY(int))              ||&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    call(void Line.setP1(Point))            ||&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    call(void Line.setP2(Point));&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;当然pointcuts定义的时候还可以使用通配符，比如&lt;code&gt;call(void Figure.make*(..))&lt;/code&gt;代表&lt;code&gt;Figure&lt;/code&gt;的以make开头且返回值为void的方法（不关心参数）调用的时候。比如&lt;code&gt;call(public * Figure.* (..))&lt;/code&gt;代表&lt;code&gt;Figure&lt;/code&gt;的任何方法（不关心方法名，参数，返回值）调用的时候。&lt;/p&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Java" scheme="http://fightinggg.github.io/apollo/categories/Language/Java/"/>
    
    <category term="Spring" scheme="http://fightinggg.github.io/apollo/categories/Language/Java/Spring/"/>
    
    
    <category term="读书" scheme="http://fightinggg.github.io/apollo/tags/%E8%AF%BB%E4%B9%A6/"/>
    
    <category term="AspectJ" scheme="http://fightinggg.github.io/apollo/tags/AspectJ/"/>
    
  </entry>
  
  <entry>
    <title>C++引用的秘密</title>
    <link href="http://fightinggg.github.io/apollo/R7DSQO.html"/>
    <id>http://fightinggg.github.io/apollo/R7DSQO.html</id>
    <published>2022-02-16T05:04:00.000Z</published>
    <updated>2022-02-16T05:04:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R7DSQO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="0-一个错误的概念"><a href="#0-一个错误的概念" class="headerlink" title="0. 一个错误的概念"></a>0. 一个错误的概念</h1><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> a = <span class="number">111</span>;</span><br><span class="line">    <span class="type">int</span> &amp;b = a;</span><br><span class="line">    b = <span class="number">222</span>;</span><br><span class="line">    std::cout&lt;&lt;&amp;a&lt;&lt;&amp;b;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>我们能看到这里输出的两个值相同。</p><ul><li><p>错误1:</p><p>很多人认为这里的b就是a，a就是b，a和b的地址是一样的，如下图。</p><p><img src='/image-2022-02-16-13.39.00.000-引用.svg'></img></p><p>但是笔者要说，其实这个概念是有问题的，a是a，b是b，a和b并不是同一个地址。</p></li></ul><span id="more"></span><h1 id="1-从STD的tie类型说起"><a href="#1-从STD的tie类型说起" class="headerlink" title="1. 从STD的tie类型说起"></a>1. 从STD的tie类型说起</h1><p>笔者在阅读ClickHouse源码的时候发现了有趣的现象，该源码中有如下代码，我们注意第7-9行，可以发现这使用了STD的tie，该类型让C++实现了一次性返回两个值的效果。下面的executeQueryImpl函数返回了两个值，分别写入到了ast和streams中。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">BlockIO <span class="title">executeQuery</span><span class="params">(</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="type">const</span> String &amp; query,</span></span></span><br><span class="line"><span class="params"><span class="function">    ContextMutablePtr context,</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="type">bool</span> internal,</span></span></span><br><span class="line"><span class="params"><span class="function">    QueryProcessingStage::Enum stage)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ASTPtr ast;</span><br><span class="line">    BlockIO streams;</span><br><span class="line">    std::<span class="built_in">tie</span>(ast, streams) = <span class="built_in">executeQueryImpl</span>(query.<span class="built_in">data</span>(), query.<span class="built_in">data</span>() + query.<span class="built_in">size</span>(), context, internal, stage, <span class="literal">nullptr</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="type">const</span> <span class="keyword">auto</span> * ast_query_with_output = <span class="built_in">dynamic_cast</span>&lt;<span class="type">const</span> ASTQueryWithOutput *&gt;(ast.<span class="built_in">get</span>()))</span><br><span class="line">    &#123;</span><br><span class="line">        String format_name = ast_query_with_output-&gt;format</span><br><span class="line">                ? <span class="built_in">getIdentifierName</span>(ast_query_with_output-&gt;format)</span><br><span class="line">                : context-&gt;<span class="built_in">getDefaultFormat</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (format_name == <span class="string">&quot;Null&quot;</span>)</span><br><span class="line">            streams.null_format = <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> streams;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="2-如何实现的"><a href="#2-如何实现的" class="headerlink" title="2. 如何实现的"></a>2. 如何实现的</h1><p>实际上C++中可以在结构体中指定一个引用字段，通过构造函数将外界的变量传递进结构体，再通过该结构体的拷贝构造函数实现赋值。</p><h1 id="3-结构体中如何储存引用"><a href="#3-结构体中如何储存引用" class="headerlink" title="3. 结构体中如何储存引用"></a>3. 结构体中如何储存引用</h1><p>结构体如何储存其他值的引用？按照前文的说法，如果引用的地址是一样的，结构体如何储存其他值的引用呢，如下图。</p><p><img src='/image-2022-02-16-13.47.00.000-如何引用.svg'></img></p><p>实际上唯一的办法只能使用指针，让变量b指向变量a，当然这里的变量b的类型就是指针类型了，这么说肯定很多人不能接受，我定义的引用类型，怎么就成了指针了。</p><h1 id="4-揭秘结构体中的引用"><a href="#4-揭秘结构体中的引用" class="headerlink" title="4. 揭秘结构体中的引用"></a>4. 揭秘结构体中的引用</h1><p>先来看下面的代码,下面这两个函数，写法不一样，但是被GCC编译器编译以后的结果是一模一样的。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> <span class="title class_">Ref</span> &#123;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="title">Ref</span><span class="params">(<span class="type">int</span> &amp;ref)</span> : ref(ref) &#123;</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> &amp;ref;</span><br><span class="line">    <span class="type">int</span> value;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Point</span> &#123;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="title">Point</span><span class="params">(<span class="type">int</span> *ref)</span> : ref(ref) &#123;</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> *ref;</span><br><span class="line">    <span class="type">int</span> value;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">ref</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> x = <span class="number">222</span>;</span><br><span class="line">    <span class="function">Ref <span class="title">a</span><span class="params">(x)</span></span>;</span><br><span class="line">    a.ref = <span class="number">333</span>;</span><br><span class="line">    a.value = <span class="number">444</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">point</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> x = <span class="number">222</span>;</span><br><span class="line">    <span class="function">Point <span class="title">a</span><span class="params">(&amp;x)</span></span>;</span><br><span class="line">    *a.ref = <span class="number">333</span>;</span><br><span class="line">    a.value = <span class="number">444</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>读者可以通过指令<code> gcc -S -O0 main.cpp</code>来编译该文件。可以看到两个函数都被编译结果为下面的内容，注意14-15行，这里就是ref赋值的地方，我们很容易发现，第一步是把rbp栈寄存器指向的地址偏移24的位置的值放入了寄存器rax中，第二步是将数据333写入rax寄存器所指向的地址。所以引用不过是指针的另一种写法而已。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">__Z5pointv:                             ## @_Z5pointv</span><br><span class="line">.cfi_startproc</span><br><span class="line">## %bb.0:</span><br><span class="line">pushq%rbp</span><br><span class="line">.cfi_def_cfa_offset 16</span><br><span class="line">.cfi_offset %rbp, -16</span><br><span class="line">movq%rsp, %rbp</span><br><span class="line">.cfi_def_cfa_register %rbp</span><br><span class="line">subq$32, %rsp</span><br><span class="line">movl$222, -4(%rbp)</span><br><span class="line">leaq-24(%rbp), %rdi</span><br><span class="line">leaq-4(%rbp), %rsi</span><br><span class="line">callq__ZN5PointC1EPi</span><br><span class="line">movq-24(%rbp), %rax</span><br><span class="line">movl$333, (%rax)                    ## imm = 0x14D</span><br><span class="line">movl$444, -16(%rbp)                 ## imm = 0x1BC</span><br><span class="line">addq$32, %rsp</span><br><span class="line">popq%rbp</span><br><span class="line">retq</span><br><span class="line">.cfi_endproc</span><br><span class="line">                                        ## -- End function</span><br><span class="line">.globl__ZN5PointC1EPi                 ## -- Begin function _ZN5PointC1EPi</span><br><span class="line">.weak_def_can_be_hidden__ZN5PointC1EPi</span><br><span class="line">.p2align4, 0x90</span><br></pre></td></tr></table></figure><h1 id="5-普通引用是如何实现的"><a href="#5-普通引用是如何实现的" class="headerlink" title="5. 普通引用是如何实现的"></a>5. 普通引用是如何实现的</h1><p>我们使用<code>gcc -S -O0 main.cpp</code>编译下面的代码</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">check</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> a = <span class="number">111</span>;</span><br><span class="line">    <span class="type">int</span> &amp;b = a;</span><br><span class="line">    b = <span class="number">222</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">check2</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> a = <span class="number">111</span>;</span><br><span class="line">    <span class="type">int</span> *b = &amp;a;</span><br><span class="line">    *b = <span class="number">222</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>不难发现两个函数都被编译成了相同的代码,于是乎，现在应该不会再有人认为这里的b就是a，a就是b，a和b的地址是一样的了吧</p><p>很明显b就是指针啊，他怎么能是和a的地址相同呢？</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">__Z5checkv:                             ## @_Z5checkv</span><br><span class="line">.cfi_startproc</span><br><span class="line">## %bb.0:</span><br><span class="line">pushq%rbp</span><br><span class="line">.cfi_def_cfa_offset 16</span><br><span class="line">.cfi_offset %rbp, -16</span><br><span class="line">movq%rsp, %rbp</span><br><span class="line">.cfi_def_cfa_register %rbp</span><br><span class="line">movl$111, -4(%rbp)</span><br><span class="line">leaq-4(%rbp), %rax</span><br><span class="line">movq%rax, -16(%rbp)</span><br><span class="line">movq-16(%rbp), %rax</span><br><span class="line">movl$222, (%rax)</span><br><span class="line">popq%rbp</span><br><span class="line">retq</span><br><span class="line">.cfi_endproc</span><br><span class="line">                                        ## -- End function</span><br><span class="line">.globl__Z6check2v                     ## -- Begin function _Z6check2v</span><br><span class="line">.p2align4, 0x90</span><br></pre></td></tr></table></figure><p>正确的引用图应该是下面这张</p><p><img src='/image-2022-02-16-14.09.00.000-正确的引用.svg'></img></p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R7DSQO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;0-一个错误的概念&quot;&gt;&lt;a href=&quot;#0-一个错误的概念&quot; class=&quot;headerlink&quot; title=&quot;0. 一个错误的概念&quot;&gt;&lt;/a&gt;0. 一个错误的概念&lt;/h1&gt;&lt;figure class=&quot;highlight c++&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;type&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;()&lt;/span&gt; &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;type&quot;&gt;int&lt;/span&gt; a = &lt;span class=&quot;number&quot;&gt;111&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;type&quot;&gt;int&lt;/span&gt; &amp;amp;b = a;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    b = &lt;span class=&quot;number&quot;&gt;222&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    std::cout&amp;lt;&amp;lt;&amp;amp;a&amp;lt;&amp;lt;&amp;amp;b;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;我们能看到这里输出的两个值相同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;错误1:&lt;/p&gt;
&lt;p&gt;很多人认为这里的b就是a，a就是b，a和b的地址是一样的，如下图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#39;/image-2022-02-16-13.39.00.000-引用.svg&#39;&gt;&lt;/img&gt;&lt;/p&gt;
&lt;p&gt;但是笔者要说，其实这个概念是有问题的，a是a，b是b，a和b并不是同一个地址。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="C++" scheme="http://fightinggg.github.io/apollo/categories/Language/C/"/>
    
    
    <category term="结构体中的引用" scheme="http://fightinggg.github.io/apollo/tags/%E7%BB%93%E6%9E%84%E4%BD%93%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>Springfox使用</title>
    <link href="http://fightinggg.github.io/apollo/R5MNS0.html"/>
    <id>http://fightinggg.github.io/apollo/R5MNS0.html</id>
    <published>2022-01-13T02:48:00.000Z</published>
    <updated>2022-01-13T02:48:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R5MNS0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-对List不能很好的支持"><a href="#1-对List不能很好的支持" class="headerlink" title="1. 对List不能很好的支持"></a>1. 对List不能很好的支持</h1><h2 id="1-1-核心代码"><a href="#1-1-核心代码" class="headerlink" title="1.1. 核心代码"></a>1.1. 核心代码</h2><p>代码中写的是数组</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 用户</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@ApiModelProperty(value = &quot;用户&quot;,example = &quot;hellowang&quot;)</span></span><br><span class="line"><span class="keyword">private</span> List&lt;String&gt; user;</span><br></pre></td></tr></table></figure><h2 id="1-2-问题详情"><a href="#1-2-问题详情" class="headerlink" title="1.2. 问题详情"></a>1.2. 问题详情</h2><p>在swagger页面展示的例子是字符串</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;user&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hellowang&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="1-3-问题讨论"><a href="#1-3-问题讨论" class="headerlink" title="1.3. 问题讨论"></a>1.3. 问题讨论</h2><p> <a href="https://stackoverflow.com/questions/40989038/swagger-apimodelproperty-example-value-for-liststring-property">Stackoverflow</a></p><p> <a href="https://github.com/swagger-api/swagger-core/issues/1855">Github</a></p><h2 id="1-4-解决方案"><a href="#1-4-解决方案" class="headerlink" title="1.4. 解决方案"></a>1.4. 解决方案</h2><p><a href="https://github.com/aaitmouloud/springfox-collection-example-plugin">springfox-collection-example-plugin</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R5MNS0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
  </summary>
      
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Java" scheme="http://fightinggg.github.io/apollo/categories/Language/Java/"/>
    
    
    <category term="SpringFox使用" scheme="http://fightinggg.github.io/apollo/tags/SpringFox%E4%BD%BF%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>Go入门-常见陷阱</title>
    <link href="http://fightinggg.github.io/apollo/R1Z340.html"/>
    <id>http://fightinggg.github.io/apollo/R1Z340.html</id>
    <published>2021-11-03T01:36:00.000Z</published>
    <updated>2021-11-03T01:36:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R1Z340.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-Go-的指针"><a href="#1-Go-的指针" class="headerlink" title="1. Go 的指针"></a>1. Go 的指针</h1><p>Go的指针和C的指针很类似，这也是Go被归类于C类语言的原因，Go的指针不支持偏移运算，即不能向C一样让指针+1，-1。</p><h2 id="1-1-正常使用"><a href="#1-1-正常使用" class="headerlink" title="1.1. 正常使用"></a>1.1. 正常使用</h2><p>先来看第一个，符号<code>&amp;</code>即可取到对象的地址。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sample1</span><span class="params">()</span></span> &#123;</span><br><span class="line">arr1 := []<span class="type">int</span>&#123;<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>&#125;</span><br><span class="line"></span><br><span class="line">fmt.Println(arr1)</span><br><span class="line"></span><br><span class="line">fmt.Println(&amp;arr1)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[0 1 2 3 4 5 6 7 8 9]</span><br><span class="line">&amp;[0 1 2 3 4 5 6 7 8 9]</span><br></pre></td></tr></table></figure><h2 id="1-2-for循环问题"><a href="#1-2-for循环问题" class="headerlink" title="1.2. for循环问题"></a>1.2. for循环问题</h2><p>下面的输出全是9，因为for循环的value是共用一个地址的。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sample2</span><span class="params">()</span></span> &#123;</span><br><span class="line">arr1 := []<span class="type">int</span>&#123;<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>&#125;</span><br><span class="line"></span><br><span class="line">mp := <span class="keyword">map</span>[<span class="type">int</span>]*<span class="type">int</span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i, value := <span class="keyword">range</span> arr1 &#123;</span><br><span class="line">mp[i] = &amp;value</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i, _ := <span class="keyword">range</span> arr1 &#123;</span><br><span class="line">fmt.Println(*mp[i])</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="2-Go-的-new-和-make"><a href="#2-Go-的-new-和-make" class="headerlink" title="2. Go 的 new 和 make"></a>2. Go 的 new 和 make</h1><p><a href="https://www.jianshu.com/p/0edd447d9efb">参考</a></p><p>new 只分配内存，make不仅分配内存还初始化对象。</p><p>slice、chan、map一般可以使用make初始化。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R1Z340.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
  </summary>
      
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
  </entry>
  
  <entry>
    <title>Go进阶-Module</title>
    <link href="http://fightinggg.github.io/apollo/R1D0ZO.html"/>
    <id>http://fightinggg.github.io/apollo/R1D0ZO.html</id>
    <published>2021-10-22T03:43:00.000Z</published>
    <updated>2021-10-22T03:43:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R1D0ZO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-Module使用"><a href="#1-Module使用" class="headerlink" title="1. Module使用"></a>1. Module使用</h1><p>在文章<a href="https://fightinggg.github.io/R0T00O.html">Go入门-Go语言从入门到进阶实战</a>中，我们介绍了GO项目的结构，但是没有解释其中的一个文件<code>go.mod</code>, 这其实是模块的意思。在go.mod中可以引入go的依赖。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">require (</span><br><span class="line">github.com/golang/mock v1.4.4</span><br><span class="line">github.com/golang/protobuf v1.4.3</span><br><span class="line">github.com/patrickmn/go-cache v2.1.0+incompatible</span><br><span class="line">github.com/stretchr/testify v1.6.1</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>这里简单介绍一下，注意到这里是库名加版本号。当我们引入了依赖管理以后，就可以在自己的项目中直接import三方包了。</p><h1 id="2-Module-的历史"><a href="#2-Module-的历史" class="headerlink" title="2. Module 的历史"></a>2. Module 的历史</h1><blockquote><p>Go modules 是 Go 语言的依赖解决方案，发布于 Go1.11，Go1.14 上已经明确建议生产上使用了</p></blockquote><blockquote><ul><li><p>一开始go发布的时候是没有包管理的</p></li><li><p>go get命令会根据路径，把相应的模块获取并保存在<code>$GOPATH/src</code></p></li><li><p>也没有版本的概念，<code>master</code> 就代表稳定的版本</p></li></ul><p>原文： <a href="https://zhuanlan.zhihu.com/p/374372749">😊</a></p></blockquote><p>在Go Module出现以前,我们使用Go Get获取库，库会直接下载到GOPATH目录的src文件夹下，很好用但是有一个问题-版本兼容问题。</p><p>当两个库依赖分别同一个库的v1和v2版本的时候，如果v1和v2不兼容，那么会导致这两个库无法同时使用。</p><p>后来官方采用了vgo方案来解决GO的依赖管理问题，也就是现在的Go modules。</p><span id="more"></span><h1 id="3-go-mod-与-go-sum"><a href="#3-go-mod-与-go-sum" class="headerlink" title="3. go.mod 与 go.sum"></a>3. go.mod 与 go.sum</h1><p>go.mod控制依赖，go.sum校验依赖的完整性与正确性。</p><h1 id="4-Go111MODULE参数"><a href="#4-Go111MODULE参数" class="headerlink" title="4. Go111MODULE参数"></a>4. Go111MODULE参数</h1><blockquote><ul><li><p><code>GO111MODULE=off</code> 无模块支持，go 会从 GOPATH 和 vendor 文件夹寻找包。</p></li><li><p><code>GO111MODULE=on</code> 模块支持，go 会忽略 GOPATH 和 vendor 文件夹，只根据 <code>go.mod</code> 下载依赖。</p><p>原文：<a href="https://blog.csdn.net/qq_34276797/article/details/107148311?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.no_search_link">😊</a></p></li></ul></blockquote><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://www.jianshu.com/p/07ffc5827b26">Golang Package 与 Module 简介</a></p><p><a href="https://www.infoq.cn/article/xyjhjja87y7pvu1iwhz3">Go Modules 包管理工具的理解与使用</a></p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R1D0ZO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;1-Module使用&quot;&gt;&lt;a href=&quot;#1-Module使用&quot; class=&quot;headerlink&quot; title=&quot;1. Module使用&quot;&gt;&lt;/a&gt;1. Module使用&lt;/h1&gt;&lt;p&gt;在文章&lt;a href=&quot;https://fightinggg.github.io/R0T00O.html&quot;&gt;Go入门-Go语言从入门到进阶实战&lt;/a&gt;中，我们介绍了GO项目的结构，但是没有解释其中的一个文件&lt;code&gt;go.mod&lt;/code&gt;, 这其实是模块的意思。在go.mod中可以引入go的依赖。&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;require (&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	github.com/golang/mock v1.4.4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	github.com/golang/protobuf v1.4.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	github.com/patrickmn/go-cache v2.1.0+incompatible&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	github.com/stretchr/testify v1.6.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;这里简单介绍一下，注意到这里是库名加版本号。当我们引入了依赖管理以后，就可以在自己的项目中直接import三方包了。&lt;/p&gt;
&lt;h1 id=&quot;2-Module-的历史&quot;&gt;&lt;a href=&quot;#2-Module-的历史&quot; class=&quot;headerlink&quot; title=&quot;2. Module 的历史&quot;&gt;&lt;/a&gt;2. Module 的历史&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;Go modules 是 Go 语言的依赖解决方案，发布于 Go1.11，Go1.14 上已经明确建议生产上使用了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;一开始go发布的时候是没有包管理的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;go get命令会根据路径，把相应的模块获取并保存在&lt;code&gt;$GOPATH/src&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;也没有版本的概念，&lt;code&gt;master&lt;/code&gt; 就代表稳定的版本&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原文： &lt;a href=&quot;https://zhuanlan.zhihu.com/p/374372749&quot;&gt;😊&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在Go Module出现以前,我们使用Go Get获取库，库会直接下载到GOPATH目录的src文件夹下，很好用但是有一个问题-版本兼容问题。&lt;/p&gt;
&lt;p&gt;当两个库依赖分别同一个库的v1和v2版本的时候，如果v1和v2不兼容，那么会导致这两个库无法同时使用。&lt;/p&gt;
&lt;p&gt;后来官方采用了vgo方案来解决GO的依赖管理问题，也就是现在的Go modules。&lt;/p&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
  </entry>
  
  <entry>
    <title>Go入门-Effective-Go</title>
    <link href="http://fightinggg.github.io/apollo/R17ULO.html"/>
    <id>http://fightinggg.github.io/apollo/R17ULO.html</id>
    <published>2021-10-19T08:37:00.000Z</published>
    <updated>2021-10-19T08:37:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R17ULO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-Effective-GO"><a href="#1-Effective-GO" class="headerlink" title="1. Effective GO"></a>1. Effective GO</h1><p><a href="https://github.com/bingohuang/effective-go-zh-en">https://github.com/bingohuang/effective-go-zh-en</a></p><h1 id="2-格式化"><a href="#2-格式化" class="headerlink" title="2. 格式化"></a>2. 格式化</h1><p>在最开始学习GO的时候，写了几篇Blog，发现代码里面的对齐都是TAB，这让我很困惑，知道现在才知道，GO语言，默认使用TAB进行对齐。</p><p>当然GO还有自己的空格规则<code>x&lt;&lt;8 + y&lt;&lt;16</code>,向这份代码，我们根据空格就能知道计算的优先级了。</p><h1 id="3-注释"><a href="#3-注释" class="headerlink" title="3. 注释"></a>3. 注释</h1><h2 id="3-1-包注释"><a href="#3-1-包注释" class="headerlink" title="3.1. 包注释"></a>3.1. 包注释</h2><p>Go语言要求package语句前加上注释，来介绍整个包，如果package包含多个文件，则只需要在其中一个文件中标注即可。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">Package regexp implements a simple library for regular expressions.</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">The syntax of the regular expressions accepted is:</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">regexp:</span></span><br><span class="line"><span class="comment">concatenation &#123; &#x27;|&#x27; concatenation &#125;</span></span><br><span class="line"><span class="comment">concatenation:</span></span><br><span class="line"><span class="comment">&#123; closure &#125;</span></span><br><span class="line"><span class="comment">closure:</span></span><br><span class="line"><span class="comment">term [ &#x27;*&#x27; | &#x27;+&#x27; | &#x27;?&#x27; ]</span></span><br><span class="line"><span class="comment">term:</span></span><br><span class="line"><span class="comment">&#x27;^&#x27;</span></span><br><span class="line"><span class="comment">&#x27;$&#x27;</span></span><br><span class="line"><span class="comment">&#x27;.&#x27;</span></span><br><span class="line"><span class="comment">character</span></span><br><span class="line"><span class="comment">&#x27;[&#x27; [ &#x27;^&#x27; ] character-ranges &#x27;]&#x27;</span></span><br><span class="line"><span class="comment">&#x27;(&#x27; regexp &#x27;)&#x27;</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">package</span> regexp</span><br></pre></td></tr></table></figure><span id="more"></span><p>需要注意的是，注释不是JavaDoc模式的,下面这种就不对了</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> *  main</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">package</span> main</span><br></pre></td></tr></table></figure><h2 id="3-2-导出注释"><a href="#3-2-导出注释" class="headerlink" title="3.2. 导出注释"></a>3.2. 导出注释</h2><p>在程序中，每个可导出（首字母大写）的名称都应该有文档注释。使用行注释的形式，行注释的第一行要以被导出的内容开头，并总结整个注释，如下，第一行以Compile开头</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Compile parses a regular expression and returns, if successful, a Regexp</span></span><br><span class="line"><span class="comment">// object that can be used to match against text.</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Compile</span><span class="params">(str <span class="type">string</span>)</span></span> (regexp *Regexp, err <span class="type">error</span>) &#123;</span><br></pre></td></tr></table></figure><h1 id="4-命名"><a href="#4-命名" class="headerlink" title="4. 命名"></a>4. 命名</h1><p>Go语言默认使用驼峰命名，请不要使用下划线</p><h2 id="4-1-包"><a href="#4-1-包" class="headerlink" title="4.1. 包"></a>4.1. 包</h2><p>包名用小写，不要带下划线，</p><p>不要使用<code>import .</code>的语句，很容易冲突</p><h2 id="4-2-字段Getter-Setter"><a href="#4-2-字段Getter-Setter" class="headerlink" title="4.2. 字段Getter Setter"></a>4.2. 字段Getter Setter</h2><p>Getter方法不需要<code>Get</code>这个前缀,如下</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">obj.Owner()</span><br><span class="line">obj.SetOwner(user)</span><br></pre></td></tr></table></figure><h2 id="4-3-接口名"><a href="#4-3-接口名" class="headerlink" title="4.3. 接口名"></a>4.3. 接口名</h2><p>只包含一个方法的接口命名以er结尾。</p><h1 id="5-分号"><a href="#5-分号" class="headerlink" title="5. 分号"></a>5. 分号</h1><p>在Go中，行末，不要加入分号。</p><p>分号其实是由词法分析器自动增加的。</p><h1 id="6-控制流"><a href="#6-控制流" class="headerlink" title="6. 控制流"></a>6. 控制流</h1><h2 id="6-1-变量重新声明"><a href="#6-1-变量重新声明" class="headerlink" title="6.1.  变量重新声明"></a>6.1.  变量重新声明</h2><p>下面的这份代码，注意到其中的err申明了两次，上面这个err声明了两次，但是这并不是错误，编译器会帮忙解决这个问题，实际上err第二次只是被重新赋值而已。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;os&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">f1, err := os.Open(<span class="string">&quot;file&quot;</span>)</span><br><span class="line">fmt.Println(f1,err)</span><br><span class="line"></span><br><span class="line">f2, err := os.Open(<span class="string">&quot;file2&quot;</span>)</span><br><span class="line">fmt.Println(f2,err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>当然这样的技巧只能在特殊情况才能生效</p><ul><li>本次声明与已声明的 v 处于同一作用域中（若 v 已在外层作用域中声明过，则此次声明会创建一个新的变量 §），</li><li>在初始化中与其类型相应的值才能赋予 v，且</li><li>在此次声明中至少另有一个变量是新声明的。</li></ul><h1 id="7-函数"><a href="#7-函数" class="headerlink" title="7. 函数"></a>7. 函数</h1><h2 id="7-1-可命名结果形参"><a href="#7-1-可命名结果形参" class="headerlink" title="7.1. 可命名结果形参"></a>7.1. 可命名结果形参</h2><p>在Go中，可以在函数上声明返回值变量，在返回的时候只需要一个return即可 </p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">f</span><span class="params">()</span></span> (value <span class="type">int</span>, info <span class="type">string</span>) &#123;</span><br><span class="line">value=<span class="number">1</span></span><br><span class="line">info=<span class="string">&quot;hello&quot;</span></span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">fmt.Println(f())</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="7-2-Defer"><a href="#7-2-Defer" class="headerlink" title="7.2. Defer"></a>7.2. Defer</h2><p>defer是一种推迟执行的语法，被该关键词修饰的语句会在函数返回的时候执行</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">f1</span><span class="params">(str <span class="type">string</span>)</span></span> &#123;</span><br><span class="line">fmt.Println(str)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">f1(<span class="string">&quot;hi1&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> f1(<span class="string">&quot;hi5&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> f1(<span class="string">&quot;hi4&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> f1(<span class="string">&quot;hi3&quot;</span>)</span><br><span class="line">f1(<span class="string">&quot;hi2&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 输出：</span></span><br><span class="line"><span class="comment">//hi1</span></span><br><span class="line"><span class="comment">//hi2</span></span><br><span class="line"><span class="comment">//hi3</span></span><br><span class="line"><span class="comment">//hi4</span></span><br><span class="line"><span class="comment">//hi5</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="8-初始化"><a href="#8-初始化" class="headerlink" title="8. 初始化"></a>8. 初始化</h1><p>主要是init函数，一个文件可以有多个init函数，他们都会被调用，init函数在包的全局变量初始化以后执行</p><p>注意到下面这个代码，先输出abc， 与init的位置无关，init在全局变量之后执行</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">p</span><span class="params">(str <span class="type">string</span>)</span></span> (<span class="type">int</span>)  &#123;</span><br><span class="line">fmt.Println(str)</span><br><span class="line"><span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> a = p(<span class="string">&quot;a&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">p(<span class="string">&quot;init1&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> b = p(<span class="string">&quot;b&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">p(<span class="string">&quot;init2&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> c = p(<span class="string">&quot;c&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">p(<span class="string">&quot;main&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">输出：</span></span><br><span class="line"><span class="comment">a</span></span><br><span class="line"><span class="comment">b</span></span><br><span class="line"><span class="comment">c</span></span><br><span class="line"><span class="comment">init1</span></span><br><span class="line"><span class="comment">init2</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R17ULO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;1-Effective-GO&quot;&gt;&lt;a href=&quot;#1-Effective-GO&quot; class=&quot;headerlink&quot; title=&quot;1. Effective GO&quot;&gt;&lt;/a&gt;1. Effective GO&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bingohuang/effective-go-zh-en&quot;&gt;https://github.com/bingohuang/effective-go-zh-en&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;2-格式化&quot;&gt;&lt;a href=&quot;#2-格式化&quot; class=&quot;headerlink&quot; title=&quot;2. 格式化&quot;&gt;&lt;/a&gt;2. 格式化&lt;/h1&gt;&lt;p&gt;在最开始学习GO的时候，写了几篇Blog，发现代码里面的对齐都是TAB，这让我很困惑，知道现在才知道，GO语言，默认使用TAB进行对齐。&lt;/p&gt;
&lt;p&gt;当然GO还有自己的空格规则&lt;code&gt;x&amp;lt;&amp;lt;8 + y&amp;lt;&amp;lt;16&lt;/code&gt;,向这份代码，我们根据空格就能知道计算的优先级了。&lt;/p&gt;
&lt;h1 id=&quot;3-注释&quot;&gt;&lt;a href=&quot;#3-注释&quot; class=&quot;headerlink&quot; title=&quot;3. 注释&quot;&gt;&lt;/a&gt;3. 注释&lt;/h1&gt;&lt;h2 id=&quot;3-1-包注释&quot;&gt;&lt;a href=&quot;#3-1-包注释&quot; class=&quot;headerlink&quot; title=&quot;3.1. 包注释&quot;&gt;&lt;/a&gt;3.1. 包注释&lt;/h2&gt;&lt;p&gt;Go语言要求package语句前加上注释，来介绍整个包，如果package包含多个文件，则只需要在其中一个文件中标注即可。&lt;/p&gt;
&lt;figure class=&quot;highlight go&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;Package regexp implements a simple library for regular expressions.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;The syntax of the regular expressions accepted is:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;	regexp:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		concatenation &amp;#123; &amp;#x27;|&amp;#x27; concatenation &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;	concatenation:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#123; closure &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;	closure:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		term [ &amp;#x27;*&amp;#x27; | &amp;#x27;+&amp;#x27; | &amp;#x27;?&amp;#x27; ]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;	term:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#x27;^&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#x27;$&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#x27;.&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		character&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#x27;[&amp;#x27; [ &amp;#x27;^&amp;#x27; ] character-ranges &amp;#x27;]&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;		&amp;#x27;(&amp;#x27; regexp &amp;#x27;)&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;package&lt;/span&gt; regexp&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
    <category term="读书" scheme="http://fightinggg.github.io/apollo/tags/%E8%AF%BB%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>双数组字典树</title>
    <link href="http://fightinggg.github.io/apollo/R16K60.html"/>
    <id>http://fightinggg.github.io/apollo/R16K60.html</id>
    <published>2021-10-18T15:54:00.000Z</published>
    <updated>2021-10-18T15:54:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R16K60.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="0-前置知识"><a href="#0-前置知识" class="headerlink" title="0. 前置知识"></a>0. 前置知识</h1><p><a href="https://fightinggg.github.io/Q79RYN.html">需要提前有字典树的知识</a></p><h1 id="1-双数组字典树介绍"><a href="#1-双数组字典树介绍" class="headerlink" title="1. 双数组字典树介绍"></a>1. 双数组字典树介绍</h1><p>双数组字典树英文名为DoubleArrayTrie，他的特点就是使用两个数组来表示一颗字典树，这里有比较有趣了，两个数组是怎么表达出字典树的呢？</p><h1 id="2-双数组介绍"><a href="#2-双数组介绍" class="headerlink" title="2. 双数组介绍"></a>2. 双数组介绍</h1><p>顾名思义，有两个数组，一个是base，另一个是check。</p><p>首先介绍数组的下标，数组的下标代表字典树上节点的编号，一个下标对应一个节点。</p><p>其实base数组的作用是用来记录一个基础值，这个值可以是随机值，只要不产生冲突就可以了，所以这个值可以用随机数算法获取，当然这样效率不高，高效的做法应该是使用指针枚举技术，ok，现在你已经明白了，base数组是一个不产生冲突的随机数组。</p><p>最后，check数组，check数组与base数组相互照应，如果<code>base[i]=check[j]</code> 则说明j是i的儿子，而且i到j的边权恰好为<code>j-base[i]</code>，也可以写作<code>j-check[j]</code>好好理解这句话</p><p>从另一个方面而言，双数组字典树的base数组，应该是一个指针数组，他指向了一个长度为字符集大小的数组的首地址，而check数组是一种hash碰撞思路，由于base数组疯狂指向自己，导致产生了很多碰撞，但是由于字典树是一个稀疏图，导致儿子节点指针利用率低，所以base数组疯狂复用这段空间，最后必须要依赖check来解决冲突，</p><p>双数组字典树相比于传统字典树，仅仅只在内存方面于增删改查占有优势，但是唯一不好的地方就是删和改会导致base数组内存分裂，难以回收，删和改如果占大头，那么传统字典树的内存效率更高</p><p>由于搜索领域几乎不涉及到删和改，所以这个数据结构很nice，字符集多大，就节省了多少倍的空间</p><p>数据结构很棒，但是在现在这个内存不值钱的时代，这些指针的储存用hashmap直接无脑顶掉，空间占用也高不了多少，hashmap顶多浪费两倍空间</p><p>两倍的空间算不上啥，除非这是唯一的优化点，否则不会优化到这个数据结构上来</p><span id="more"></span><h1 id="3-图解双数组字典树"><a href="#3-图解双数组字典树" class="headerlink" title="3. 图解双数组字典树"></a>3. 图解双数组字典树</h1><p>首先我们直接给出一颗双数组字典树，下面是三列，第一列是下标，第二列是base，第三列是check， 我们来根据这个双数组还原那颗字典树</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">index base check</span><br><span class="line">0 1 0</span><br><span class="line">66 2 1</span><br><span class="line">68 3 1</span><br><span class="line">69 5 2</span><br><span class="line">70 6 2</span><br><span class="line">71 7 3</span><br><span class="line">73 8 3</span><br><span class="line">74 10 5</span><br><span class="line">75 11 5</span><br><span class="line">81 12 11</span><br><span class="line">85 9 4</span><br><span class="line">91 4 1</span><br></pre></td></tr></table></figure><p>从第一行看起，base[0]&#x3D;1, check[0]&#x3D;0 ,这说明根节点是0号节点。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">  0</span><br></pre></td></tr></table></figure><p>然后我们来找0节点的子节点，只需要哪些check值为base[0]即可，我们发现check[66],check[68],check[91]满足，所以他们都是0号节点的子节点</p><p>对于check[66], 边权为66-check[66]&#x3D;65 ,是字符<code>A</code></p><p>对于check[68], 边权67, 是字符<code>C</code></p><p>对于check[91], 边权90，是字符<code>Z</code></p><p>所以现在图成了</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">  0--A--&gt;66</span><br><span class="line">  0--C--&gt;68</span><br><span class="line">  0--Z--&gt;91</span><br></pre></td></tr></table></figure><p>接着我们看66号节点，base[66]&#x3D;2,那么他的子节点为69和70，边权分别为69-check[69]&#x3D;67,70-check[70]&#x3D;68,分别是C和D</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">  0--A--&gt;66</span><br><span class="line">  0--C--&gt;68</span><br><span class="line">  0--Z--&gt;91</span><br><span class="line">  66--C--&gt;69</span><br><span class="line">  66--D--&gt;70</span><br></pre></td></tr></table></figure><p>69的字节点为74和75， 权重为74-5&#x3D;69和75-5&#x3D;70， 分别是E和F</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">  0--A--&gt;66</span><br><span class="line">  0--C--&gt;68</span><br><span class="line">  0--Z--&gt;91</span><br><span class="line">  66--C--&gt;69</span><br><span class="line">  66--D--&gt;70</span><br><span class="line">  69--E--&gt;74</span><br><span class="line">  69--F--&gt;75</span><br></pre></td></tr></table></figure><p>当然，后面的笔者就不进行模拟了，到此为止。</p><h1 id="4-双数组字典树的构建算法"><a href="#4-双数组字典树的构建算法" class="headerlink" title="4. 双数组字典树的构建算法"></a>4. 双数组字典树的构建算法</h1><p>首先算法的第一步是构建一颗字典树，你需要将这颗字典树构建出来。字典树的代码如下,这个不用多说了</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">addTire</span><span class="params">(<span class="type">const</span> <span class="type">char</span>* str, <span class="type">int</span> len)</span> &#123;</span><br><span class="line">    <span class="type">int</span> root = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; len; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (tire[root][str[i]] == <span class="number">0</span>) &#123;</span><br><span class="line">            tire[root][str[i]] = ++tireTot;</span><br><span class="line">        &#125;</span><br><span class="line">        root = tire[root][str[i]];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>第二步，就是在字典树上进行BFS，在BFS过程中增量构建双数组字典树，当我们BFS到某个节点U的时候，便开始寻找，当前还有哪个base值没有被使用，可以使得这个U的子节点的check值均为0， no BB , show code</p><p>先找到U的所有子节点</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">vector</span>&lt;<span class="type">int</span>&gt; sonTransList;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; maxCharest;i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (tire[tireTop][i] != <span class="number">0</span>) &#123;</span><br><span class="line">        sonTransList.push_back(i);</span><br><span class="line">        tireQ.push(tire[tireTop][i]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;find son: &quot;</span> &lt;&lt; sonTransList.size() &lt;&lt; <span class="built_in">endl</span>;;</span><br></pre></td></tr></table></figure><p>然后寻找一个合适的base值，这个值储存在变量begin中</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// find begin</span></span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">    begin++;</span><br><span class="line">    <span class="type">bool</span> ok = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> son : sonTransList) &#123;</span><br><span class="line">        <span class="keyword">if</span> (check[begin + code[son]] != <span class="number">0</span>) &#123;</span><br><span class="line">            ok = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (ok) &#123;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后就是赋值就好了.</p><h1 id="5-代码"><a href="#5-代码" class="headerlink" title="5. 代码"></a>5. 代码</h1><p>最后附上一个很丑的代码，第三节中介绍的双数组就来源于这个代码的输出。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ConsoleApplication1.cpp : 此文件包含 &quot;main&quot; 函数。程序执行将在此处开始并结束。</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line">using namespace <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">string</span> stringData[] = &#123;</span><br><span class="line">        <span class="string">&quot;AC&quot;</span>,</span><br><span class="line">        <span class="string">&quot;ACE&quot;</span>,</span><br><span class="line">        <span class="string">&quot;ACFF&quot;</span>,</span><br><span class="line">        <span class="string">&quot;AD&quot;</span>,</span><br><span class="line">        <span class="string">&quot;CD&quot;</span>,</span><br><span class="line">        <span class="string">&quot;CF&quot;</span>,</span><br><span class="line">        <span class="string">&quot;ZQ&quot;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> maxCharest = <span class="number">256</span>;</span><br><span class="line"><span class="type">int</span> tire[<span class="number">1000</span>][maxCharest], tireTot = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">addTire</span><span class="params">(<span class="type">const</span> <span class="type">char</span>* str, <span class="type">int</span> len)</span> &#123;</span><br><span class="line">    <span class="type">int</span> root = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; len; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (tire[root][str[i]] == <span class="number">0</span>) &#123;</span><br><span class="line">            tire[root][str[i]] = ++tireTot;</span><br><span class="line">        &#125;</span><br><span class="line">        root = tire[root][str[i]];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> code[maxCharest];</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">buildDAT</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="comment">// init code</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; maxCharest;i++) &#123;</span><br><span class="line">        code[i] = i;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt; <span class="title function_">tireState2DatState</span><span class="params">(<span class="number">1000</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// TODO vector</span></span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt; <span class="title function_">check</span><span class="params">(<span class="number">1000</span>)</span>, <span class="title function_">base</span><span class="params">(<span class="number">1000</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// bfs</span></span><br><span class="line">    <span class="built_in">queue</span>&lt;<span class="type">int</span>&gt; tireQ;</span><br><span class="line">    tireQ.push(<span class="number">1</span>);</span><br><span class="line">    tireState2DatState[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> begin = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (!tireQ.empty()) &#123;</span><br><span class="line">        <span class="type">int</span> tireTop = tireQ.front();</span><br><span class="line">        tireQ.pop();</span><br><span class="line"></span><br><span class="line">        <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt; sonTransList;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; maxCharest;i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (tire[tireTop][i] != <span class="number">0</span>) &#123;</span><br><span class="line">                sonTransList.push_back(i);</span><br><span class="line">                tireQ.push(tire[tireTop][i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;find son: &quot;</span> &lt;&lt; sonTransList.size() &lt;&lt; <span class="built_in">endl</span>;;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// find begin</span></span><br><span class="line">        <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">            begin++;</span><br><span class="line">            <span class="type">bool</span> ok = <span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> son : sonTransList) &#123;</span><br><span class="line">                <span class="keyword">if</span> (check[begin + code[son]] != <span class="number">0</span>) &#123;</span><br><span class="line">                    ok = <span class="literal">false</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (ok) &#123;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        base[tireState2DatState[tireTop]] = begin;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; maxCharest;i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (tire[tireTop][i] != <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="type">int</span> son = i;</span><br><span class="line">                <span class="keyword">if</span> (check[begin + code[son]] != <span class="number">0</span>) &#123;</span><br><span class="line">                    <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                check[begin + code[son]] = begin;</span><br><span class="line">                tireState2DatState[tire[tireTop][i]] = begin + code[son];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; <span class="number">1000</span>;i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (check[i] != <span class="number">0</span> || base[i] != <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="built_in">cout</span> &lt;&lt; i &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; base[i] &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; check[i] &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt;begin&lt;&lt;<span class="string">&quot;--------&quot;</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>;i &lt; <span class="number">7</span>;i++) &#123;</span><br><span class="line">        addTire(stringData[i].data(), stringData[i].size());</span><br><span class="line">    &#125;</span><br><span class="line">    buildDAT();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R16K60.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;0-前置知识&quot;&gt;&lt;a href=&quot;#0-前置知识&quot; class=&quot;headerlink&quot; title=&quot;0. 前置知识&quot;&gt;&lt;/a&gt;0. 前置知识&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://fightinggg.github.io/Q79RYN.html&quot;&gt;需要提前有字典树的知识&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;1-双数组字典树介绍&quot;&gt;&lt;a href=&quot;#1-双数组字典树介绍&quot; class=&quot;headerlink&quot; title=&quot;1. 双数组字典树介绍&quot;&gt;&lt;/a&gt;1. 双数组字典树介绍&lt;/h1&gt;&lt;p&gt;双数组字典树英文名为DoubleArrayTrie，他的特点就是使用两个数组来表示一颗字典树，这里有比较有趣了，两个数组是怎么表达出字典树的呢？&lt;/p&gt;
&lt;h1 id=&quot;2-双数组介绍&quot;&gt;&lt;a href=&quot;#2-双数组介绍&quot; class=&quot;headerlink&quot; title=&quot;2. 双数组介绍&quot;&gt;&lt;/a&gt;2. 双数组介绍&lt;/h1&gt;&lt;p&gt;顾名思义，有两个数组，一个是base，另一个是check。&lt;/p&gt;
&lt;p&gt;首先介绍数组的下标，数组的下标代表字典树上节点的编号，一个下标对应一个节点。&lt;/p&gt;
&lt;p&gt;其实base数组的作用是用来记录一个基础值，这个值可以是随机值，只要不产生冲突就可以了，所以这个值可以用随机数算法获取，当然这样效率不高，高效的做法应该是使用指针枚举技术，ok，现在你已经明白了，base数组是一个不产生冲突的随机数组。&lt;/p&gt;
&lt;p&gt;最后，check数组，check数组与base数组相互照应，如果&lt;code&gt;base[i]=check[j]&lt;/code&gt; 则说明j是i的儿子，而且i到j的边权恰好为&lt;code&gt;j-base[i]&lt;/code&gt;，也可以写作&lt;code&gt;j-check[j]&lt;/code&gt;好好理解这句话&lt;/p&gt;
&lt;p&gt;从另一个方面而言，双数组字典树的base数组，应该是一个指针数组，他指向了一个长度为字符集大小的数组的首地址，而check数组是一种hash碰撞思路，由于base数组疯狂指向自己，导致产生了很多碰撞，但是由于字典树是一个稀疏图，导致儿子节点指针利用率低，所以base数组疯狂复用这段空间，最后必须要依赖check来解决冲突，&lt;/p&gt;
&lt;p&gt;双数组字典树相比于传统字典树，仅仅只在内存方面于增删改查占有优势，但是唯一不好的地方就是删和改会导致base数组内存分裂，难以回收，删和改如果占大头，那么传统字典树的内存效率更高&lt;/p&gt;
&lt;p&gt;由于搜索领域几乎不涉及到删和改，所以这个数据结构很nice，字符集多大，就节省了多少倍的空间&lt;/p&gt;
&lt;p&gt;数据结构很棒，但是在现在这个内存不值钱的时代，这些指针的储存用hashmap直接无脑顶掉，空间占用也高不了多少，hashmap顶多浪费两倍空间&lt;/p&gt;
&lt;p&gt;两倍的空间算不上啥，除非这是唯一的优化点，否则不会优化到这个数据结构上来&lt;/p&gt;</summary>
    
    
    
    <category term="ACM" scheme="http://fightinggg.github.io/apollo/categories/ACM/"/>
    
    <category term="学习笔记" scheme="http://fightinggg.github.io/apollo/categories/ACM/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    <category term="字符串" scheme="http://fightinggg.github.io/apollo/categories/ACM/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
    
    
  </entry>
  
  <entry>
    <title>Go进阶-Web框架</title>
    <link href="http://fightinggg.github.io/apollo/R162KO.html"/>
    <id>http://fightinggg.github.io/apollo/R162KO.html</id>
    <published>2021-10-18T09:34:00.000Z</published>
    <updated>2021-10-19T05:49:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R162KO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="0-前言"><a href="#0-前言" class="headerlink" title="0. 前言"></a>0. 前言</h1><p>简单介绍Beego和Gin，水一水文章。</p><h2 id="1-1-安装Beego库"><a href="#1-1-安装Beego库" class="headerlink" title="1.1. 安装Beego库"></a>1.1. 安装Beego库</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go get github.com/astaxie/beego</span><br></pre></td></tr></table></figure><p>同时安装Bee工具</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go get github.com/beego/bee</span><br></pre></td></tr></table></figure><p>看到如下内容代表安装成功</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 ~ % go get github.com/astaxie/beego</span><br><span class="line">go: downloading github.com/astaxie/beego v1.12.3</span><br><span class="line">go: downloading github.com/prometheus/client_golang v1.7.0</span><br><span class="line">go: downloading github.com/hashicorp/golang-lru v0.5.4</span><br><span class="line">go: downloading golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550</span><br><span class="line">go: downloading github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644</span><br><span class="line">go: downloading github.com/prometheus/common v0.10.0</span><br><span class="line">go: downloading github.com/prometheus/client_model v0.2.0</span><br><span class="line">go: downloading github.com/prometheus/procfs v0.1.3</span><br><span class="line">go: downloading github.com/beorn7/perks v1.0.1</span><br><span class="line">go: downloading golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1</span><br><span class="line">go: downloading github.com/cespare/xxhash/v2 v2.1.1</span><br><span class="line">go: downloading github.com/golang/protobuf v1.4.2</span><br><span class="line">go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1</span><br><span class="line">go: downloading google.golang.org/protobuf v1.23.0</span><br><span class="line">s@HELLOWANG-MB1 ~ % go get github.com/beego/bee</span><br><span class="line">go: downloading github.com/beego/bee v1.12.3</span><br><span class="line">go: downloading github.com/gadelkareem/delve v1.4.2-0.20200619175259-dcd01330766f</span><br><span class="line">go: downloading github.com/gorilla/websocket v1.4.2</span><br><span class="line">go: downloading github.com/lib/pq v1.7.0</span><br><span class="line">go: downloading github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915</span><br><span class="line">go: downloading github.com/pelletier/go-toml v1.2.0</span><br><span class="line">go: downloading github.com/smartwalle/pongo2render v1.0.1</span><br><span class="line">go: downloading github.com/spf13/viper v1.7.0</span><br><span class="line">go: downloading github.com/astaxie/beego v1.12.1</span><br><span class="line">go: downloading github.com/hashicorp/hcl v1.0.0</span><br><span class="line">go: downloading github.com/magiconair/properties v1.8.1</span><br><span class="line">go: downloading github.com/spf13/afero v1.1.2</span><br><span class="line">go: downloading github.com/spf13/cast v1.3.0</span><br><span class="line">go: downloading github.com/spf13/jwalterweatherman v1.0.0</span><br><span class="line">go: downloading github.com/spf13/pflag v1.0.3</span><br><span class="line">go: downloading github.com/subosito/gotenv v1.2.0</span><br><span class="line">go: downloading gopkg.in/ini.v1 v1.51.0</span><br><span class="line">go: downloading golang.org/x/text v0.3.2</span><br><span class="line">go: downloading github.com/sirupsen/logrus v1.6.0</span><br><span class="line">go: downloading github.com/cosiner/argv v0.1.0</span><br><span class="line">go: downloading github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b</span><br><span class="line">go: downloading github.com/mattn/go-colorable v0.0.9</span><br><span class="line">go: downloading github.com/mattn/go-isatty v0.0.3</span><br><span class="line">go: downloading golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4</span><br><span class="line">go: downloading go.starlark.net v0.0.0-20190702223751-32f345186213</span><br><span class="line">go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.3</span><br><span class="line">go get: installing executables with &#x27;go get&#x27; in module mode is deprecated.</span><br><span class="line">Use &#x27;go install pkg@version&#x27; instead.</span><br><span class="line">For more information, see https://golang.org/doc/go-get-install-deprecation</span><br><span class="line">or run &#x27;go help get&#x27; or &#x27;go help install&#x27;.</span><br></pre></td></tr></table></figure><span id="more"></span><p>注意安装以后对二进制文件在$GOPATH&#x2F;bin下，所以请确保该路径在你的环境变量下,笔者使用MACOS，在<code>~/.zshrc</code>中使用如下配置</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">GOPATH=~/go</span><br><span class="line">PATH=$PATH:~/go/bin</span><br></pre></td></tr></table></figure><h2 id="1-2-创建项目"><a href="#1-2-创建项目" class="headerlink" title="1.2. 创建项目"></a>1.2. 创建项目</h2><h3 id="1-2-1-创建项目"><a href="#1-2-1-创建项目" class="headerlink" title="1.2.1. 创建项目"></a>1.2.1. 创建项目</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 src % bee new bee-demo</span><br><span class="line">2021/10/18 17:47:29 INFO     ▶ 0001 generate new project support go modules.</span><br><span class="line">2021/10/18 17:47:29 INFO     ▶ 0002 Creating application...</span><br><span class="line">create /Users/s/src/bee-demo/go.mod</span><br><span class="line">create /Users/s/src/bee-demo/</span><br><span class="line">create /Users/s/src/bee-demo/conf/</span><br><span class="line">create /Users/s/src/bee-demo/controllers/</span><br><span class="line">create /Users/s/src/bee-demo/models/</span><br><span class="line">create /Users/s/src/bee-demo/routers/</span><br><span class="line">create /Users/s/src/bee-demo/tests/</span><br><span class="line">create /Users/s/src/bee-demo/static/</span><br><span class="line">create /Users/s/src/bee-demo/static/js/</span><br><span class="line">create /Users/s/src/bee-demo/static/css/</span><br><span class="line">create /Users/s/src/bee-demo/static/img/</span><br><span class="line">create /Users/s/src/bee-demo/views/</span><br><span class="line">create /Users/s/src/bee-demo/conf/app.conf</span><br><span class="line">create /Users/s/src/bee-demo/controllers/default.go</span><br><span class="line">create /Users/s/src/bee-demo/views/index.tpl</span><br><span class="line">create /Users/s/src/bee-demo/routers/router.go</span><br><span class="line">create /Users/s/src/bee-demo/tests/default_test.go</span><br><span class="line">create /Users/s/src/bee-demo/main.go</span><br><span class="line">2021/10/18 17:47:29 SUCCESS  ▶ 0003 New application successfully created!</span><br></pre></td></tr></table></figure><h3 id="1-2-2-初始化项目"><a href="#1-2-2-初始化项目" class="headerlink" title="1.2.2. 初始化项目"></a>1.2.2. 初始化项目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 bee-demo % go get</span><br><span class="line">go: downloading gopkg.in/yaml.v2 v2.2.1</span><br><span class="line">go: downloading github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18</span><br><span class="line">go get: added github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18</span><br></pre></td></tr></table></figure><h3 id="1-2-3-启动项目"><a href="#1-2-3-启动项目" class="headerlink" title="1.2.3. 启动项目"></a>1.2.3. 启动项目</h3><p>在GoLand IDE中点击▶启动项目，看到如下输出，访问<a href="http://localhost:8080/">http://localhost:8080/</a>即可看到小蜜蜂</p><p><img src='/beego-logo.png'></img></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">GOROOT=/usr/local/Cellar/go/1.17.2/libexec #gosetup</span><br><span class="line">GOPATH=/Users/s/go #gosetup</span><br><span class="line">/usr/local/Cellar/go/1.17.2/libexec/bin/go build -o /private/var/folders/6t/kt2nf9z17cv87lqk842lngj80000gn/T/GoLand/___go_build_bee_demo bee-demo #gosetup</span><br><span class="line">/private/var/folders/6t/kt2nf9z17cv87lqk842lngj80000gn/T/GoLand/___go_build_bee_demo</span><br><span class="line">2021/10/18 18:01:42.769 [I] [asm_amd64.s:1581]  http server Running on http://:8080</span><br><span class="line">2021/10/18 18:04:54.533 [D] [server.go:2878]  |            ::1| 200 |   4.493325ms|   match| GET      /     r:/</span><br><span class="line">2021/10/18 18:04:54.607 [D] [server.go:2878]  |            ::1| 200 |    316.098µs|   match| GET      /static/js/reload.min.js</span><br><span class="line">2021/10/18 18:04:58.868 [D] [server.go:2878]  |            ::1| 200 |    1.40659ms|   match| GET      /     r:/</span><br><span class="line">2021/10/18 18:05:03.305 [D] [server.go:2878]  |            ::1| 200 |   1.215993ms|   match| GET      /     r:/</span><br><span class="line">2021/10/18 18:05:43.326 [D] [server.go:2878]  |            ::1| 200 |   2.620439ms|   match| GET      /     r:/</span><br><span class="line">2021/10/18 18:05:43.381 [D] [server.go:2878]  |            ::1| 200 |     60.791µs|   match| GET      /static/js/reload.min.js</span><br><span class="line">2021/10/18 18:09:39.216 [D] [server.go:2878]  |            ::1| 200 |   2.486943ms|   match| GET      /     r:/</span><br><span class="line">2021/10/18 18:09:39.266 [D] [server.go:2878]  |            ::1| 200 |     66.282µs|   match| GET      /static/js/reload.min.js</span><br></pre></td></tr></table></figure><h3 id="1-2-4-Contorller"><a href="#1-2-4-Contorller" class="headerlink" title="1.2.4. Contorller"></a>1.2.4. Contorller</h3><h3 id="1-2-4-1-路由"><a href="#1-2-4-1-路由" class="headerlink" title="1.2.4.1 路由"></a>1.2.4.1 路由</h3><p>路由在文件<code>routers/router.go</code>中, 在Beego的设计中，路由需要手动添加，即哪个PATH交给哪个Controller来处理。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> routers</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;bee-demo/controllers&quot;</span></span><br><span class="line"><span class="string">&quot;github.com/astaxie/beego&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">    beego.Router(<span class="string">&quot;/&quot;</span>, &amp;controllers.MainController&#123;&#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="1-2-4-2-Controller"><a href="#1-2-4-2-Controller" class="headerlink" title="1.2.4.2. Controller"></a>1.2.4.2. Controller</h3><p>MainController继承了beego.Controller,所以我们可以复写他的方法，注意到beego.Controller实现了beegoControllerInterface这个接口，里边的方法其实都比较明显了，就是HTTP协议的方法。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> ControllerInterface <span class="keyword">interface</span> &#123;</span><br><span class="line">Init(ct *context.Context, controllerName, actionName <span class="type">string</span>, app <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line">Prepare()</span><br><span class="line">Get()</span><br><span class="line">Post()</span><br><span class="line">Delete()</span><br><span class="line">Put()</span><br><span class="line">Head()</span><br><span class="line">Patch()</span><br><span class="line">Options()</span><br><span class="line">Trace()</span><br><span class="line">Finish()</span><br><span class="line">Render() <span class="type">error</span></span><br><span class="line">XSRFToken() <span class="type">string</span></span><br><span class="line">CheckXSRFCookie() <span class="type">bool</span></span><br><span class="line">HandlerFunc(fn <span class="type">string</span>) <span class="type">bool</span></span><br><span class="line">URLMapping()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="1-2-4-3-返回JSON数据的Controller"><a href="#1-2-4-3-返回JSON数据的Controller" class="headerlink" title="1.2.4.3. 返回JSON数据的Controller"></a>1.2.4.3. 返回JSON数据的Controller</h3><p>首先编写一个HelloController,然后把它加入到route中，最后访问&#x2F;hello，就可以看到输出了。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> controllers</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;github.com/astaxie/beego&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> HelloController <span class="keyword">struct</span> &#123;</span><br><span class="line">beego.Controller</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> HelloVO <span class="keyword">struct</span> &#123;</span><br><span class="line">Say1 <span class="type">string</span> <span class="string">`json:&quot;say_1&quot;`</span></span><br><span class="line">Say2 <span class="type">int</span>    <span class="string">`json:&quot;say_2&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *HelloController)</span></span> Get() &#123;</span><br><span class="line">c.Data[<span class="string">&quot;json&quot;</span>] = &amp;HelloVO&#123;</span><br><span class="line">Say1: <span class="string">&quot;world&quot;</span>,</span><br><span class="line">Say2: <span class="number">9527</span>,</span><br><span class="line">&#125;</span><br><span class="line">c.ServeJSON()</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">GET /hello</span><br><span class="line">&#123;</span><br><span class="line">  &quot;say_1&quot;: &quot;world&quot;,</span><br><span class="line">  &quot;say_2&quot;: 9527</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这一块就点到为止了，听说Beego框架不太火，了解了解就好了，笔者也不是文档翻译器，更多更加细节的部分关注<a href="https://www.topgoer.com/beego%E6%A1%86%E6%9E%B6/">这里</a></p><h1 id="2-1-安装Gin"><a href="#2-1-安装Gin" class="headerlink" title="2.1. 安装Gin"></a>2.1. 安装Gin</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go get github.com/gin-gonic/gin</span><br></pre></td></tr></table></figure><h1 id="2-2-编写Hello-World"><a href="#2-2-编写Hello-World" class="headerlink" title="2.2.  编写Hello World"></a>2.2.  编写Hello World</h1><p>编写下面的代码，然后直接运行，访问<a href="http://localhost:8080/">http://localhost:8080/</a>即可看到Hello World</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;net/http&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;github.com/gin-gonic/gin&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">r := gin.Default()</span><br><span class="line">r.GET(<span class="string">&quot;/&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(c *gin.Context)</span></span> &#123;</span><br><span class="line">c.String(http.StatusOK, <span class="string">&quot;hello World!&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">r.Run()</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>日志如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">GOROOT=/usr/local/Cellar/go/1.17.2/libexec #gosetup</span><br><span class="line">GOPATH=/Users/s/go #gosetup</span><br><span class="line">/usr/local/Cellar/go/1.17.2/libexec/bin/go build -o /private/var/folders/6t/kt2nf9z17cv87lqk842lngj80000gn/T/GoLand/___go_build_gin_demo gin-demo #gosetup</span><br><span class="line">/private/var/folders/6t/kt2nf9z17cv87lqk842lngj80000gn/T/GoLand/___go_build_gin_demo</span><br><span class="line">[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.</span><br><span class="line"></span><br><span class="line">[GIN-debug] [WARNING] Running in &quot;debug&quot; mode. Switch to &quot;release&quot; mode in production.</span><br><span class="line"> - using env:   export GIN_MODE=release</span><br><span class="line"> - using code:  gin.SetMode(gin.ReleaseMode)</span><br><span class="line"></span><br><span class="line">[GIN-debug] GET    /                         --&gt; main.main.func1 (3 handlers)</span><br><span class="line">[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default</span><br><span class="line">[GIN-debug] Listening and serving HTTP on :8080</span><br><span class="line">[GIN] 2021/10/19 - 15:02:00 | 200 |      16.428µs |             ::1 | GET      &quot;/&quot;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>更加具体的，参见文档，太没技术的东西笔者不喜欢写。</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R162KO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;0-前言&quot;&gt;&lt;a href=&quot;#0-前言&quot; class=&quot;headerlink&quot; title=&quot;0. 前言&quot;&gt;&lt;/a&gt;0. 前言&lt;/h1&gt;&lt;p&gt;简单介绍Beego和Gin，水一水文章。&lt;/p&gt;
&lt;h2 id=&quot;1-1-安装Beego库&quot;&gt;&lt;a href=&quot;#1-1-安装Beego库&quot; class=&quot;headerlink&quot; title=&quot;1.1. 安装Beego库&quot;&gt;&lt;/a&gt;1.1. 安装Beego库&lt;/h2&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;go get github.com/astaxie/beego&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;同时安装Bee工具&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;go get github.com/beego/bee&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;看到如下内容代表安装成功&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;s@HELLOWANG-MB1 ~ % go get github.com/astaxie/beego&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/astaxie/beego v1.12.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/prometheus/client_golang v1.7.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/hashicorp/golang-lru v0.5.4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/prometheus/common v0.10.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/prometheus/client_model v0.2.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/prometheus/procfs v0.1.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/beorn7/perks v1.0.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/cespare/xxhash/v2 v2.1.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/golang/protobuf v1.4.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading google.golang.org/protobuf v1.23.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;s@HELLOWANG-MB1 ~ % go get github.com/beego/bee&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/beego/bee v1.12.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/gadelkareem/delve v1.4.2-0.20200619175259-dcd01330766f&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/gorilla/websocket v1.4.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/lib/pq v1.7.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/pelletier/go-toml v1.2.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/smartwalle/pongo2render v1.0.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/spf13/viper v1.7.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/astaxie/beego v1.12.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/hashicorp/hcl v1.0.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/magiconair/properties v1.8.1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/spf13/afero v1.1.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/spf13/cast v1.3.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/spf13/jwalterweatherman v1.0.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/spf13/pflag v1.0.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/subosito/gotenv v1.2.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading gopkg.in/ini.v1 v1.51.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading golang.org/x/text v0.3.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/sirupsen/logrus v1.6.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/cosiner/argv v0.1.0&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/mattn/go-colorable v0.0.9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/mattn/go-isatty v0.0.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading go.starlark.net v0.0.0-20190702223751-32f345186213&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;go get: installing executables with &amp;#x27;go get&amp;#x27; in module mode is deprecated.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	Use &amp;#x27;go install pkg@version&amp;#x27; instead.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	For more information, see https://golang.org/doc/go-get-install-deprecation&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	or run &amp;#x27;go help get&amp;#x27; or &amp;#x27;go help install&amp;#x27;.&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
  </entry>
  
  <entry>
    <title>Go进阶-协程的本质与CPU的争夺</title>
    <link href="http://fightinggg.github.io/apollo/R0X17C.html"/>
    <id>http://fightinggg.github.io/apollo/R0X17C.html</id>
    <published>2021-10-13T12:26:00.000Z</published>
    <updated>2021-10-13T12:26:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R0X17C.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-从协程谈起"><a href="#1-从协程谈起" class="headerlink" title="1. 从协程谈起"></a>1. 从协程谈起</h1><p>很多语言都支持协程，那什么是协程，和线程进程有什么区别呢？这里推荐一篇<a href="https://www.cnblogs.com/liang1101/p/7285955.html">Blog</a>，笔者直接提取其中最重要的部分</p><blockquote><p><strong>进程、线程 和 协程 之间概念的区别</strong></p><p>　　对于 <strong>进程、线程</strong>，都是有内核进行调度，有 CPU 时间片的概念，进行 <strong>抢占式调度</strong>（有多种调度算法）</p><p>　　对于 <strong>协程</strong>(用户级线程)，这是对内核透明的，也就是系统并不知道有协程的存在，是完全由用户自己的程序进行调度的，因为是由用户程序自己控制，那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程&#x2F;线程，通常只能进行 <strong>协作式调度</strong>，需要协程自己主动把控制权转让出去之后，其他协程才能被执行到。</p><p>　<strong>goroutine 和协程区别</strong></p><p>　　<strong>本质上，goroutine 就是协程。</strong> 不同的是，Golang 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理，当遇到长时间执行或者进行系统调用时，会主动把当前 goroutine 的CPU (P) 转让出去，让其他 goroutine 能被调度并执行，也就是 Golang 从语言层面支持了协程。Golang 的一大特色就是从语言层面原生支持协程，在函数或者方法前面加 go关键字就可创建一个协程。</p></blockquote><p>操作系统是不知道协程的，那么应用层如何实现协程呢？下面给一些伪代码</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">不断循环：</span><br><span class="line">    从任务队列获取任务</span><br><span class="line">    执行任务，如果任务运行结束:</span><br><span class="line">        进行下一轮循环(<span class="keyword">continue</span>)</span><br><span class="line">    如果任务运行时进入阻塞状态:</span><br><span class="line">        把当前任务放入队列尾部(挂起)</span><br><span class="line">    如果任务主动释放CPU:</span><br><span class="line">        把当前任务放入队列尾部(挂起)</span><br></pre></td></tr></table></figure><p>我们可以看到，其实这里正在执行的任务就是协程，这样的线程模型，他的CPU利用率非常高，他的协程切换代价非常低，几乎只需要入队出队而已。</p><p>但是这样的模型有一个很大的缺点，那就是CPU的公平性，如果一个协程迟迟不退出，且不进行系统调用，也不主动释放CPU，那么，这个协程将造成队头阻塞现象。</p><span id="more"></span><h1 id="2-Goroutine"><a href="#2-Goroutine" class="headerlink" title="2. Goroutine"></a>2. Goroutine</h1><p>想必很多人都知道这个名词，这其实就是Go的协程(coroutine), 相比于普通的协程，Go做了特殊的处理，能够在一些适当的时候，交出CPU控制权，所以Go的调度是公平的。</p><p>当然Go关于协程，也有一个<a href="https://fengyoulin.com/for-block-all.html">Bug</a>，这个Bug在<a href="https://golang.org/doc/go1.14#runtime">Go1.14</a>的时候被修复了，有兴趣的读者可以自己查看，当然笔者在下文也会通过一个更加简单的例子来复现这个Bug。</p><h1 id="3-Bug复现"><a href="#3-Bug复现" class="headerlink" title="3. Bug复现"></a>3. Bug复现</h1><p>Bug的复现需要两个版本的Go进行对比才能看出来，笔者建议使用Docker。首先就是给出代码了,下面的代码启用了两个协程，第一个做CPU空轮询，第二个做不间断输出。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;runtime&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line">    runtime.GOMAXPROCS(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;begin1&quot;</span>)</span><br><span class="line">        s := <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> t := <span class="number">0</span>; t &lt; <span class="number">10000</span>; t++ &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">1000000000</span>; i++ &#123;</span><br><span class="line">                s += i</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//fmt.Println(1, &quot;-&gt;&quot;, s)</span></span><br><span class="line">        &#125;</span><br><span class="line">        fmt.Println(<span class="string">&quot;end1&quot;</span>, s)</span><br><span class="line"></span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;begin2&quot;</span>)</span><br><span class="line">        s := <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> t := <span class="number">0</span>; t &lt; <span class="number">10</span>; t++ &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">1000000000</span>; i++ &#123;</span><br><span class="line">                s += i</span><br><span class="line">            &#125;</span><br><span class="line">            fmt.Println(<span class="number">2</span>, <span class="string">&quot;-&gt;&quot;</span>, s)</span><br><span class="line">        &#125;</span><br><span class="line">        fmt.Println(<span class="string">&quot;end2&quot;</span>, s)</span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second * <span class="number">10</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="3-1-在Go1-13-中的表现"><a href="#3-1-在Go1-13-中的表现" class="headerlink" title="3.1. 在Go1.13 中的表现"></a>3.1. 在Go1.13 中的表现</h2><p>用docker启动容器，用cat写入代码</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --<span class="built_in">rm</span> golang:1.13 bash</span><br><span class="line">root@c6921e499184:/go<span class="comment"># cat&lt;&lt;EOF&gt;a.go</span></span><br><span class="line">&gt; package main</span><br><span class="line">&gt;</span><br><span class="line">&gt; import (</span><br><span class="line">&gt;     <span class="string">&quot;fmt&quot;</span></span><br><span class="line">&gt;     <span class="string">&quot;runtime&quot;</span></span><br><span class="line">&gt;     <span class="string">&quot;time&quot;</span></span><br><span class="line">&gt; )</span><br><span class="line">&gt;</span><br><span class="line">&gt; func <span class="function"><span class="title">main</span></span>() &#123;</span><br><span class="line">&gt;</span><br><span class="line">&gt;     runtime.GOMAXPROCS(1)</span><br><span class="line">&gt;</span><br><span class="line">&gt;     go <span class="function"><span class="title">func</span></span>() &#123;</span><br><span class="line">&gt;         fmt.Println(<span class="string">&quot;begin1&quot;</span>)</span><br><span class="line">&gt;         s := 0</span><br><span class="line">&gt;         <span class="keyword">for</span> t := 0; t &lt; 10000; t++ &#123;</span><br><span class="line">&gt;</span><br><span class="line">&gt;             <span class="keyword">for</span> i := 0; i &lt; 1000000000; i++ &#123;</span><br><span class="line">&gt;                 s += i</span><br><span class="line">&gt;             &#125;</span><br><span class="line">&gt;             //fmt.Println(1, <span class="string">&quot;-&gt;&quot;</span>, s)</span><br><span class="line">&gt;         &#125;</span><br><span class="line">&gt;         fmt.Println(<span class="string">&quot;end1&quot;</span>, s)</span><br><span class="line">&gt;</span><br><span class="line">&gt;     &#125;()</span><br><span class="line">&gt;</span><br><span class="line">&gt;     go <span class="function"><span class="title">func</span></span>() &#123;</span><br><span class="line">&gt;         fmt.Println(<span class="string">&quot;begin2&quot;</span>)</span><br><span class="line">&gt;         s := 0</span><br><span class="line">&gt;         <span class="keyword">for</span> t := 0; t &lt; 10; t++ &#123;</span><br><span class="line">&gt;</span><br><span class="line">&gt;             <span class="keyword">for</span> i := 0; i &lt; 1000000000; i++ &#123;</span><br><span class="line">&gt;                 s += i</span><br><span class="line">&gt;             &#125;</span><br><span class="line">&gt;             fmt.Println(2, <span class="string">&quot;-&gt;&quot;</span>, s)</span><br><span class="line">&gt;         &#125;</span><br><span class="line">&gt;         fmt.Println(<span class="string">&quot;end2&quot;</span>, s)</span><br><span class="line">&gt;     &#125;()</span><br><span class="line">&gt;</span><br><span class="line">&gt;     time.Sleep(time.Second * 10)</span><br><span class="line">&gt; &#125;</span><br><span class="line">&gt; EOF</span><br></pre></td></tr></table></figure><p>然后运行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go run a.go</span><br></pre></td></tr></table></figure><p>读者可以很容易地发现，这份代码只会输出一个<code>begin1</code></p><h1 id="3-2-在Go1-14-中的表现"><a href="#3-2-在Go1-14-中的表现" class="headerlink" title="3.2. 在Go1.14 中的表现"></a>3.2. 在Go1.14 中的表现</h1><p>这次，进入docker的指令换成下面这条就行了</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --rm golang:1.14 bash</span><br></pre></td></tr></table></figure><p>在1.14中，会输出如下内容</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">begin2</span><br><span class="line">begin1</span><br><span class="line">2 -&gt; 499999999500000000</span><br><span class="line">2 -&gt; 999999999000000000</span><br><span class="line">2 -&gt; 1499999998500000000</span><br><span class="line">2 -&gt; 1999999998000000000</span><br><span class="line">2 -&gt; 2499999997500000000</span><br><span class="line">2 -&gt; 2999999997000000000</span><br><span class="line">2 -&gt; 3499999996500000000</span><br><span class="line">2 -&gt; 3999999996000000000</span><br><span class="line">2 -&gt; 4499999995500000000</span><br><span class="line">2 -&gt; 4999999995000000000</span><br><span class="line">end2 4999999995000000000</span><br></pre></td></tr></table></figure><p>由此可见，Go1.14解决了for循环长时间占用CPU的问题。</p><h1 id="4-如何主动释放CPU"><a href="#4-如何主动释放CPU" class="headerlink" title="4. 如何主动释放CPU"></a>4. 如何主动释放CPU</h1><p>要注意释放的时机，函数调用、for循环中都可以，但是要注意控制释放的频率，不能太频繁，也不能太不频繁。</p>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R0X17C.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;1-从协程谈起&quot;&gt;&lt;a href=&quot;#1-从协程谈起&quot; class=&quot;headerlink&quot; title=&quot;1. 从协程谈起&quot;&gt;&lt;/a&gt;1. 从协程谈起&lt;/h1&gt;&lt;p&gt;很多语言都支持协程，那什么是协程，和线程进程有什么区别呢？这里推荐一篇&lt;a href=&quot;https://www.cnblogs.com/liang1101/p/7285955.html&quot;&gt;Blog&lt;/a&gt;，笔者直接提取其中最重要的部分&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;进程、线程 和 协程 之间概念的区别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;　　对于 &lt;strong&gt;进程、线程&lt;/strong&gt;，都是有内核进行调度，有 CPU 时间片的概念，进行 &lt;strong&gt;抢占式调度&lt;/strong&gt;（有多种调度算法）&lt;/p&gt;
&lt;p&gt;　　对于 &lt;strong&gt;协程&lt;/strong&gt;(用户级线程)，这是对内核透明的，也就是系统并不知道有协程的存在，是完全由用户自己的程序进行调度的，因为是由用户程序自己控制，那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程&amp;#x2F;线程，通常只能进行 &lt;strong&gt;协作式调度&lt;/strong&gt;，需要协程自己主动把控制权转让出去之后，其他协程才能被执行到。&lt;/p&gt;
&lt;p&gt;　&lt;strong&gt;goroutine 和协程区别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;　　&lt;strong&gt;本质上，goroutine 就是协程。&lt;/strong&gt; 不同的是，Golang 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理，当遇到长时间执行或者进行系统调用时，会主动把当前 goroutine 的CPU (P) 转让出去，让其他 goroutine 能被调度并执行，也就是 Golang 从语言层面支持了协程。Golang 的一大特色就是从语言层面原生支持协程，在函数或者方法前面加 go关键字就可创建一个协程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;操作系统是不知道协程的，那么应用层如何实现协程呢？下面给一些伪代码&lt;/p&gt;
&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;不断循环：&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    从任务队列获取任务&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    执行任务，如果任务运行结束:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        进行下一轮循环(&lt;span class=&quot;keyword&quot;&gt;continue&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    如果任务运行时进入阻塞状态:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        把当前任务放入队列尾部(挂起)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    如果任务主动释放CPU:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        把当前任务放入队列尾部(挂起)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;我们可以看到，其实这里正在执行的任务就是协程，这样的线程模型，他的CPU利用率非常高，他的协程切换代价非常低，几乎只需要入队出队而已。&lt;/p&gt;
&lt;p&gt;但是这样的模型有一个很大的缺点，那就是CPU的公平性，如果一个协程迟迟不退出，且不进行系统调用，也不主动释放CPU，那么，这个协程将造成队头阻塞现象。&lt;/p&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
  </entry>
  
  <entry>
    <title>Go入门-Go语言从入门到进阶实战</title>
    <link href="http://fightinggg.github.io/apollo/R0T00O.html"/>
    <id>http://fightinggg.github.io/apollo/R0T00O.html</id>
    <published>2021-10-11T08:10:00.000Z</published>
    <updated>2021-10-14T11:58:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R0T00O.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="1-开始学习Go"><a href="#1-开始学习Go" class="headerlink" title="1. 开始学习Go"></a>1. 开始学习Go</h1><p>从一本书开始，这本书叫做<a href="https://weread.qq.com/web/reader/24d323407155597024d28a7kc81322c012c81e728d9d180">《Go语言从入门到进阶实战（视频教学版）》</a>,当然这篇Blog并不是所有的内容都来自这本书，毕竟书中也有不足之处。</p><p><img src='/image-2021-10-12-16.26.00.000.png'></img></p><h1 id="2-Hello-World"><a href="#2-Hello-World" class="headerlink" title="2. Hello World"></a>2. Hello World</h1><p>学啥语言的第一步都是Hello World, 第一步是搭建开发环境，直接下载<a href="https://www.jetbrains.com/go/">Goland</a>，创建一个新的工程，点击create</p><p><img src='/image-2021-10-11-16.22.00.000.png'></img></p><span id="more"></span><p>建好项目以后，项目应该是下面这个样子的，当然我们不用关注这个go.mod是干什么的，我们只是利用IDE编写代码，使用命令行运行。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 go-study % tree</span><br><span class="line">.</span><br><span class="line">`-- go.mod</span><br><span class="line"></span><br><span class="line">0 directories, 1 file</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>然后新建一个main.go的文件，其内容如下</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;hello world&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后运行该文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 go-study % go run main.go</span><br><span class="line">hello world</span><br></pre></td></tr></table></figure><p>我们也可以编译为二进制文件，然后运行</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">s@HELLOWANG-MB1 go-study % go build main.go</span><br><span class="line">s@HELLOWANG-MB1 go-study % ls</span><br><span class="line">go.mod  main    main.go</span><br><span class="line">s@HELLOWANG-MB1 go-study % ./main</span><br><span class="line">hello world</span><br></pre></td></tr></table></figure><h1 id="3-Go的变量声明"><a href="#3-Go的变量声明" class="headerlink" title="3. Go的变量声明"></a>3. Go的变量声明</h1><p>变量的声明方式为<code>var &lt;变量名&gt; &lt;变量类型&gt;</code></p><p>例如下面的程序</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">int</span> <span class="comment">// 定义一个整形</span></span><br><span class="line">    fmt.Println(a)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>经过了命令行运行以后，可以转而使用IDE集成开发，点击按钮▶️</p><p><img src='/image-2021-10-11-16.43.00.000.png'></img></p><p>当然，还有更多的声明方式</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">int</span> <span class="comment">// 定义一个整形</span></span><br><span class="line">    fmt.Println(a)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> b <span class="type">int</span> = <span class="number">1</span> <span class="comment">// 定义并赋值</span></span><br><span class="line">    fmt.Println(b)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> c = <span class="number">2</span> <span class="comment">// 编译器自动推导</span></span><br><span class="line">    fmt.Println(c)</span><br><span class="line"></span><br><span class="line">    d := <span class="number">3</span> <span class="comment">// 精简写法</span></span><br><span class="line">    fmt.Println(d)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>最后还有一个小技巧，即函数返回可以是多个变量，用逗号分隔, <code>_</code>表示匿名变量，即忽略该位置的值。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    a := <span class="number">1</span></span><br><span class="line">    b := <span class="number">2</span></span><br><span class="line">    a, b = b, a</span><br><span class="line">    c, _ := a, b</span><br><span class="line">    _, d := a, b</span><br><span class="line">    fmt.Println(a, b, c, d)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="4-Go-的基础数据类型"><a href="#4-Go-的基础数据类型" class="headerlink" title="4. Go 的基础数据类型"></a>4. Go 的基础数据类型</h1><h2 id="4-1-整形"><a href="#4-1-整形" class="headerlink" title="4.1. 整形"></a>4.1. 整形</h2><p>有符号整型: <code>int8 int16 int32 int64</code></p><p>无符号整型: <code>uint8 uint16 uint32 uint64</code></p><p>平台自适应整形: <code>int uint</code>(自动根据平台决定整形的长度)</p><h2 id="4-2-浮点数"><a href="#4-2-浮点数" class="headerlink" title="4.2. 浮点数"></a>4.2. 浮点数</h2><p><code>float32 float64</code></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">float32</span> = <span class="number">1.5</span></span><br><span class="line">    <span class="keyword">var</span> b <span class="type">float64</span> = <span class="number">1.5</span></span><br><span class="line">    fmt.Println(a, b)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="4-3-布尔型"><a href="#4-3-布尔型" class="headerlink" title="4.3. 布尔型"></a>4.3. 布尔型</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">bool</span> = <span class="literal">true</span></span><br><span class="line">    fmt.Println(a)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="4-4-字符串"><a href="#4-4-字符串" class="headerlink" title="4.4. 字符串"></a>4.4. 字符串</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">string</span> = <span class="string">&quot;123&quot;</span></span><br><span class="line">    fmt.Println(a)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>多行字符串</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a <span class="type">string</span> = <span class="string">`  123你好</span></span><br><span class="line"><span class="string">    abcsdaf</span></span><br><span class="line"><span class="string">aslfnskflasjlfjoiwn</span></span><br><span class="line"><span class="string">    `</span></span><br><span class="line">    fmt.Println(a)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="5-Go的控制流"><a href="#5-Go的控制流" class="headerlink" title="5. Go的控制流"></a>5. Go的控制流</h1><h2 id="5-1-循环"><a href="#5-1-循环" class="headerlink" title="5.1. 循环"></a>5.1. 循环</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 类似与C的while</span></span><br><span class="line">    a := <span class="number">1</span></span><br><span class="line">    <span class="keyword">for</span> a &lt;= <span class="number">3</span> &#123;</span><br><span class="line">        fmt.Println(a)</span><br><span class="line">        a++</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 类似与C的while(true)</span></span><br><span class="line">    <span class="keyword">for</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;break&quot;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 类似于C的for</span></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">3</span>; i++ &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;hello&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="5-2-条件判断"><a href="#5-2-条件判断" class="headerlink" title="5.2. 条件判断"></a>5.2. 条件判断</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="number">1</span>+<span class="number">1</span> == <span class="number">2</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;1+1=2&quot;</span>)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;1+1!=2&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="5-3-switch"><a href="#5-3-switch" class="headerlink" title="5.3. switch"></a>5.3. switch</h2><p>需要注意的是Go的switch自带break，下面的程序只会输出3</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">switch</span> <span class="number">3</span> &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">        fmt.Println(<span class="number">3</span>)</span><br><span class="line">    <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">        fmt.Println(<span class="number">2</span>)</span><br><span class="line">    <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">        fmt.Println(<span class="number">1</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="6-Go的容器-x2F-集合"><a href="#6-Go的容器-x2F-集合" class="headerlink" title="6. Go的容器&#x2F;集合"></a>6. Go的容器&#x2F;集合</h1><h2 id="6-1-Map"><a href="#6-1-Map" class="headerlink" title="6.1. Map"></a>6.1. Map</h2><p>注意map需要指定key和value 的类型</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    mp := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">int</span>)</span><br><span class="line">    mp[<span class="string">&quot;k1&quot;</span>] = <span class="number">1</span></span><br><span class="line">    mp[<span class="string">&quot;k2&quot;</span>] = <span class="number">2</span></span><br><span class="line">    fmt.Println(mp)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">delete</span>(mp,<span class="string">&quot;k1&quot;</span>)</span><br><span class="line">    fmt.Println(mp)</span><br><span class="line">    </span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="6-2-数组"><a href="#6-2-数组" class="headerlink" title="6.2. 数组"></a>6.2. 数组</h2><p>数组长度固定, 创建数组也有很多种写法</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> arr1 []<span class="type">int</span> = <span class="built_in">make</span>([]<span class="type">int</span>, <span class="number">3</span>)</span><br><span class="line">    arr1[<span class="number">0</span>] = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    arr2 := [<span class="number">3</span>]<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>&#125;</span><br><span class="line">    arr3 := [...]<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>&#125;</span><br><span class="line"></span><br><span class="line">    fmt.Println(arr1, arr2, arr3)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// [1 0 0] [1 2 0] [1 2]</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>注意对于由字面量组成的数组，如果长度小于等于4，那么它将直接被分配到栈上，否则分配到静态区</p><h2 id="6-3-切片"><a href="#6-3-切片" class="headerlink" title="6.3. 切片"></a>6.3. 切片</h2><p>切片的创建可以是数组的一部分，也可以直接创建，切片可扩容</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> arr1 []<span class="type">int</span> = <span class="built_in">make</span>([]<span class="type">int</span>, <span class="number">3</span>) <span class="comment">// 数组</span></span><br><span class="line"></span><br><span class="line">    slice1 := arr1[<span class="number">1</span>:<span class="number">2</span>]</span><br><span class="line">    slice2 := []<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line">    slice3 := <span class="built_in">make</span>([]<span class="type">int</span>, <span class="number">3</span>)</span><br><span class="line"></span><br><span class="line">    fmt.Println(slice1, slice2, slice3)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// [0] [1 2 3] [0 0 0]</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>那么切片和数组有什么区别呢？其实切片只是数组的一个引用，任何一个切片，其背后一定有一个数组，当切片进行扩容的时候，会根据数组的剩余空间大小来决定附身到新的数组上，或者直接在原数组上扩容切片。</p><p>具体表现如下, 输出就在注释里面。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    arr1 := [...]<span class="type">int</span>&#123;<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>&#125;</span><br><span class="line"></span><br><span class="line">    slice1 := arr1[<span class="number">2</span>:<span class="number">5</span>]</span><br><span class="line">    slice2 := arr1[<span class="number">3</span>:<span class="number">6</span>]</span><br><span class="line"></span><br><span class="line">    fmt.Println(slice1, slice2)</span><br><span class="line">    arr1[<span class="number">4</span>]=<span class="number">0</span></span><br><span class="line">    fmt.Println(slice1, slice2)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// [2 3 4] [3 4 5]</span></span><br><span class="line"><span class="comment">// [2 3 0] [3 0 5]</span></span><br></pre></td></tr></table></figure><h2 id="6-3-列表"><a href="#6-3-列表" class="headerlink" title="6.3. 列表"></a>6.3. 列表</h2><p>列表可以自动伸缩</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;container/list&quot;</span></span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ls := list.New()</span><br><span class="line">    ls.PushBack(<span class="number">1</span>)</span><br><span class="line">    ls.PushBack(<span class="number">2</span>)</span><br><span class="line">    fmt.Println(ls)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="7-Go的函数"><a href="#7-Go的函数" class="headerlink" title="7. Go的函数"></a>7. Go的函数</h1><p>返回值写在参数后面</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">plus</span><span class="params">(a <span class="type">int</span>, b <span class="type">int</span>)</span></span> <span class="type">int</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    a := <span class="number">1</span></span><br><span class="line">    b := <span class="number">1</span></span><br><span class="line">    fmt.Println(plus(a, b))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>还可以选择返回多个值</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">swap</span><span class="params">(a <span class="type">int</span>, b <span class="type">int</span>)</span></span> (<span class="type">int</span>, <span class="type">int</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> b, a</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    a := <span class="number">1</span></span><br><span class="line">    b := <span class="number">2</span></span><br><span class="line">    fmt.Println(swap(a, b))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>变长的参数</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sum</span><span class="params">(a ...<span class="type">int</span>)</span></span> <span class="type">int</span> &#123;</span><br><span class="line">    s := <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="built_in">len</span>(a); i++ &#123;</span><br><span class="line">        s += a[i]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> s</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fmt.Println(sum(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>))</span><br><span class="line"></span><br><span class="line">    nums := []<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line">    fmt.Println(sum(nums...))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>返回一个函数</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">increase</span><span class="params">()</span></span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> <span class="type">int</span> &#123;</span><br><span class="line">    i := <span class="number">0</span></span><br><span class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> <span class="type">int</span> &#123;</span><br><span class="line">        i++</span><br><span class="line">        <span class="keyword">return</span> i</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fun := increase()</span><br><span class="line">    fmt.Println(fun())</span><br><span class="line">    fmt.Println(fun())</span><br><span class="line">    fmt.Println(fun())</span><br><span class="line">    fmt.Println(fun())</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="8-Go的指针"><a href="#8-Go的指针" class="headerlink" title="8. Go的指针"></a>8. Go的指针</h1><p>和C一样</p><h1 id="9-Go-的结构体"><a href="#9-Go-的结构体" class="headerlink" title="9. Go 的结构体"></a>9. Go 的结构体</h1><h2 id="9-1-结构体定义"><a href="#9-1-结构体定义" class="headerlink" title="9.1. 结构体定义"></a>9.1. 结构体定义</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> &lt;类型名&gt; <span class="keyword">struct</span> &#123;</span><br><span class="line">    &lt;字段<span class="number">1</span>名&gt; &lt;字段<span class="number">1</span>类型&gt;</span><br><span class="line">    &lt;字段<span class="number">2</span>名&gt; &lt;字段<span class="number">2</span>类型&gt;</span><br><span class="line">    &lt;字段<span class="number">3</span>名&gt; &lt;字段<span class="number">3</span>类型&gt;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>例子:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int32</span></span><br><span class="line">    Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="9-2-结构体实例化"><a href="#9-2-结构体实例化" class="headerlink" title="9.2. 结构体实例化"></a>9.2. 结构体实例化</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int32</span></span><br><span class="line">    Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> p Point</span><br><span class="line">    p.X = <span class="number">1</span></span><br><span class="line">    p.Y = <span class="number">2</span></span><br><span class="line">    fmt.Println(p.X, p.Y)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用new实例化,注意此时得到的p2是指针</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int32</span></span><br><span class="line">    Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    p2 := <span class="built_in">new</span>(Point)</span><br><span class="line">    fmt.Println(p2)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="9-3-结构体函数"><a href="#9-3-结构体函数" class="headerlink" title="9.3. 结构体函数"></a>9.3. 结构体函数</h2><p>结构体函数定义比普通函数定义在func和函数名之间多了一个结构体对象，这个对象一般使用指针</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int32</span></span><br><span class="line">    Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(p *Point)</span></span> getAndSet(X <span class="type">int32</span>, Y <span class="type">int32</span>) (<span class="type">int32</span>, <span class="type">int32</span>) &#123;</span><br><span class="line">    p.X, X = X, p.X <span class="comment">// swap</span></span><br><span class="line">    p.Y, Y = Y, p.Y <span class="comment">// swap</span></span><br><span class="line">    <span class="keyword">return</span> X, Y</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    p := <span class="built_in">new</span>(Point)</span><br><span class="line">    p.X, p.Y = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line">    fmt.Println(p.getAndSet(<span class="number">3</span>, <span class="number">4</span>))</span><br><span class="line">    fmt.Println(p.X, p.Y)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="9-4-结构体的Tag"><a href="#9-4-结构体的Tag" class="headerlink" title="9.4. 结构体的Tag"></a>9.4. 结构体的Tag</h2><p>结构体中的字段可以设置Tag，即给字段打上标签，就像Java中的注解一样。然后可以使用一种比较高级的技术（反射来获取这个标签）</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;reflect&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int</span> <span class="string">`name:&quot;XXX&quot; X:&quot;你好&quot;`</span></span><br><span class="line">    Y <span class="type">int</span> <span class="string">`name:&quot;YYY&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    p := &amp;Point&#123;</span><br><span class="line">        X: <span class="number">1</span>,</span><br><span class="line">        Y: <span class="number">2</span>,</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    field, _ := reflect.TypeOf(*p).FieldByName(<span class="string">&quot;X&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">println</span>(field.Tag)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 输出:</span></span><br><span class="line"><span class="comment">// name:&quot;XXX&quot; X:&quot;你好&quot;asdf</span></span><br></pre></td></tr></table></figure><h1 id="10-Go的接口"><a href="#10-Go的接口" class="headerlink" title="10. Go的接口"></a>10. Go的接口</h1><p>接口定义</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> &lt;接口类型名&gt; <span class="keyword">interface</span>&#123;</span><br><span class="line">    &lt;方法<span class="number">1</span>名&gt; (&lt;参数列表<span class="number">1</span>&gt;) 返回值列表<span class="number">1</span></span><br><span class="line">    &lt;方法<span class="number">2</span>名&gt; (&lt;参数列表<span class="number">2</span>&gt;) 返回值列表<span class="number">2</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>让结构体实现接口, 只需要让结构体的函数与接口保持一致即可，</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X <span class="type">int32</span></span><br><span class="line">    Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> GetAndSet <span class="keyword">interface</span> &#123;</span><br><span class="line">    invoke(X <span class="type">int32</span>, Y <span class="type">int32</span>) (<span class="type">int32</span>, <span class="type">int32</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(p *Point)</span></span> invoke(X <span class="type">int32</span>, Y <span class="type">int32</span>) (<span class="type">int32</span>, <span class="type">int32</span>) &#123;</span><br><span class="line">    p.X, X = X, p.X <span class="comment">// swap</span></span><br><span class="line">    p.Y, Y = Y, p.Y <span class="comment">// swap</span></span><br><span class="line">    <span class="keyword">return</span> X, Y</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    p := <span class="built_in">new</span>(Point)</span><br><span class="line">    p.X, p.Y = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> it GetAndSet = p</span><br><span class="line">    fmt.Println(it.invoke(<span class="number">3</span>, <span class="number">4</span>))</span><br><span class="line">    fmt.Println(p.X, p.Y)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="11-Go的包"><a href="#11-Go的包" class="headerlink" title="11. Go的包"></a>11. Go的包</h1><p>回到最开始的Helloworld，注意到第一行中的<code>package main</code>， 在Go中，有这样一个约定</p><blockquote><p>包名为main的包为应用程序的入口包，编译源码没有main包时，将无法编译输出可执行的文件。</p></blockquote><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;hello world&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="11-1-Go的包导出"><a href="#11-1-Go的包导出" class="headerlink" title="11.1. Go的包导出"></a>11.1. Go的包导出</h2><p>在Go中，首字母为小写的变量只能在包内使用，首字母为大写的变量会自动导出，可以在其他包使用。</p><p>这是第一个文件<code>mylib/mylib.go</code></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> mylib</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Add</span><span class="params">(a, b <span class="type">int32</span>)</span></span> <span class="type">int32</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">add</span><span class="params">(a, b <span class="type">int32</span>)</span></span> <span class="type">int32</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="11-2-Go的包导入"><a href="#11-2-Go的包导入" class="headerlink" title="11.2. Go的包导入"></a>11.2. Go的包导入</h2><p>然后是<code>main.go</code>, 注意到可以直接使用<code>Add</code>函数，但是不能使用<code>add</code>函数</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;go-study/mylib&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a, b <span class="type">int32</span> = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line">    fmt.Println(mylib.Add(a, b))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在导入的时候可以直接重命名，只需要在包名前加上一个名字即可</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    lb <span class="string">&quot;go-study/mylib&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a, b <span class="type">int32</span> = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line">    fmt.Println(lb.Add(a, b))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="11-3-Go的包的init函数"><a href="#11-3-Go的包的init函数" class="headerlink" title="11.3. Go的包的init函数"></a>11.3. Go的包的init函数</h2><p>一个包的init函数在包被引入时自动调用, 对于main包，init函数在main函数前运行</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> mylib</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Add</span><span class="params">(a, b <span class="type">int32</span>)</span></span> <span class="type">int32</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">add</span><span class="params">(a, b <span class="type">int32</span>)</span></span> <span class="type">int32</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span>&#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;hi&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    lb <span class="string">&quot;go-study/mylib&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;hi main&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a, b <span class="type">int32</span> = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line">    fmt.Println(lb.Add(a, b))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="12-Go的反射"><a href="#12-Go的反射" class="headerlink" title="12. Go的反射"></a>12. Go的反射</h1><h2 id="12-1-Go反射类型"><a href="#12-1-Go反射类型" class="headerlink" title="12.1. Go反射类型"></a>12.1. Go反射类型</h2><p>通过reflect包来进行反射，可以获得类型</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;reflect&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    a := <span class="number">1</span></span><br><span class="line">    ta := reflect.TypeOf(a)</span><br><span class="line">    fmt.Println(ta.Bits(), ta.Name(), ta.Kind())</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>对于name和kind的区别，看看下面这份代码就行了, name为Point，kind为struct</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;reflect&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X, Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a = Point&#123;&#125;</span><br><span class="line">    ta := reflect.TypeOf(a)</span><br><span class="line">    fmt.Println(ta.Name(), ta.Kind())</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="12-2-Go反射值"><a href="#12-2-Go反射值" class="headerlink" title="12.2. Go反射值"></a>12.2. Go反射值</h2><p>通过字段的名字获取属性</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;reflect&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Point <span class="keyword">struct</span> &#123;</span><br><span class="line">    X, Y <span class="type">int32</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> a = Point&#123;&#125;</span><br><span class="line">    ta := reflect.ValueOf(a)</span><br><span class="line">    fmt.Println(ta.FieldByName(<span class="string">&quot;X&quot;</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="13-Go的并发"><a href="#13-Go的并发" class="headerlink" title="13. Go的并发"></a>13. Go的并发</h1><h2 id="13-1-goroutine"><a href="#13-1-goroutine" class="headerlink" title="13.1. goroutine"></a>13.1. goroutine</h2><p>在关键词go后跟着一个函数调用，那么该函数调用就变成了goroutine，这是一个异步调用，立即返回</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">running</span><span class="params">()</span></span> &#123;</span><br><span class="line">    times := <span class="number">1</span></span><br><span class="line">    <span class="keyword">for</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;tick&quot;</span>, times)</span><br><span class="line">        times++</span><br><span class="line">        time.Sleep(time.Second)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">go</span> running()</span><br><span class="line">    <span class="keyword">for</span> &#123;</span><br><span class="line">        time.Sleep(time.Second)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="13-2-Go的通道"><a href="#13-2-Go的通道" class="headerlink" title="13.2. Go的通道"></a>13.2. Go的通道</h2><p>下面的程序会依次输出0和<code>hello</code>， 通道先进先出 <code>&lt;-</code>符号可以用来传输数据， 注意通道在发送和接受的时候都会阻塞,注意到最后一行有一个<code>time.Sleep(time.Second)</code>，这是为了等待goroutine完成，否则main退出以后goroutine会直接强制退出</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        ch &lt;- <span class="number">0</span></span><br><span class="line">        fmt.Println(<span class="string">&quot;send: 0&quot;</span>)</span><br><span class="line">        ch &lt;- <span class="string">&quot;hello&quot;</span></span><br><span class="line">        fmt.Println(<span class="string">&quot;send: hello&quot;</span>)</span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line"></span><br><span class="line">    data := &lt;-ch</span><br><span class="line">    fmt.Println(<span class="string">&quot;recv: &quot;</span>, data)</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line"></span><br><span class="line">    data = &lt;-ch</span><br><span class="line">    fmt.Println(<span class="string">&quot;recv: &quot;</span>, data)</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>另一种接受方法是使用for循环，代码如下，注意这个循环需要手动退出</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        ch &lt;- <span class="number">0</span></span><br><span class="line">        fmt.Println(<span class="string">&quot;send: 0&quot;</span>)</span><br><span class="line">        ch &lt;- <span class="string">&quot;hello&quot;</span></span><br><span class="line">        fmt.Println(<span class="string">&quot;send: hello&quot;</span>)</span><br><span class="line">        ch &lt;- <span class="string">&quot;break&quot;</span></span><br><span class="line">        fmt.Println(<span class="string">&quot;send: break&quot;</span>)</span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> data := <span class="keyword">range</span> ch &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;recv:&quot;</span>, data)</span><br><span class="line">        <span class="keyword">if</span> data == <span class="string">&quot;break&quot;</span> &#123;</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>最后通道还支持指定输入端和输出端，输入端只能做输入，输出端只能做输出</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> send <span class="keyword">chan</span>&lt;- <span class="keyword">interface</span>&#123;&#125; = ch</span><br><span class="line">    <span class="keyword">var</span> recv &lt;-<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125; = ch</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        send &lt;- <span class="number">0</span></span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    data := &lt;-recv</span><br><span class="line">    fmt.Println(<span class="string">&quot;recv:&quot;</span>, data)</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>创建带有缓冲区的通道, 只需要在make的第二个参数中填入数字即可</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;, <span class="number">10</span>)</span><br></pre></td></tr></table></figure><p>多路复用，使用select关键字，case区域写要选择的通道即可接收多个通道，下面的代码有时输出1，有时输出2</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ch1 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line">    ch2 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        ch1 &lt;- <span class="number">1</span></span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        ch2 &lt;- <span class="number">2</span></span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">select</span> &#123;</span><br><span class="line">    <span class="keyword">case</span> data := &lt;-ch1:</span><br><span class="line">        fmt.Println(<span class="string">&quot;recv from ch1: &quot;</span>, data)</span><br><span class="line">    <span class="keyword">case</span> data := &lt;-ch2:</span><br><span class="line">        fmt.Println(<span class="string">&quot;recv from ch2: &quot;</span>, data)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/R0T00O.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;





&lt;h1 id=&quot;1-开始学习Go&quot;&gt;&lt;a href=&quot;#1-开始学习Go&quot; class=&quot;headerlink&quot; title=&quot;1. 开始学习Go&quot;&gt;&lt;/a&gt;1. 开始学习Go&lt;/h1&gt;&lt;p&gt;从一本书开始，这本书叫做&lt;a href=&quot;https://weread.qq.com/web/reader/24d323407155597024d28a7kc81322c012c81e728d9d180&quot;&gt;《Go语言从入门到进阶实战（视频教学版）》&lt;/a&gt;,当然这篇Blog并不是所有的内容都来自这本书，毕竟书中也有不足之处。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#39;/image-2021-10-12-16.26.00.000.png&#39;&gt;&lt;/img&gt;&lt;/p&gt;
&lt;h1 id=&quot;2-Hello-World&quot;&gt;&lt;a href=&quot;#2-Hello-World&quot; class=&quot;headerlink&quot; title=&quot;2. Hello World&quot;&gt;&lt;/a&gt;2. Hello World&lt;/h1&gt;&lt;p&gt;学啥语言的第一步都是Hello World, 第一步是搭建开发环境，直接下载&lt;a href=&quot;https://www.jetbrains.com/go/&quot;&gt;Goland&lt;/a&gt;，创建一个新的工程，点击create&lt;/p&gt;
&lt;p&gt;&lt;img src=&#39;/image-2021-10-11-16.22.00.000.png&#39;&gt;&lt;/img&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Go" scheme="http://fightinggg.github.io/apollo/categories/Language/Go/"/>
    
    
    <category term="读书" scheme="http://fightinggg.github.io/apollo/tags/%E8%AF%BB%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>磁盘设备指令</title>
    <link href="http://fightinggg.github.io/apollo/R089MO.html"/>
    <id>http://fightinggg.github.io/apollo/R089MO.html</id>
    <published>2021-09-30T03:28:00.000Z</published>
    <updated>2021-09-30T03:28:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/R089MO.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><p>给磁盘分区</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fdisk /dev/vdc</span><br></pre></td></tr></table></figure><p>格式化分区</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkfs.ext4 /dev/vdc </span><br></pre></td></tr></table></figure><p>挂载磁盘</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /data/ssd &amp;&amp; mount /dev/vdc /data/ssd</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/R089MO.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
  </summary>
      
    
    
    
    <category term="操作系统" scheme="http://fightinggg.github.io/apollo/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Linux" scheme="http://fightinggg.github.io/apollo/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Linux/"/>
    
    
  </entry>
  
  <entry>
    <title>linux指令-systemctl</title>
    <link href="http://fightinggg.github.io/apollo/QZX4AC.html"/>
    <id>http://fightinggg.github.io/apollo/QZX4AC.html</id>
    <published>2021-09-24T02:59:00.000Z</published>
    <updated>2021-09-24T02:59:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/QZX4AC.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="查看开机启动项"><a href="#查看开机启动项" class="headerlink" title="查看开机启动项"></a>查看开机启动项</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl list-unit-files</span><br></pre></td></tr></table></figure><p>会看到有两列，左侧是服务的名字，右侧是服务的状态，enabled代表开机自启</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">UNIT FILE                                                                     STATE   </span><br><span class="line">docker-cfaf73bd979fa2fea877e7ae44193bf46318c1bc7fda16e14ffeaa8f8b397e04.scope static  </span><br><span class="line">docker-d66a6df41c6b8f1ce687c864a580638d8000f8095f29fbef936f7abc3ff3ec69.scope static  </span><br><span class="line">session-102.scope                                                             static  </span><br><span class="line">session-106.scope                                                             static  </span><br><span class="line">session-96.scope                                                              static  </span><br><span class="line">acpid.service                                                                 enabled </span><br><span class="line">arp-ethers.service                                                            disabled</span><br><span class="line">arptables.service                                                             disabled</span><br></pre></td></tr></table></figure><h1 id="禁用开机启动项"><a href="#禁用开机启动项" class="headerlink" title="禁用开机启动项"></a>禁用开机启动项</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl disable kubelet</span><br></pre></td></tr></table></figure><h1 id="启用开机启动"><a href="#启用开机启动" class="headerlink" title="启用开机启动"></a>启用开机启动</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl enable kubelet</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://linux.cn/article-5926-1.html">https://linux.cn/article-5926-1.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/QZX4AC.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
  </summary>
      
    
    
    
    <category term="操作系统" scheme="http://fightinggg.github.io/apollo/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Linux" scheme="http://fightinggg.github.io/apollo/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Linux/"/>
    
    
    <category term="linux指令" scheme="http://fightinggg.github.io/apollo/tags/linux%E6%8C%87%E4%BB%A4/"/>
    
  </entry>
  
  <entry>
    <title>Java运行时分析工具</title>
    <link href="http://fightinggg.github.io/apollo/QZX2O0.html"/>
    <id>http://fightinggg.github.io/apollo/QZX2O0.html</id>
    <published>2021-09-24T02:24:00.000Z</published>
    <updated>2021-09-24T11:27:00.000Z</updated>
    
    <content type="html"><![CDATA[<div><a href="/next/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">next</a><a href="/hexonext/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">hexonext</a><a href="/butterfly/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">butterfly</a><a href="/volantis/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">volantis</a><a href="/yearn/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yearn</a><a href="/yilia/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">yilia</a><a href="/shoka/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">shoka</a><a href="/indigo/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">indigo</a><a href="/apollo/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">apollo</a><a href="/landscape/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">landscape</a><a href="/cactus/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">cactus</a><a href="/matery/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">matery</a><a href="/icarus/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">icarus</a><a href="/fluid/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">fluid</a><a href="/material/QZX2O0.html" style="border-bottom: 0px;border-bottom: 0px;            background: #4FC921;            color: white;            border-radius: 5px;            padding: 2px 6px 2px 6px;            margin: 2px 6px 2px 6px;            text-decoration: none;            float: left;            ">material</a><div style="clear: both;"></div></div><h1 id="Jps"><a href="#Jps" class="headerlink" title="Jps"></a>Jps</h1><p>jps 可以看到运行中的java进程</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jps</span><br><span class="line">370 xxx.jar</span><br><span class="line">180682 Jps</span><br></pre></td></tr></table></figure><h1 id="Jcmd"><a href="#Jcmd" class="headerlink" title="Jcmd"></a>Jcmd</h1><p>jcmd可以看到运行中的java进程以及参数</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jcmd</span><br><span class="line">370 /usr/local/xxx.jar config_path=xxx.yaml</span><br><span class="line">180773 sun.tools.jcmd.JCmd</span><br></pre></td></tr></table></figure><h1 id="Jmap"><a href="#Jmap" class="headerlink" title="Jmap"></a>Jmap</h1><p>jmap是可以查看整个JVM内存的工具。</p><span id="more"></span><p><code>jmap -heap &lt;pid&gt;</code>即可查看JVM堆堆使用情况，主要有两块，一块是Heap配置，另一块是Heap使用情况。</p><p>Heap配置中包含了最小堆空余空间比例、最大比例、最大堆大小、新生代大小、老生代大小、新生代比例、老生代比例、原空间大小等等。这部分是Java进程启动的时候由JVM参数决定的</p><p>Heap Usage是堆的使用情况，包括新生代使用情况、老生代使用情况（容量、使用、未使用）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jmap -heap 364</span><br><span class="line">Attaching to process ID 364, please wait...</span><br><span class="line">Debugger attached successfully.</span><br><span class="line">Server compiler detected.</span><br><span class="line">JVM version is 25.252-b4</span><br><span class="line"></span><br><span class="line">using thread-local object allocation.</span><br><span class="line">Parallel GC with 48 thread(s)</span><br><span class="line"></span><br><span class="line">Heap Configuration:</span><br><span class="line">   MinHeapFreeRatio         = 0</span><br><span class="line">   MaxHeapFreeRatio         = 100</span><br><span class="line">   MaxHeapSize              = 32210157568 (30718.0MB)</span><br><span class="line">   NewSize                  = 715653120 (682.5MB)</span><br><span class="line">   MaxNewSize               = 10736369664 (10239.0MB)</span><br><span class="line">   OldSize                  = 1431830528 (1365.5MB)</span><br><span class="line">   NewRatio                 = 2</span><br><span class="line">   SurvivorRatio            = 8</span><br><span class="line">   MetaspaceSize            = 21807104 (20.796875MB)</span><br><span class="line">   CompressedClassSpaceSize = 1073741824 (1024.0MB)</span><br><span class="line">   MaxMetaspaceSize         = 17592186044415 MB</span><br><span class="line">   G1HeapRegionSize         = 0 (0.0MB)</span><br><span class="line"></span><br><span class="line">Heap Usage:</span><br><span class="line">PS Young Generation</span><br><span class="line">Eden Space:</span><br><span class="line">   capacity = 88604672 (84.5MB)</span><br><span class="line">   used     = 6212968 (5.925148010253906MB)</span><br><span class="line">   free     = 82391704 (78.5748519897461MB)</span><br><span class="line">   7.0120094795904215% used</span><br><span class="line">From Space:</span><br><span class="line">   capacity = 9961472 (9.5MB)</span><br><span class="line">   used     = 1900544 (1.8125MB)</span><br><span class="line">   free     = 8060928 (7.6875MB)</span><br><span class="line">   19.07894736842105% used</span><br><span class="line">To Space:</span><br><span class="line">   capacity = 9961472 (9.5MB)</span><br><span class="line">   used     = 0 (0.0MB)</span><br><span class="line">   free     = 9961472 (9.5MB)</span><br><span class="line">   0.0% used</span><br><span class="line">PS Old Generation</span><br><span class="line">   capacity = 1482162176 (1413.5MB)</span><br><span class="line">   used     = 230906152 (220.20926666259766MB)</span><br><span class="line">   free     = 1251256024 (1193.2907333374023MB)</span><br><span class="line">   15.57900719226018% used</span><br><span class="line"></span><br><span class="line">20563 interned Strings occupying 1939392 bytes.</span><br></pre></td></tr></table></figure><p><code>jmap -histo &lt;pid&gt;</code>可以查看JVM内存中每个类的内存使用情况</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jmap -histo 370 | less</span><br><span class="line">num     #instances         #bytes  class name</span><br><span class="line">----------------------------------------------</span><br><span class="line">   1:       1887996      284532232  [C</span><br><span class="line">   2:         51934       55537536  [I</span><br><span class="line">   3:       1368797       51696928  [B</span><br><span class="line">   4:       1686385       46376560  [Ljava.lang.Object;</span><br><span class="line">   5:        846166       33846640  java.util.TreeMap$Entry</span><br><span class="line">   6:        494971       23758608  java.util.TreeMap</span><br><span class="line">   7:        984173       23620152  java.lang.String</span><br><span class="line">   8:        349310       19561360  sun.nio.cs.UTF_8$Encoder</span><br><span class="line">   9:        495105       15843360  java.util.Collections$UnmodifiableMap</span><br><span class="line">  10:        494750       15832000  java.util.TreeMap$EntryIterator</span><br><span class="line">  11:        494925       11878200  java.util.Arrays$ArrayList</span><br><span class="line">  12:        473586       11366064  java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1</span><br></pre></td></tr></table></figure><p><code>jmap -finalizerinfo &lt;pid&gt;</code>可以看到有多少个对象在等待finalizer</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jmap -finalizerinfo 370</span><br><span class="line">Attaching to process ID 370, please wait...</span><br><span class="line">Debugger attached successfully.</span><br><span class="line">Server compiler detected.</span><br><span class="line">JVM version is 25.252-b4</span><br><span class="line">Number of objects pending for finalization: 0</span><br></pre></td></tr></table></figure><p><code>jmap -dump:format=b,file=dump.bin 370</code> 可以把堆中的数据导出到二进制文件中</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jmap -dump:format=b,file=dump.bin 370</span><br><span class="line">Heap dump file created</span><br><span class="line">sh-4.2$ ls</span><br><span class="line">dump.bin</span><br></pre></td></tr></table></figure><h1 id="Jstack"><a href="#Jstack" class="headerlink" title="Jstack"></a>Jstack</h1><p><code>jstack &lt;pid&gt;</code>可以看到所有线程目前的栈信息。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&quot;Finalizer&quot; #3 daemon prio=8 os_prio=0 tid=0x00007fd8506eb000 nid=0x1a7 in Object.wait() [0x00007fd77b826000]</span><br><span class="line">   java.lang.Thread.State: WAITING (on object monitor)</span><br><span class="line">        at java.lang.Object.wait(Native Method)</span><br><span class="line">        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)</span><br><span class="line">        - locked &lt;0x000000008023bb50&gt; (a java.lang.ref.ReferenceQueue$Lock)</span><br><span class="line">        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)</span><br><span class="line">        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)</span><br><span class="line"></span><br><span class="line">&quot;Reference Handler&quot; #2 daemon prio=10 os_prio=0 tid=0x00007fd8506de800 nid=0x1a6 in Object.wait() [0x00007fd77baf9000]</span><br><span class="line">   java.lang.Thread.State: WAITING (on object monitor)</span><br><span class="line">        at java.lang.Object.wait(Native Method)</span><br><span class="line">        at java.lang.Object.wait(Object.java:502)</span><br><span class="line">        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)</span><br><span class="line">        - locked &lt;0x00000000802478a8&gt; (a java.lang.ref.Reference$Lock)</span><br><span class="line">        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)</span><br><span class="line"></span><br><span class="line">&quot;VM Thread&quot; os_prio=0 tid=0x00007fd8506db000 nid=0x1a5 runnable</span><br><span class="line"></span><br><span class="line">&quot;GC task thread#0 (ParallelGC)&quot; os_prio=0 tid=0x00007fd85001f000 nid=0x175 runnable</span><br><span class="line"></span><br><span class="line">&quot;GC task thread#1 (ParallelGC)&quot; os_prio=0 tid=0x00007fd850021000 nid=0x176 runnable</span><br></pre></td></tr></table></figure><h1 id="Jstat"><a href="#Jstat" class="headerlink" title="Jstat"></a>Jstat</h1><h2 id="options"><a href="#options" class="headerlink" title="options"></a>options</h2><p>查看options</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -options</span><br><span class="line">-class</span><br><span class="line">-compiler</span><br><span class="line">-gc</span><br><span class="line">-gccapacity</span><br><span class="line">-gccause</span><br><span class="line">-gcmetacapacity</span><br><span class="line">-gcnew</span><br><span class="line">-gcnewcapacity</span><br><span class="line">-gcold</span><br><span class="line">-gcoldcapacity</span><br><span class="line">-gcutil</span><br><span class="line">-printcompilation</span><br></pre></td></tr></table></figure><h2 id="类加载情况"><a href="#类加载情况" class="headerlink" title="类加载情况"></a>类加载情况</h2><p>查看类的个数, 每1000毫秒打印一次，一共打印10次</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -class 370 1000 10</span><br><span class="line">Loaded  Bytes  Unloaded  Bytes     Time</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br><span class="line"> 12501 23290.5        0     0.0       9.15</span><br></pre></td></tr></table></figure><h2 id="JIT情况"><a href="#JIT情况" class="headerlink" title="JIT情况"></a>JIT情况</h2><p>查看JIT实时编译器编译的情况</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -compiler 370 1000 3</span><br><span class="line">Compiled Failed Invalid   Time   FailedType FailedMethod</span><br><span class="line">   12448      5       0    68.28          1 io/netty/buffer/SizeClasses sizeClass</span><br><span class="line">   12448      5       0    68.28          1 io/netty/buffer/SizeClasses sizeClass</span><br><span class="line">   12448      5       0    68.28          1 io/netty/buffer/SizeClasses sizeClass</span><br></pre></td></tr></table></figure><h2 id="GC情况"><a href="#GC情况" class="headerlink" title="GC情况"></a>GC情况</h2><p>查看GC情况，每一列分别对应</p><table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>S0C</td><td>第一个survivor的容量</td><td></td></tr><tr><td>S1C</td><td>第二个survivor的容量</td><td></td></tr><tr><td>S0U</td><td>第一个survivor的使用空间</td><td></td></tr><tr><td>S1U</td><td>第二个survivor的使用空间</td><td></td></tr><tr><td>EC</td><td>eden容量</td><td>eden和survivor的比例是8:1:1</td></tr><tr><td>EU</td><td>eden使用空间</td><td></td></tr><tr><td>OC</td><td>老年代容量</td><td></td></tr><tr><td>OU</td><td>老年代使用空间</td><td></td></tr><tr><td>MC</td><td>方法区的容量</td><td></td></tr><tr><td>MU</td><td>方法区使用空间</td><td></td></tr><tr><td>CCSC</td><td>压缩类容量</td><td>注意被压缩的不是类，而是对象头中指向类的指针被压缩成32位了</td></tr><tr><td>CCSU</td><td>压缩类使用空间</td><td></td></tr><tr><td>YGC</td><td>YGC的次数</td><td></td></tr><tr><td>YGCT</td><td>YGC的时间</td><td></td></tr><tr><td>FGC</td><td>FULL GC的次数</td><td></td></tr><tr><td>FGCT</td><td>FULL GC的时间</td><td></td></tr><tr><td>GCT</td><td>GC总时间</td><td></td></tr></tbody></table><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -gc 370 1000 3</span><br><span class="line"> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT</span><br><span class="line">1024.0 9728.0 576.0   0.0   485888.0 256731.1 1941504.0   60846.4   67968.0 64626.7 8576.0 7907.2     96    1.053   3      0.343    1.396</span><br><span class="line">1024.0 9728.0 576.0   0.0   485888.0 299599.8 1941504.0   60846.4   67968.0 64626.7 8576.0 7907.2     96    1.053   3      0.343    1.396</span><br><span class="line">1024.0 9728.0 576.0   0.0   485888.0 340310.0 1941504.0   60846.4   67968.0 64626.7 8576.0 7907.2     96    1.053   3      0.343    1.396</span><br></pre></td></tr></table></figure><h2 id="GC-capacity情况"><a href="#GC-capacity情况" class="headerlink" title="GC capacity情况"></a>GC capacity情况</h2><p>主要关注各区域最大最小空间</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -gccapacity 370 1000 3</span><br><span class="line"> NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC</span><br><span class="line">698880.0 10484736.0 850944.0 8192.0 13824.0 213504.0  1398272.0 20970496.0  1941504.0  1941504.0      0.0 1110016.0  68224.0      0.0 1048576.0   8576.0    228     3</span><br><span class="line">698880.0 10484736.0 850944.0 8192.0 13824.0 213504.0  1398272.0 20970496.0  1941504.0  1941504.0      0.0 1110016.0  68224.0      0.0 1048576.0   8576.0    228     3</span><br><span class="line">698880.0 10484736.0 850944.0 8192.0 13824.0 213504.0  1398272.0 20970496.0  1941504.0  1941504.0      0.0 1110016.0  68224.0      0.0 1048576.0   8576.0    228     3</span><br></pre></td></tr></table></figure><h2 id="GC-cause-情况"><a href="#GC-cause-情况" class="headerlink" title="GC cause 情况"></a>GC cause 情况</h2><p>主要关注导致GC的原因</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -gccause 370 1000 3</span><br><span class="line">  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC</span><br><span class="line"> 93.81   0.00  73.52   4.29  95.02  92.27    240    2.204     3    0.343    2.546 Allocation Failure   No GC</span><br><span class="line"> 93.81   0.00  73.52   4.29  95.02  92.27    240    2.204     3    0.343    2.546 Allocation Failure   No GC</span><br><span class="line"> 93.81   0.00  73.53   4.29  95.02  92.27    240    2.204     3    0.343    2.546 Allocation Failure   No GC</span><br></pre></td></tr></table></figure><h2 id="GC-utils情况"><a href="#GC-utils情况" class="headerlink" title="GC utils情况"></a>GC utils情况</h2><p>主要关注内存占比</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -gcutil 370 1000 3</span><br><span class="line">  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT</span><br><span class="line">  0.00  96.98  13.54   4.28  95.01  92.27    235    2.167     3    0.343    2.510</span><br><span class="line">  0.00  96.98  13.54   4.28  95.01  92.27    235    2.167     3    0.343    2.510</span><br><span class="line">  0.00  96.98  13.56   4.28  95.01  92.27    235    2.167     3    0.343    2.510</span><br></pre></td></tr></table></figure><h2 id="printcompilation情况"><a href="#printcompilation情况" class="headerlink" title="printcompilation情况"></a>printcompilation情况</h2><p>JIT的方法</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jstat -printcompilation 370 1000 3</span><br><span class="line">Compiled  Size  Type Method</span><br><span class="line">   13367    285    1 javax/management/ObjectName setCanonicalName</span><br><span class="line">   13367    285    1 javax/management/ObjectName setCanonicalName</span><br><span class="line">   13367    285    1 javax/management/ObjectName setCanonicalName</span><br></pre></td></tr></table></figure><h1 id="Jinfo"><a href="#Jinfo" class="headerlink" title="Jinfo"></a>Jinfo</h1><p>jinfo能输出一个进程的基本信息，包括他的配置、用户、路径、命令行等等</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jinfo 370</span><br><span class="line">Attaching to process ID 370, please wait...</span><br><span class="line">Debugger attached successfully.</span><br><span class="line">Server compiler detected.</span><br><span class="line">JVM version is 25.252-b4</span><br><span class="line">Java System Properties:</span><br><span class="line"></span><br><span class="line">java.runtime.name = OpenJDK Runtime Environment</span><br><span class="line">java.vm.version = 25.252-b4</span><br><span class="line">java.protocol.handler.pkgs = org.springframework.boot.loader</span><br><span class="line">path.separator = :</span><br><span class="line">file.encoding.pkg = sun.io</span><br><span class="line">java.vm.name = OpenJDK 64-Bit Server VM</span><br></pre></td></tr></table></figure><h1 id="Jhat"><a href="#Jhat" class="headerlink" title="Jhat"></a>Jhat</h1><p>jhat是堆快照分析工具，用于分析堆的情况，首先要用jmap导出堆到文件dump.bin中，然后使用jhat分析,再访问7000端口即可</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jhat  dump.bin</span><br><span class="line">Reading from dump.bin...</span><br><span class="line">Dump file created Fri Sep 24 19:38:36 CST 2021</span><br><span class="line">Snapshot read, resolving...</span><br><span class="line">Resolving 4748880 objects...</span><br><span class="line">Chasing references, expect 949 dots.............</span><br><span class="line">Eliminating duplicate references..............</span><br><span class="line">Snapshot resolved.</span><br><span class="line">Started HTTP server on port 7000</span><br><span class="line">Server is ready.</span><br></pre></td></tr></table></figure><p><img src='/image-2021-09-24-19.42.00.000.png'></img></p><h1 id="Javah"><a href="#Javah" class="headerlink" title="Javah"></a>Javah</h1><p>用于编写JNI方法</p><h1 id="JavaP"><a href="#JavaP" class="headerlink" title="JavaP"></a>JavaP</h1><p>字节码分析工具</p><h1 id="Jshell"><a href="#Jshell" class="headerlink" title="Jshell"></a>Jshell</h1><p>Java交互式工具</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sh-4.2$ jshell</span><br><span class="line">|  欢迎使用 JShell -- 版本 16.0.2</span><br><span class="line">|  要大致了解该版本, 请键入: /help intro</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">jshell&gt; </span><span class="language-bash">int a = 1</span></span><br><span class="line">a ==&gt; 1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">jshell&gt; </span><span class="language-bash">int b = 1</span></span><br><span class="line">b ==&gt; 1</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">jshell&gt; </span><span class="language-bash">System.out.print(a+b)</span></span><br><span class="line">2</span><br><span class="line"><span class="meta prompt_">jshell&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;div&gt;&lt;a href=&quot;/next/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;next&lt;/a&gt;&lt;a href=&quot;/hexonext/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;hexonext&lt;/a&gt;&lt;a href=&quot;/butterfly/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;butterfly&lt;/a&gt;&lt;a href=&quot;/volantis/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;volantis&lt;/a&gt;&lt;a href=&quot;/yearn/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yearn&lt;/a&gt;&lt;a href=&quot;/yilia/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;yilia&lt;/a&gt;&lt;a href=&quot;/shoka/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;shoka&lt;/a&gt;&lt;a href=&quot;/indigo/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;indigo&lt;/a&gt;&lt;a href=&quot;/apollo/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;apollo&lt;/a&gt;&lt;a href=&quot;/landscape/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;landscape&lt;/a&gt;&lt;a href=&quot;/cactus/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;cactus&lt;/a&gt;&lt;a href=&quot;/matery/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;matery&lt;/a&gt;&lt;a href=&quot;/icarus/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;icarus&lt;/a&gt;&lt;a href=&quot;/fluid/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;fluid&lt;/a&gt;&lt;a href=&quot;/material/QZX2O0.html&quot; style=&quot;border-bottom: 0px;border-bottom: 0px;
            background: #4FC921;
            color: white;
            border-radius: 5px;
            padding: 2px 6px 2px 6px;
            margin: 2px 6px 2px 6px;
            text-decoration: none;
            float: left;
            &quot;&gt;material&lt;/a&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;



&lt;h1 id=&quot;Jps&quot;&gt;&lt;a href=&quot;#Jps&quot; class=&quot;headerlink&quot; title=&quot;Jps&quot;&gt;&lt;/a&gt;Jps&lt;/h1&gt;&lt;p&gt;jps 可以看到运行中的java进程&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;sh-4.2$ jps&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;370 xxx.jar&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;180682 Jps&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&quot;Jcmd&quot;&gt;&lt;a href=&quot;#Jcmd&quot; class=&quot;headerlink&quot; title=&quot;Jcmd&quot;&gt;&lt;/a&gt;Jcmd&lt;/h1&gt;&lt;p&gt;jcmd可以看到运行中的java进程以及参数&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;sh-4.2$ jcmd&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;370 /usr/local/xxx.jar config_path=xxx.yaml&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;180773 sun.tools.jcmd.JCmd&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;



&lt;h1 id=&quot;Jmap&quot;&gt;&lt;a href=&quot;#Jmap&quot; class=&quot;headerlink&quot; title=&quot;Jmap&quot;&gt;&lt;/a&gt;Jmap&lt;/h1&gt;&lt;p&gt;jmap是可以查看整个JVM内存的工具。&lt;/p&gt;</summary>
    
    
    
    <category term="Language" scheme="http://fightinggg.github.io/apollo/categories/Language/"/>
    
    <category term="Java" scheme="http://fightinggg.github.io/apollo/categories/Language/Java/"/>
    
    
  </entry>
  
</feed>
