<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>笔记 on KANIKIG BLOG</title>
    <link>https://blog.kanikig.xyz/tags/%E7%AC%94%E8%AE%B0/</link>
    <description>Recent content in 笔记 on KANIKIG BLOG</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 13 Jan 2022 16:12:37 +0000</lastBuildDate><atom:link href="https://blog.kanikig.xyz/tags/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Golang基础笔记</title>
      <link>https://blog.kanikig.xyz/Golang%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 13 Jan 2022 16:12:37 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/Golang%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</guid>
      <description>前言 Go简介 Google开源 编译型语言 21世界的C语言 2005年出现多核处理器，其他语言都是单核时代诞生的。Go天生考虑了多核并发。 特点： 语</description>
      <content:encoded><![CDATA[<h2 id="前言">前言</h2>
<h3 id="go简介">Go简介</h3>
<ul>
<li>Google开源</li>
<li>编译型语言</li>
<li>21世界的C语言</li>
</ul>
<p>2005年出现多核处理器，其他语言都是单核时代诞生的。Go天生考虑了多核并发。</p>
<p>特点：</p>
<ul>
<li>语法简洁（只有25个关键字，比Python更简洁，自带格式化，互相阅读容易）</li>
<li>开发效率高</li>
<li>执行性能好（接近java）</li>
</ul>
<p>发展：</p>
<p>百度自动驾驶，小程序</p>
<p>腾讯蓝鲸，微服务框架</p>
<p>知乎最早用python写，后期承受不了负载，用go重构节约了80%资源。</p>
<h3 id="课程简介">课程简介</h3>
<p><a href="https://www.liwenzhou.com">李文周博客</a></p>
<p><a href="https://github.com/Q1mi/go_tutorial">仓库</a></p>
<p>8周基础</p>
<p>3个实战项目</p>
<h3 id="go项目结构">Go项目结构</h3>
<p>个人开发者</p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2022/01/13/image-20220113164729380.png" alt="image-20220113164729380"  /></p>
<p>流行方式</p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2022/01/13/image-20220113165000771.png" alt="image-20220113165000771"  /></p>
<h2 id="helloworld">Helloworld</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">go build
</span></span></code></pre></div><p>win编译得exe，macos得可执行文件</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">go install
</span></span></code></pre></div><p>install相当于build后再移到bin</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">go run
</span></span></code></pre></div><p>当脚本运行</p>
<p>支持跨平台交叉编译</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">// wincmd SET, macos <span class="nb">export</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CGO_ENABLED</span><span class="o">=</span>0	//禁用CGO
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GOOS</span><span class="o">=</span>linux	//设置目标平台linux,windows,darwin
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GOARCH</span><span class="o">=</span>amd64//目标处理器架构是amd64
</span></span><span class="line"><span class="cl">go build
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CGO_ENABLED</span><span class="o">=</span><span class="m">0</span> <span class="nv">GOOS</span><span class="o">=</span>linux <span class="nv">GOARCH</span><span class="o">=</span>amd64
</span></span><span class="line"><span class="cl">go build
</span></span></code></pre></div><h2 id="变量与常量">变量与常量</h2>
<p>函数外不能写语句</p>
<p>标识符：字母数字下划线，不以数字开头</p>
<p>关键字与保留字不建议用于变量名</p>
<h3 id="变量">变量</h3>
<h4 id="初始化">初始化</h4>
<p>数字默认<code>0</code>，字符串默认空，布尔默认<code>false</code>，切片、函数、指针默认<code>nil</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">变量名</span> <span class="nx">类型</span> <span class="p">=</span> <span class="nx">表达式</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">name</span> <span class="kt">string</span> <span class="p">=</span> <span class="s">&#34;Q1mi&#34;</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">age</span> <span class="kt">int</span> <span class="p">=</span> <span class="mi">18</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">age</span> <span class="p">=</span> <span class="s">&#34;Q1mi&#34;</span><span class="p">,</span> <span class="mi">20</span>	<span class="c1">//会根据值推导类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">var</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="nx">a</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">b</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">c</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl">    <span class="nx">d</span> <span class="kt">float32</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>写在函数外为全局变量</p>
<p>函数内声明局部变量简写为</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">n</span> <span class="o">:=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">	<span class="nx">m</span> <span class="o">:=</span> <span class="mi">200</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">m</span><span class="p">,</span> <span class="nx">n</span><span class="p">)</span>
</span></span></code></pre></div><blockquote>
<p>注意：在Golang里非全局变量声明必须使用，不然编译不通过！</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span> <span class="c1">//换行
</span></span></span></code></pre></div><blockquote>
<p>保存时会自动格式化</p>
</blockquote>
<h4 id="命名规则">命名规则</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">studentName</span> <span class="kt">string</span>
</span></span></code></pre></div><blockquote>
<p>Golang使用小驼峰命名</p>
</blockquote>
<h4 id="匿名变量">匿名变量</h4>
<p>用短下划线接收，不占命名空间，不分配内存</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">x</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nf">foo</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nx">_</span><span class="p">,</span> <span class="nx">y</span> <span class="p">=</span> <span class="nf">foo</span><span class="p">()</span>
</span></span></code></pre></div><h3 id="常量">常量</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span> <span class="nx">pi</span> <span class="p">=</span> <span class="mf">3.14</span>
</span></span></code></pre></div><h4 id="iota">iota</h4>
<p>常量计数器，每新增<strong>一行</strong>常量声明则计数，注意是一行</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="nx">n1</span> <span class="p">=</span> <span class="kc">iota</span> <span class="c1">//0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">n2</span>	<span class="c1">//1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">n3</span>	<span class="c1">//2
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">n4</span>	<span class="c1">//3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="nx">n1</span> <span class="p">=</span> <span class="kc">iota</span> <span class="c1">//0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">n2</span>	<span class="c1">//1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">_</span>	<span class="c1">//2 但是被丢弃
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">n3</span>	<span class="c1">//3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">)</span>
</span></span></code></pre></div><h4 id="定义数量级">定义数量级</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="nx">_</span> <span class="p">=</span> <span class="kc">iota</span>
</span></span><span class="line"><span class="cl">  <span class="nx">KB</span> <span class="p">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="mi">10</span> <span class="o">*</span> <span class="kc">iota</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">MB</span> <span class="p">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="mi">10</span> <span class="o">*</span> <span class="kc">iota</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">GB</span> <span class="p">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="mi">10</span> <span class="o">*</span> <span class="kc">iota</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">TB</span> <span class="p">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="mi">10</span> <span class="o">*</span> <span class="kc">iota</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">PB</span> <span class="p">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="mi">10</span> <span class="o">*</span> <span class="kc">iota</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>&laquo; 左移符号，二进制1左移10位是1024</p>
<h2 id="基本数据类型">基本数据类型</h2>
<p>整型分为以下两个大类：按长度分为：int8、int16、int32、int64</p>
<p>对应的无符号整型：uint8、uint16、uint32、uint64</p>
<p>uint8就是byte，int16就是short，int64是long</p>
<h3 id="特殊整型">特殊整型</h3>
<p><code>uint int</code> 会根据系统判别是32还是64</p>
<p><code>uintptr</code> 指针，存放内存地址</p>
<h3 id="进制">进制</h3>
<blockquote>
<p>Golang无法直接定义二进制数，八、十六均可</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="c1">// 十进制
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">a</span> <span class="kt">int</span> <span class="p">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d \n&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">)</span>  <span class="c1">// 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%b \n&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">)</span>  <span class="c1">// 1010  占位符%b表示二进制
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> 
</span></span><span class="line"><span class="cl">	<span class="c1">// 八进制  以0开头
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">b</span> <span class="kt">int</span> <span class="p">=</span> <span class="mo">077</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%o \n&#34;</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span>  <span class="c1">// 77
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> 
</span></span><span class="line"><span class="cl">	<span class="c1">// 十六进制  以0x开头
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">c</span> <span class="kt">int</span> <span class="p">=</span> <span class="mh">0xff</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%x \n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>  <span class="c1">// ff
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%X \n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>  <span class="c1">// FF
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%T \n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>  <span class="c1">// 输出类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v \n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>  <span class="c1">// 输出变量值，任意类型
</span></span></span></code></pre></div><h3 id="浮点数">浮点数</h3>
<p>golang中小数默认<code>float64</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">math</span><span class="p">.</span><span class="nx">MaxFloat64</span> <span class="c1">// float64最大值
</span></span></span></code></pre></div><h3 id="布尔">布尔</h3>
<p>默认false，不允许转换</p>
<h3 id="字符串">字符串</h3>
<p>只能双引号，单引号为字符</p>
<table>
<thead>
<tr>
<th>转义</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>\r</td>
<td>返回行首</td>
</tr>
<tr>
<td>\n</td>
<td>换行（下行同列）</td>
</tr>
<tr>
<td>\t</td>
<td>制表</td>
</tr>
</tbody>
</table>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 在win中路径转义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">s</span> <span class="o">:=</span> <span class="s">&#34;D:\\Documents\\A&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 反引号原样输出, 多行字符串
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">s</span> <span class="o">:=</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s">asda
</span></span></span><span class="line"><span class="cl"><span class="s">		asd
</span></span></span><span class="line"><span class="cl"><span class="s">`</span>
</span></span><span class="line"><span class="cl"><span class="nx">s</span> <span class="o">:=</span> <span class="s">&#34;D:\Documents\A&#34;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nb">len</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ss</span> <span class="o">:=</span> <span class="nx">s1</span> <span class="o">+</span> <span class="nx">s2</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="o">:=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;\\&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Contains</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;abcd&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">HasPrefix</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;abcd&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">HasSufix</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;abcd&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Index</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;c&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">LastIndex</span><span class="p">(</span><span class="nx">s3</span><span class="p">,</span> <span class="s">&#34;c&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">ret</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span>
</span></span></code></pre></div><p>英文字符为<code>byte</code>，其他语系如中文字符为<code>rune</code>，实际为<code>int32</code>，占3位</p>
<p>字符串遍历</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">char</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">str</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span> <span class="nx">char</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>字符串没法直接修改，只能转换为其他类型处理</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">s3</span> <span class="o">:=</span> <span class="p">[]</span><span class="nb">rune</span><span class="p">(</span><span class="nx">s2</span><span class="p">)</span>	<span class="c1">//切片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">s3</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="sc">&#39;e&#39;</span>	<span class="c1">//修改
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">s4</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">s3</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="流程控制">流程控制</h2>
<h3 id="if">if</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">表达式1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">分支1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">表达式2</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">分支2</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">分支3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 局部变量score只在if中生效，减少内存占用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="k">if</span> <span class="nx">score</span> <span class="o">:=</span> <span class="mi">65</span><span class="p">;</span> <span class="nx">score</span> <span class="o">&gt;=</span> <span class="mi">90</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;A&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">score</span> <span class="p">&gt;</span> <span class="mi">75</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;B&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;C&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="for">for</h3>
<p>golang只有for</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">初始语句</span><span class="p">;</span><span class="nx">条件表达式</span><span class="p">;</span><span class="nx">结束语句</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">循环体语句</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>初始语句和结束语句可省略，相当于while</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">i</span><span class="o">++</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><p>无限循环</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">循环体语句</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>通过<code>break</code>、<code>goto</code>、<code>return</code>、<code>panic</code>语句强制退出循环</p>
<h3 id="遍历">遍历</h3>
<p><code>for range</code>遍历数组、切片、字符串、map 及通道（channel）</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">i</span><span class="p">,</span><span class="nx">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">s</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><ol>
<li>数组、切片、字符串返回索引和值。</li>
<li>map返回键和值。</li>
<li>通道（channel）只返回通道内的值。</li>
</ol>
<h3 id="switch">switch</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">finger</span> <span class="o">:=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">	<span class="k">switch</span> <span class="nx">finger</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;大拇指&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">fallthrough</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;食指&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;中指&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">4</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;无名指&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">5</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;小拇指&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">default</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;无效的输入！&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><p><code>fallthrough</code>语法可以执行满足条件的case的下一个case，是为了兼容C语言中的case设计的</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">switch</span> <span class="nx">n</span> <span class="o">:=</span> <span class="mi">7</span><span class="p">;</span> <span class="nx">n</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;奇数&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;偶数&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">default</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="goto">goto</h3>
<p><code>goto</code>语句通过标签进行代码间的无条件跳转。<code>goto</code>语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用<code>goto</code>语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">breakFlag</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">j</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="nx">j</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="c1">// 设置退出标签
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">breakFlag</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v-%v\n&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">j</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// 外层for循环判断
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">if</span> <span class="nx">breakFlag</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">break</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><p>简化为</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">j</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="nx">j</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="c1">// 设置退出标签
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="k">goto</span> <span class="nx">breakTag</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v-%v\n&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">j</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 标签
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">breakTag</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;结束for循环&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="运算符">运算符</h2>
<p><code>++</code>（自增）和<code>--</code>（自减）在Go语言中是单独的语句，并不是运算符。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 逻辑运算
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">&amp;&amp;</span>
</span></span><span class="line"><span class="cl"><span class="o">||</span>
</span></span><span class="line"><span class="cl"><span class="p">!</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 位运算
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="p">^</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;&lt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 赋值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">+=</span>
</span></span><span class="line"><span class="cl"><span class="o">-=</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;&lt;=</span>
</span></span></code></pre></div><h2 id="数组">数组</h2>
<h3 id="初始化-1">初始化</h3>
<p>数组从声明时就确定，使用时可以修改数组成员，但是数组大小不可变化</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">a</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">a</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">b</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="nx">a</span> <span class="p">=</span> <span class="nx">b</span> <span class="c1">//不可以这样做，因为此时a和b是不同的类型
</span></span></span></code></pre></div><p>数组可以通过下标进行访问，下标是从<code>0</code>开始，最后一个元素下标是：<code>len-1</code>，访问越界（下标在合法范围之外），则触发访问越界，panic</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">testArray</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="kt">int</span>	<span class="c1">//数组会初始化为int类型的零值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">numArray</span> <span class="p">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>	<span class="c1">//使用指定的初始值完成初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">cityArray</span> <span class="p">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;北京&#34;</span><span class="p">,</span> <span class="s">&#34;上海&#34;</span><span class="p">,</span> <span class="s">&#34;深圳&#34;</span><span class="p">}</span> <span class="c1">//使用指定的初始值完成初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">numArray</span> <span class="p">=</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span> <span class="c1">//根据值推断数组长度
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">cityArray</span> <span class="p">=</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;北京&#34;</span><span class="p">,</span> <span class="s">&#34;上海&#34;</span><span class="p">,</span> <span class="s">&#34;深圳&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">:</span> <span class="mi">5</span><span class="p">}</span>	<span class="c1">//指定索引初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span>                  <span class="c1">// [0 1 0 5]
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">a</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="多维数组">多维数组</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">:=</span> <span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span><span class="s">&#34;北京&#34;</span><span class="p">,</span> <span class="s">&#34;上海&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span><span class="s">&#34;广州&#34;</span><span class="p">,</span> <span class="s">&#34;深圳&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span><span class="s">&#34;成都&#34;</span><span class="p">,</span> <span class="s">&#34;重庆&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><blockquote>
<p>多维数组<strong>只有第一层</strong>可以使用<code>...</code>来让编译器推导数组长度</p>
</blockquote>
<p>数组是<strong>值类型</strong>，赋值和传参会复制整个数组。因此改变副本的值，不会改变本身的值。</p>
<ol>
<li>数组支持 “==“、”!=” 操作符，因为内存总是被初始化过的。</li>
<li><code>[n]*T</code>表示指针数组，<code>*[n]T</code>表示数组指针 。</li>
</ol>
<h2 id="切片">切片</h2>
<p>数组的局限性，长度固定。</p>
<p>切片（Slice）是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活，支持自动扩容。</p>
<p>切片是一个<strong>引用类型</strong>，它的内部结构包含<code>地址</code>、<code>长度</code>和<code>容量</code>。切片一般用于快速地操作一块数据集合。</p>
<h3 id="初始化-2">初始化</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">a</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span>              <span class="c1">//声明一个字符串切片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">b</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>             <span class="c1">//声明一个整型切片并初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">c</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">bool</span><span class="p">{</span><span class="kc">false</span><span class="p">,</span> <span class="kc">true</span><span class="p">}</span> <span class="c1">//声明一个布尔切片并初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">d</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">bool</span><span class="p">{</span><span class="kc">false</span><span class="p">,</span> <span class="kc">true</span><span class="p">}</span> <span class="c1">//声明一个布尔切片并初始化
</span></span></span></code></pre></div><p>切片有指向时值就不为空了。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">a1</span> <span class="o">:=</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">13</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nx">s3</span> <span class="o">:=</span> <span class="nx">a1</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">]</span> <span class="c1">//左包右不包，索引为0-3切片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nb">len</span><span class="p">(</span><span class="nx">s3</span><span class="p">)</span> <span class="c1">// 4 切片长度
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nb">cap</span><span class="p">(</span><span class="nx">s3</span><span class="p">)</span>	<span class="c1">// 7 容量=原数组切片点到末尾的长度
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nx">a</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>  <span class="c1">// 等同于 a[2:len(a)]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">a</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span>  <span class="c1">// 等同于 a[0:3]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">a</span><span class="p">[:]</span>   <span class="c1">// 等同于 a[0:len(a)]
</span></span></span></code></pre></div><p>原数组元素改了切片也变，引用类型。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">a</span><span class="p">[</span><span class="nx">low</span> <span class="p">:</span> <span class="nx">high</span> <span class="p">:</span> <span class="nx">max</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">:=</span> <span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nx">t</span> <span class="o">:=</span> <span class="nx">a</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">:</span><span class="mi">5</span><span class="p">]</span> <span class="c1">//t:[2 3] len(t):2 cap(t):4
</span></span></span></code></pre></div><p>构造与简单切片表达式<code>a[low: high]</code>相同类型、相同长度和元素的切片。另外，它会将得到的结果切片的容量设置为<code>max-low</code>。在完整切片表达式中只有第一个索引值（low）可以省略；它默认为0。</p>
<h3 id="make">make()</h3>
<p>动态创建一个切片</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nb">make</span><span class="p">([]</span><span class="nx">T</span><span class="p">,</span> <span class="nx">size</span><span class="p">,</span> <span class="nx">cap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1">// 初始化值为0
</span></span></span></code></pre></div><h3 id="空切片判断">空切片判断</h3>
<p>要检查切片是否为空，使用<code>len(s) == 0</code>来判断，而不应该使用<code>s == nil</code>来判断。</p>
<p>切片之间是不能比较的，我们不能使用<code>==</code>操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和<code>nil</code>比较。 一个<code>nil</code>值的切片并没有底层数组，一个<code>nil</code>值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是<code>nil</code></p>
<h3 id="赋值">赋值</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">s1</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1">//[0 0 0]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">s2</span> <span class="o">:=</span> <span class="nx">s1</span>             <span class="c1">//将s1直接赋值给s2，s1和s2共用一个底层数组
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">s2</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">s1</span><span class="p">)</span> <span class="c1">//[100 0 0]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">s2</span><span class="p">)</span> <span class="c1">//[100 0 0]
</span></span></span></code></pre></div><h3 id="append">append()</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">s</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>        <span class="c1">// [1]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>  <span class="c1">// [1 2 3 4
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">s2</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">}</span>  
</span></span><span class="line"><span class="cl">	<span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="nx">s2</span><span class="o">...</span><span class="p">)</span>    <span class="c1">// [1 2 3 4 5 6 7]
</span></span></span></code></pre></div><blockquote>
<p>var声明的零值切片可以在<code>append()</code>函数直接使用，无需初始化</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">s</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span></code></pre></div><p>每个切片会指向一个底层数组，这个数组的容量够用就添加新增元素。当底层数组不能容纳新增的元素时，切片就会自动按照一定的策略进行“扩容”，此时该切片指向的底层数组就会更换。“扩容”操作往往发生在<code>append()</code>函数调用时，所以我们通常都需要用原变量接收append函数的返回值。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">//append()添加元素和切片扩容
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">numSlice</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">numSlice</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">numSlice</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v  len:%d  cap:%d  ptr:%p\n&#34;</span><span class="p">,</span> <span class="nx">numSlice</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">numSlice</span><span class="p">),</span> <span class="nb">cap</span><span class="p">(</span><span class="nx">numSlice</span><span class="p">),</span> <span class="nx">numSlice</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>输出</p>
<pre tabindex="0"><code>[0]  len:1  cap:1  ptr:0xc0000a8000
[0 1]  len:2  cap:2  ptr:0xc0000a8040
[0 1 2]  len:3  cap:4  ptr:0xc0000b2020
[0 1 2 3]  len:4  cap:4  ptr:0xc0000b2020
[0 1 2 3 4]  len:5  cap:8  ptr:0xc0000b6000
[0 1 2 3 4 5]  len:6  cap:8  ptr:0xc0000b6000
[0 1 2 3 4 5 6]  len:7  cap:8  ptr:0xc0000b6000
[0 1 2 3 4 5 6 7]  len:8  cap:8  ptr:0xc0000b6000
[0 1 2 3 4 5 6 7 8]  len:9  cap:16  ptr:0xc0000b8000
[0 1 2 3 4 5 6 7 8 9]  len:10  cap:16  ptr:0xc0000b8000
</code></pre><p>从上面的结果可以看出：</p>
<ol>
<li><code>append()</code>函数将元素追加到切片的最后并返回该切片。</li>
<li>切片numSlice的容量按照1，2，4，8，16这样的规则自动进行扩容，每次扩容后都是扩容前的2倍。</li>
</ol>
<p><code>$GOROOT/src/runtime/slice.go</code>源码:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">newcap</span> <span class="o">:=</span> <span class="nx">old</span><span class="p">.</span><span class="nx">cap</span>
</span></span><span class="line"><span class="cl"><span class="nx">doublecap</span> <span class="o">:=</span> <span class="nx">newcap</span> <span class="o">+</span> <span class="nx">newcap</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">cap</span> <span class="p">&gt;</span> <span class="nx">doublecap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">newcap</span> <span class="p">=</span> <span class="nx">cap</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">old</span><span class="p">.</span><span class="nx">len</span> <span class="p">&lt;</span> <span class="mi">1024</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">newcap</span> <span class="p">=</span> <span class="nx">doublecap</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Check 0 &lt; newcap to detect overflow
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="c1">// and prevent an infinite loop.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">for</span> <span class="mi">0</span> <span class="p">&lt;</span> <span class="nx">newcap</span> <span class="o">&amp;&amp;</span> <span class="nx">newcap</span> <span class="p">&lt;</span> <span class="nx">cap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">newcap</span> <span class="o">+=</span> <span class="nx">newcap</span> <span class="o">/</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Set newcap to the requested cap when
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="c1">// the newcap calculation overflowed.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">if</span> <span class="nx">newcap</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">newcap</span> <span class="p">=</span> <span class="nx">cap</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><ul>
<li>首先判断，如果新申请容量（cap）大于2倍的旧容量（old.cap），最终容量（newcap）就是新申请的容量（cap）。</li>
<li>否则判断，如果旧切片的长度小于1024，则最终容量(newcap)就是旧容量(old.cap)的两倍，即（newcap=doublecap），</li>
<li>否则判断，如果旧切片长度大于等于1024，则最终容量（newcap）从旧容量（old.cap）开始循环增加原来的1/4，即（newcap=old.cap,for {newcap += newcap/4}）直到最终容量（newcap）大于等于新申请的容量(cap)，即（newcap &gt;= cap）</li>
<li>如果最终容量（cap）计算值溢出，则最终容量（cap）就是新申请容量（cap）。</li>
</ul>
<p>中文字符串是3*2^n</p>
<h3 id="copy">copy()</h3>
<p>切片是引用类型，所以a和b其实都指向了同一块内存地址。修改b的同时a的值也会发生变化。</p>
<p>Go语言内建的<code>copy()</code>函数可以迅速地将一个切片的数据复制到另外一个切片空间中。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">c</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nb">copy</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="nx">a</span><span class="p">)</span>     <span class="c1">//使用copy()函数将切片a中的元素复制到切片c
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="c1">//[1 2 3 4 5]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="c1">//[1 2 3 4 5]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1000</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="c1">//[1 2 3 4 5]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="c1">//[1000 2 3 4 5]
</span></span></span></code></pre></div><h3 id="删除元素">删除元素</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">a</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">a</span><span class="p">[:</span><span class="nx">index</span><span class="p">],</span> <span class="nx">a</span><span class="p">[</span><span class="nx">index</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">37</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 要删除索引为2的元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">a</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">a</span><span class="p">[:</span><span class="mi">2</span><span class="p">],</span> <span class="nx">a</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="c1">//[30 31 33 34 35 36 37]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="c1">//底层数组长度不变，元素左移，右边的由最右元素补全
</span></span></span></code></pre></div><p>排序对切片排</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">sort</span><span class="p">.</span><span class="nf">Ints</span><span class="p">(</span><span class="nx">a</span><span class="p">[:])</span>
</span></span></code></pre></div><h2 id="指针">指针</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">ptr</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">v</span> <span class="c1">// v的类型为T 输出指针类型*T 如 *string *int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">	<span class="nx">b</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">a</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;a:%d ptr:%p\n&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">a</span><span class="p">)</span> <span class="c1">// a:10 ptr:0xc00001a078
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;b:%p type:%T\n&#34;</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="c1">// b:0xc00001a078 type:*int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">b</span><span class="p">)</span>                    <span class="c1">// 0xc00000e018
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">c</span> <span class="o">:=</span> <span class="o">*</span><span class="nx">b</span> <span class="c1">// 指针取值（根据指针去内存取值）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;type of c:%T\n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;value of c:%v\n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>
</span></span></code></pre></div><p>&amp;与*互补</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">modify1</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">x</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">modify2</span><span class="p">(</span><span class="nx">x</span> <span class="o">*</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="o">*</span><span class="nx">x</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">	<span class="nf">modify1</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="c1">// 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nf">modify2</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="c1">// 100
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><h3 id="new与make">new与make</h3>
<p>new函数不太常用，使用new函数得到的是一个类型的指针，并且该指针对应的值为该类型的零值</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="nx">a</span> <span class="o">:=</span> <span class="nb">new</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">b</span> <span class="o">:=</span> <span class="nb">new</span><span class="p">(</span><span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%T\n&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">)</span> <span class="c1">// *int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%T\n&#34;</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="c1">// *bool
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">*</span><span class="nx">a</span><span class="p">)</span>       <span class="c1">// 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">*</span><span class="nx">b</span><span class="p">)</span>       <span class="c1">// false
</span></span></span></code></pre></div><p>make也是用于内存分配的，区别于new，它只用于slice、map以及chan的内存创建，而且它返回的类型就是这三个类型变量本身，而不是他们的指针类型，因为这三种类型就是引用类型</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">b</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">b</span> <span class="p">=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">b</span><span class="p">[</span><span class="s">&#34;沙河娜扎&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">b</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="map">map</h2>
<p>Go语言中提供的映射关系容器为<code>map</code>，其内部使用<code>散列表（hash）</code>实现，类似python的字典</p>
<p>map是一种<strong>无序</strong>的基于<code>key-value</code>的数据结构，Go语言中的map是<strong>引用类型</strong>，必须初始化才能使用</p>
<p>map类型的变量默认初始值为nil，需要使用make()函数来分配内存</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">map</span><span class="p">[</span><span class="nx">KeyType</span><span class="p">]</span><span class="nx">ValueType</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">scoreMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span> <span class="c1">// 初始化才能用，避免动态扩容！
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">scoreMap</span><span class="p">[</span><span class="s">&#34;张三&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="mi">90</span>
</span></span><span class="line"><span class="cl">	<span class="nx">scoreMap</span><span class="p">[</span><span class="s">&#34;小明&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">scoreMap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">scoreMap</span><span class="p">[</span><span class="s">&#34;小明&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;type of a:%T\n&#34;</span><span class="p">,</span> <span class="nx">scoreMap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">userInfo</span> <span class="o">:=</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;username&#34;</span><span class="p">:</span> <span class="s">&#34;沙河小王子&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;password&#34;</span><span class="p">:</span> <span class="s">&#34;123456&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="判断键值是否存在">判断键值是否存在</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">value</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="kd">map</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="c1">// ok返回key是否存在的bool值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="nx">v</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">scoreMap</span><span class="p">[</span><span class="s">&#34;张三&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;查无此人&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="map的遍历">map的遍历</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">k</span><span class="p">,</span> <span class="nx">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">scoreMap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">k</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">k</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">scoreMap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">k</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">scoreMap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><blockquote>
<p>注意：遍历map时的元素顺序与添加键值对的顺序无关</p>
</blockquote>
<h3 id="删除键值对">删除键值对</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nb">delete</span><span class="p">(</span><span class="kd">map</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="按照指定顺序遍历">按照指定顺序遍历</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">rand</span><span class="p">.</span><span class="nf">Seed</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nf">Now</span><span class="p">().</span><span class="nf">UnixNano</span><span class="p">())</span> <span class="c1">//初始化随机数种子
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">scoreMap</span> <span class="p">=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">100</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">key</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;stu%02d&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="c1">//生成stu开头的字符串
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="nx">value</span> <span class="o">:=</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Intn</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>          <span class="c1">//生成0~99的随机整数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="nx">scoreMap</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="p">=</span> <span class="nx">value</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="c1">//取出map中的所有key存入切片keys
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">var</span> <span class="nx">keys</span> <span class="p">=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">key</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">scoreMap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">keys</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">keys</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="c1">//对切片进行排序
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">sort</span><span class="p">.</span><span class="nf">Strings</span><span class="p">(</span><span class="nx">keys</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="c1">//按照排序后的key遍历map
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">key</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">keys</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">scoreMap</span><span class="p">[</span><span class="nx">key</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="元素为map类型的切片">元素为map类型的切片</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">mapSlice</span> <span class="p">=</span> <span class="nb">make</span><span class="p">([]</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1">// 切片初始化，每个元素都是一个map
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="k">for</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">mapSlice</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;index:%d value:%v\n&#34;</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;after init&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 对切片中的map元素进行初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">mapSlice</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">mapSlice</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#34;name&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;小王子&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">mapSlice</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#34;password&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;123456&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">mapSlice</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#34;address&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;沙河&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">mapSlice</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;index:%d value:%v\n&#34;</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span></code></pre></div><h3 id="值为切片类型的map">值为切片类型的map</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">sliceMap</span> <span class="p">=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">][]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">sliceMap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;after init&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">key</span> <span class="o">:=</span> <span class="s">&#34;中国&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">value</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">sliceMap</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">!</span><span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">value</span> <span class="p">=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">value</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="s">&#34;北京&#34;</span><span class="p">,</span> <span class="s">&#34;上海&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">sliceMap</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="p">=</span> <span class="nx">value</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">sliceMap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="函数">函数</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nx">函数名</span><span class="p">(</span><span class="nx">参数</span> <span class="nx">类型</span><span class="p">)</span> <span class="nx">返回值类型</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">函数体</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">intSum</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="参数同类型简写">参数同类型简写</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">intSum</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="可变参数">可变参数</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">intSum2</span><span class="p">(</span><span class="nx">x</span> <span class="o">...</span><span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="c1">//x是一个切片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">sum</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">x</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sum</span> <span class="p">=</span> <span class="nx">sum</span> <span class="o">+</span> <span class="nx">v</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">sum</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="返回值">返回值</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//有命名的返回
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">calc</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="nx">sum</span><span class="p">,</span> <span class="nx">sub</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">sum</span> <span class="p">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl">	<span class="nx">sub</span> <span class="p">=</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">//切片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">someFunc</span><span class="p">(</span><span class="nx">x</span> <span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">x</span> <span class="o">==</span> <span class="s">&#34;&#34;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="kc">nil</span> <span class="c1">// 没必要返回[]int{}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>如果局部变量和全局变量重名，优先访问局部变量</p>
<h3 id="函数类型与变量">函数类型与变量</h3>
<p>我们可以使用<code>type</code>关键字来定义一个函数类型，具体格式如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">calculation</span> <span class="kd">func</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span>
</span></span></code></pre></div><p>上面语句定义了一个<code>calculation</code>类型，它是一种函数类型，这种函数接收两个int类型的参数并且返回一个int类型的返回值。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">c</span> <span class="nx">calculation</span>               <span class="c1">// 声明一个calculation类型的变量c
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">c</span> <span class="p">=</span> <span class="nx">add</span>                         <span class="c1">// 把add赋值给c
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;type of c:%T\n&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> <span class="c1">// type of c:main.calculation
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>            <span class="c1">// 像调用add一样调用c
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="nx">f</span> <span class="o">:=</span> <span class="nx">add</span>                        <span class="c1">// 将函数add赋值给变量f1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;type of f:%T\n&#34;</span><span class="p">,</span> <span class="nx">f</span><span class="p">)</span> <span class="c1">// type of f:func(int, int) int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span>          <span class="c1">// 像调用add一样调用f
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><h3 id="函数作参数与返回值">函数作参数与返回值</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">add</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">calc</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">op</span> <span class="kd">func</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">op</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">ret2</span> <span class="o">:=</span> <span class="nf">calc</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="nx">add</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">ret2</span><span class="p">)</span> <span class="c1">//30
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">do</span><span class="p">(</span><span class="nx">s</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">switch</span> <span class="nx">s</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="s">&#34;+&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">add</span><span class="p">,</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="s">&#34;-&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">sub</span><span class="p">,</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl">	<span class="k">default</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">err</span> <span class="o">:=</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;无法识别的操作符&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="匿名函数">匿名函数</h3>
<p>函数内部定义函数</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 将匿名函数保存到变量
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">add</span> <span class="o">:=</span> <span class="kd">func</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nf">add</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span> <span class="c1">// 通过变量调用匿名函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="c1">//自执行函数：匿名函数定义完加()直接执行
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="kd">func</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="闭包">闭包</h3>
<p>闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说，<code>闭包=函数+引用环境</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">adder</span><span class="p">()</span> <span class="kd">func</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">x</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="kd">func</span><span class="p">(</span><span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">x</span> <span class="o">+=</span> <span class="nx">y</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">x</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">f</span> <span class="p">=</span> <span class="nf">adder</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> <span class="c1">//10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f</span><span class="p">(</span><span class="mi">20</span><span class="p">))</span> <span class="c1">//30
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span> <span class="c1">//60
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="nx">f1</span> <span class="o">:=</span> <span class="nf">adder</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f1</span><span class="p">(</span><span class="mi">40</span><span class="p">))</span> <span class="c1">//40
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">f1</span><span class="p">(</span><span class="mi">50</span><span class="p">))</span> <span class="c1">//90
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><h3 id="defer">defer</h3>
<p><code>defer</code>语句会将其后面跟随的语句进行延迟处理。在<code>defer</code>归属的函数即将返回时，将延迟处理的语句按<code>defer</code>定义的逆序进行执行，也就是说，先被<code>defer</code>的语句最后被执行，最后被<code>defer</code>的语句，最先被执行</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;start&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;end&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">start
</span></span></span><span class="line"><span class="cl"><span class="cm">end
</span></span></span><span class="line"><span class="cl"><span class="cm">3
</span></span></span><span class="line"><span class="cl"><span class="cm">2
</span></span></span><span class="line"><span class="cl"><span class="cm">1
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2022/01/20/image-20220120184447325.png" alt="image-20220120184447325"  /></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//面试题 defer注册要延迟执行的函数时,该函数所有的参数都需要确定其值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">calc</span><span class="p">(</span><span class="nx">index</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">ret</span> <span class="o">:=</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">ret</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">x</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">	<span class="nx">y</span> <span class="o">:=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">calc</span><span class="p">(</span><span class="s">&#34;AA&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nf">calc</span><span class="p">(</span><span class="s">&#34;A&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">x</span> <span class="p">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">calc</span><span class="p">(</span><span class="s">&#34;BB&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nf">calc</span><span class="p">(</span><span class="s">&#34;B&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">y</span> <span class="p">=</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">A 1 2 3 //defer calc(&#34;AA&#34;, 1, 3)
</span></span></span><span class="line"><span class="cl"><span class="cm">B 10 2 12 //defer calc(&#34;BB&#34;, 10, 12)
</span></span></span><span class="line"><span class="cl"><span class="cm">BB 10 12 22
</span></span></span><span class="line"><span class="cl"><span class="cm">AA 1 3 4
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h3 id="内置函数">内置函数</h3>
<table>
<thead>
<tr>
<th style="text-align:center">内置函数</th>
<th style="text-align:center">介绍</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">close</td>
<td style="text-align:center">主要用来关闭channel</td>
</tr>
<tr>
<td style="text-align:center">len</td>
<td style="text-align:center">用来求长度，比如string、array、slice、map、channel</td>
</tr>
<tr>
<td style="text-align:center">new</td>
<td style="text-align:center">用来分配内存，主要用来分配值类型，比如int、struct。返回的是指针</td>
</tr>
<tr>
<td style="text-align:center">make</td>
<td style="text-align:center">用来分配内存，主要用来分配引用类型，比如chan、map、slice</td>
</tr>
<tr>
<td style="text-align:center">append</td>
<td style="text-align:center">用来追加元素到数组、slice中</td>
</tr>
<tr>
<td style="text-align:center">panic和recover</td>
<td style="text-align:center">用来做错误处理</td>
</tr>
</tbody>
</table>
<p>Go语言中目前（Go1.12）是没有异常机制，但是使用<code>panic/recover</code>模式来处理错误。 <code>panic</code>可以在任何地方引发，但<code>recover</code>只有在<code>defer</code>调用的函数中有效</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">funcA</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;func A&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">funcB</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">err</span> <span class="o">:=</span> <span class="nb">recover</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="c1">//如果程序出出现了panic错误,可以通过recover恢复过来
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;recover in B&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">	<span class="nb">panic</span><span class="p">(</span><span class="s">&#34;panic in B&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">funcC</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;func C&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">funcA</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nf">funcB</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nf">funcC</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><blockquote>
<ol>
<li><code>recover()</code>必须搭配<code>defer</code>使用。</li>
<li><code>defer</code>一定要在可能引发<code>panic</code>的语句之前定义。</li>
</ol>
</blockquote>
<h2 id="fmt标准库">fmt标准库</h2>
<p>fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分</p>
<h3 id="print">Print</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;在终端打印该信息。&#34;</span><span class="p">)</span> <span class="c1">//不换行
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">name</span> <span class="o">:=</span> <span class="s">&#34;沙河小王子&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;我是：%s\n&#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;在终端打印单独一行显示&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="fprint">FPrint</h3>
<p><code>Fprint</code>系列函数会将内容输出到一个<code>io.Writer</code>接口类型的变量<code>w</code>中，我们通常用这个函数往文件中写入内容</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 向标准输出写入内容
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Fprintln</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span> <span class="s">&#34;向标准输出写入内容&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">fileObj</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;./xx.txt&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_WRONLY</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_APPEND</span><span class="p">,</span> <span class="mo">0644</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;打开文件出错，err:&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="o">:=</span> <span class="s">&#34;沙河小王子&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 向打开的文件句柄中写入内容
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Fprintf</span><span class="p">(</span><span class="nx">fileObj</span><span class="p">,</span> <span class="s">&#34;往文件中写如信息：%s&#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span>
</span></span></code></pre></div><blockquote>
<p>只要满足<code>io.Writer</code>接口的类型都支持写入</p>
</blockquote>
<h3 id="sprint">Sprint</h3>
<p><code>Sprint</code>系列函数会把传入的数据生成并返回一个字符串</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">s3</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintln</span><span class="p">(</span><span class="s">&#34;沙河小王子&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="errorf">Errorf</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">e</span> <span class="o">:=</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;原始错误e&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">w</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">&#34;Wrap了一个错误%w&#34;</span><span class="p">,</span> <span class="nx">e</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="scan">Scan</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">married</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanf</span><span class="p">(</span><span class="s">&#34;1:%s 2:%d 3:%t&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">married</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">married</span><span class="p">)</span>
</span></span></code></pre></div><p>另有Fscan，Sscan</p>
<h3 id="bufionewreader">bufio.NewReader</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">bufioDemo</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">reader</span> <span class="o">:=</span> <span class="nx">bufio</span><span class="p">.</span><span class="nf">NewReader</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdin</span><span class="p">)</span> <span class="c1">// 从标准输入生成读对象
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;请输入内容：&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">text</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">reader</span><span class="p">.</span><span class="nf">ReadString</span><span class="p">(</span><span class="sc">&#39;\n&#39;</span><span class="p">)</span> <span class="c1">// 读到换行终止 空格也读入
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">text</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">TrimSpace</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%#v\n&#34;</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="结构体">结构体</h2>
<p>Go语言中没有“类”的概念，也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。</p>
<h3 id="自定义类型">自定义类型</h3>
<p>自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义，也可以通过struct定义</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//将MyInt定义为int类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">type</span> <span class="nx">MyInt</span> <span class="kt">int</span>
</span></span></code></pre></div><p>通过<code>type</code>关键字的定义，<code>MyInt</code>就是一种新的类型，它具有<code>int</code>的特性。</p>
<h3 id="类型别名">类型别名</h3>
<p>类型别名规定：TypeAlias只是Type的别名，本质上TypeAlias与Type是同一个类型</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">TypeAlias</span> <span class="p">=</span> <span class="nx">Type</span>
</span></span></code></pre></div><p>我们之前见过的<code>rune</code>和<code>byte</code>就是类型别名</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="kt">byte</span> <span class="p">=</span> <span class="kt">uint8</span>
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="kt">rune</span> <span class="p">=</span> <span class="kt">int32</span>
</span></span></code></pre></div><h3 id="结构体定义">结构体定义</h3>
<p>使用<code>type</code>和<code>struct</code>关键字来定义结构体，具体代码格式如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">类型名</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">字段名</span> <span class="nx">字段类型</span>
</span></span><span class="line"><span class="cl">    <span class="nx">字段名</span> <span class="nx">字段类型</span>
</span></span><span class="line"><span class="cl">    <span class="err">…</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">person</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">city</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">age</span>  <span class="kt">int8</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">person1</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">name</span><span class="p">,</span> <span class="nx">city</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">age</span>        <span class="kt">int8</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>其中：</p>
<ul>
<li>类型名：标识自定义结构体的名称，在同一个包内不能重复。</li>
<li>字段名：表示结构体字段名。结构体中的字段名必须唯一。</li>
<li>字段类型：表示结构体字段的具体类型。</li>
</ul>
<h3 id="实例化">实例化</h3>
<p>只有当结构体实例化时，才会真正地分配内存。必须实例化后才能使用结构体的字段。</p>
<p>结构体本身也是一种类型，我们可以像声明内置类型一样使用<code>var</code>关键字声明结构体类型。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">结构体实例</span> <span class="nx">结构体类型</span>
</span></span></code></pre></div><p>基本实例化</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">person</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">city</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">age</span>  <span class="kt">int8</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">p1</span> <span class="nx">person</span>
</span></span><span class="line"><span class="cl">	<span class="nx">p1</span><span class="p">.</span><span class="nx">name</span> <span class="p">=</span> <span class="s">&#34;沙河娜扎&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">p1</span><span class="p">.</span><span class="nx">city</span> <span class="p">=</span> <span class="s">&#34;北京&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">p1</span><span class="p">.</span><span class="nx">age</span> <span class="p">=</span> <span class="mi">18</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;p1=%v\n&#34;</span><span class="p">,</span> <span class="nx">p1</span><span class="p">)</span>  <span class="c1">//p1={沙河娜扎 北京 18}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;p1=%#v\n&#34;</span><span class="p">,</span> <span class="nx">p1</span><span class="p">)</span> <span class="c1">//p1=main.person{name:&#34;沙河娜扎&#34;, city:&#34;北京&#34;, age:18}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><p>匿名结构体，用于临时数据结构</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">user</span> <span class="kd">struct</span><span class="p">{</span><span class="nx">Name</span> <span class="kt">string</span><span class="p">;</span> <span class="nx">Age</span> <span class="kt">int</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">user</span><span class="p">.</span><span class="nx">Name</span> <span class="p">=</span> <span class="s">&#34;小王子&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">user</span><span class="p">.</span><span class="nx">Age</span> <span class="p">=</span> <span class="mi">18</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%#v\n&#34;</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>指针类型结构体，使用new分配地址</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">p2</span> <span class="p">=</span> <span class="nb">new</span><span class="p">(</span><span class="nx">person</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">//使用&amp;对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">p3</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">person</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%T\n&#34;</span><span class="p">,</span> <span class="nx">p2</span><span class="p">)</span>     <span class="c1">//*main.person
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;p2=%#v\n&#34;</span><span class="p">,</span> <span class="nx">p2</span><span class="p">)</span> <span class="c1">//p2=&amp;main.person{name:&#34;&#34;, city:&#34;&#34;, age:0}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">//支持对结构体指针直接使用.来访问结构体的成员
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">p2</span><span class="p">.</span><span class="nx">name</span> <span class="p">=</span> <span class="s">&#34;小王子&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">p2</span><span class="p">.</span><span class="nx">age</span> <span class="p">=</span> <span class="mi">28</span>
</span></span><span class="line"><span class="cl"><span class="nx">p2</span><span class="p">.</span><span class="nx">city</span> <span class="p">=</span> <span class="s">&#34;上海&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;p2=%#v\n&#34;</span><span class="p">,</span> <span class="nx">p2</span><span class="p">)</span> <span class="c1">//p2=&amp;main.person{name:&#34;小王子&#34;, city:&#34;上海&#34;, age:28}
</span></span></span></code></pre></div><h3 id="初始化-3">初始化</h3>
<p>没有初始化的结构体，其成员变量都是对应其类型的零值。初始化是赋值的实例化。</p>
<p>使用键值对初始化</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">p5</span> <span class="o">:=</span> <span class="nx">person</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="p">:</span> <span class="s">&#34;小王子&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">city</span><span class="p">:</span> <span class="s">&#34;北京&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">age</span><span class="p">:</span>  <span class="mi">18</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>对结构体指针初始化</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">p6</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">person</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">name</span><span class="p">:</span> <span class="s">&#34;小王子&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">city</span><span class="p">:</span> <span class="s">&#34;北京&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">age</span><span class="p">:</span>  <span class="mi">18</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>用列表初始化</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">p8</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">person</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;沙河娜扎&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;北京&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="mi">28</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="内存布局">内存布局</h3>
<p>结构体占用一块连续的内存，空结构体不占空间</p>
<h3 id="构造函数">构造函数</h3>
<p>实现类似其他语言面向对象的构造函数，Go是面向接口编程。</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>pandas笔记</title>
      <link>https://blog.kanikig.xyz/pandas%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 17 Aug 2021 18:32:08 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/pandas%E7%AC%94%E8%AE%B0/</guid>
      <description>https://www.youtube.com/watch?v=yzIMircGU5I&amp;amp;list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y&amp;amp;index=1 read a tabular data file cols = [&amp;#39;col1&amp;#39;, &amp;#39;col2&amp;#39;] pd.read_table(path, sep=&amp;#39;|&amp;#39;, headers=None, names=cols) pd.head() # first five rows commands end with parentheses df.describe() #show mean, std, max, min... rename columns df.rename(columns = {&amp;#39;old_col_name&amp;#39;:&amp;#39;new_col_name&amp;#39;}, inplace=True) cols = new_col_list df.columns = cols df.columns = df.columns.str.replace(&amp;#39; &amp;#39;, &amp;#39;_&amp;#39;) remove columns df.drop(&amp;#39;col&amp;#39;, axis=1, inplace=True) df.drop([rows], axis=0, inplace=True) sort df[&amp;#39;col&amp;#39;].sort_values(ascending=False) # series df.sort_values(&amp;#39;col&amp;#39;) # return dataframe df.sort_values([&amp;#39;col1&amp;#39;, &amp;#39;col2&amp;#39;]) filter rows of a pandas DataFrame</description>
      <content:encoded><![CDATA[<blockquote>
<p><a href="https://www.youtube.com/watch?v=yzIMircGU5I&amp;list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y&amp;index=1">https://www.youtube.com/watch?v=yzIMircGU5I&amp;list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y&amp;index=1</a></p>
</blockquote>
<h2 id="read-a-tabular-data-file">read a tabular data file</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">cols</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">read_table</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;|&#39;</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">names</span><span class="o">=</span><span class="n">cols</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>	<span class="c1"># first five rows</span>
</span></span></code></pre></div><h2 id="commands-end-with-parentheses">commands end with parentheses</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">describe</span><span class="p">()</span>	<span class="c1">#show mean, std, max, min...</span>
</span></span></code></pre></div><h2 id="rename-columns">rename columns</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="n">columns</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;old_col_name&#39;</span><span class="p">:</span><span class="s1">&#39;new_col_name&#39;</span><span class="p">},</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">cols</span> <span class="o">=</span> <span class="n">new_col_list</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="n">cols</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="remove-columns">remove columns</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="s1">&#39;col&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="n">rows</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="sort">sort</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>	<span class="c1"># series</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s1">&#39;col&#39;</span><span class="p">)</span>	<span class="c1"># return dataframe</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">([</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">])</span>	
</span></span></code></pre></div><h2 id="filter-rows-of-a-pandas-dataframe">filter rows of a pandas DataFrame</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">([])</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">200</span><span class="p">]</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1">#	df[df[&#39;col&#39;] &gt;= 200][&#39;col2&#39;]</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">200</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">]</span>	<span class="c1">#	loc select cols or rows with labels</span>
</span></span></code></pre></div><h2 id="multiple-filter-criteria">multiple filter criteria</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">200</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;a&#39;</span><span class="p">)]</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">isin</span><span class="p">([</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">])</span>
</span></span></code></pre></div><h2 id="read-two-columns">read two columns</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">usecols</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">])</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">nrows</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="iteration">iteration</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">	<span class="nb">print</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">df</span><span class="o">.</span><span class="n">iterrows</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;b&#39;</span><span class="p">])</span>
</span></span></code></pre></div><h2 id="filter-numerical-columns">filter numerical columns</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">select_dtypes</span><span class="p">(</span><span class="n">include</span><span class="o">=</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">number</span><span class="p">])</span><span class="o">.</span><span class="n">dtypes</span>
</span></span></code></pre></div><h2 id="describe-method">describe method</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">describe</span><span class="p">(</span><span class="n">include</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;object&#39;</span><span class="p">,</span> <span class="s1">&#39;float64&#39;</span><span class="p">])</span>
</span></span></code></pre></div><h2 id="axis-parameter">&ldquo;axis&rdquo; parameter</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>	<span class="c1"># mean value for serires</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>	<span class="c1"># row mean</span>
</span></span></code></pre></div><h2 id="string-methods">string methods</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>	<span class="c1"># uppercase </span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s1">&#39;str&#39;</span><span class="p">)</span>	<span class="c1">#	return series of t/f</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s1">&#39;str&#39;</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">)</span>	<span class="c1"># support regex</span>
</span></span></code></pre></div><h2 id="change-the-data-type">change the data type</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">dtypes</span>
</span></span><span class="line"><span class="cl"><span class="n">serires</span><span class="o">.</span><span class="n">dtype</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s1">&#39;float64&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;col1&#39;</span><span class="p">:</span><span class="nb">float</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;$&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
</span></span></code></pre></div><h2 id="groupby">groupby</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;col1&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;col1&#39;</span><span class="p">)[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;col1&#39;</span><span class="p">)[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">agg</span><span class="p">([</span><span class="s1">&#39;count&#39;</span><span class="p">,</span> <span class="s1">&#39;min&#39;</span><span class="p">,</span> <span class="s1">&#39;max&#39;</span><span class="p">,</span> <span class="s1">&#39;mean&#39;</span><span class="p">])</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;col1&#39;</span><span class="p">)[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;bar&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="pandas-series">pandas Series</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">describe</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">(</span><span class="n">normalize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">nunique</span><span class="p">()</span>	<span class="c1"># number of unique values</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">crosstab</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">],</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col2&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="handle-missing-values">handle missing values</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">isnull</span><span class="p">()</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">isnull</span><span class="p">()</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">how</span><span class="o">=</span><span class="s1">&#39;any&#39;</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>	<span class="c1"># drop a row if it contains null</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">],</span> <span class="n">how</span><span class="o">=</span><span class="s1">&#39;any&#39;</span><span class="p">)</span>	<span class="c1"># drop a row if col1 or col2 is null</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">(</span><span class="n">dropna</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="pandas-index">pandas index</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">index</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">columns</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">shape</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="mi">23</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span><span class="p">]</span>	<span class="c1">#	fetch value</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">decribe</span><span class="p">()</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="s1">&#39;25%&#39;</span><span class="p">,</span> <span class="s1">&#39;col&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="n">Series</span><span class="p">,</span> <span class="n">inplace</span><span class="o">-</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()[</span><span class="s1">&#39;value1&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span><span class="o">.</span><span class="n">sort_values</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span><span class="o">.</span><span class="n">sort_index</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">value</span> <span class="n">array</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="n">indices</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="select-multiple-rows-and-columns">select multiple rows and columns</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">index</span><span class="p">,</span> <span class="n">col_name</span><span class="p">]</span>	<span class="c1"># by label</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">]]</span>	<span class="c1"># by indices</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">index_col</span><span class="o">=</span><span class="s1">&#39;col1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="s1">&#39;row_label&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>	<span class="c1"># mix labels and indices (not recommend)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;col_label&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">:</span><span class="s1">&#39;col3&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span>
</span></span></code></pre></div><h2 id="make-dataframe-smaller-and-faster">make DataFrame smaller and faster</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">memory_usage</span><span class="p">(</span><span class="n">deep</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s1">&#39;category&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s1">&#39;category&#39;</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;good&#39;</span><span class="p">,</span> <span class="s1">&#39;veray good&#39;</span><span class="p">,</span> <span class="s1">&#39;excellent&#39;</span><span class="p">,</span> <span class="n">ordered</span><span class="o">=</span><span class="kc">True</span><span class="p">])</span>
</span></span></code></pre></div><h2 id="pandas-with-scikit-learn">pandas with scikit-learn</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;id&#39;</span><span class="p">:</span><span class="n">array1</span><span class="p">,</span> <span class="s1">&#39;col&#39;</span><span class="p">:</span><span class="n">array2</span><span class="p">})</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s1">&#39;1.csv&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">to_pickle</span><span class="p">(</span><span class="s1">&#39;1.pkl&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">read_pickle</span><span class="p">(</span><span class="s1">&#39;1.pkl&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="loc-and-iloc">loc and iloc</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> <span class="p">:]</span>	<span class="c1">#	inclusive-label</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> <span class="p">:]</span>	<span class="c1"># exclusive-index</span>
</span></span></code></pre></div><h2 id="large-csv">large csv</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">sample</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">sample</span><span class="p">(</span><span class="n">frac</span><span class="o">=</span><span class="mf">0.75</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">train</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">sample</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">test</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="o">~</span><span class="n">df</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">isin</span><span class="p">(</span><span class="n">train</span><span class="o">.</span><span class="n">index</span><span class="p">),</span> <span class="p">:]</span>
</span></span></code></pre></div><h2 id="dummy-variables">dummy variables</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;sex_male&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;sex&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">map</span><span class="p">({</span><span class="s1">&#39;female&#39;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;male&#39;</span><span class="p">:</span><span class="mi">1</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">get_dummies</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;sex&#39;</span><span class="p">],</span> <span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;sex&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="date-and-times">date and times</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">dt</span><span class="o">.</span><span class="n">weekday_name</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">dt</span><span class="o">.</span><span class="n">dayofyear</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="s1">&#39;1/1/1999&#39;</span><span class="p">),</span> <span class="p">:]</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="o">-</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">min</span><span class="p">())</span><span class="o">.</span><span class="n">days</span>
</span></span></code></pre></div><h2 id="find-and-remove-duplicate-rows">find and remove duplicate rows</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">duplicated</span><span class="p">()</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">df</span><span class="o">.</span><span class="n">duplicated</span><span class="p">(</span><span class="n">keep</span><span class="o">=</span><span class="s1">&#39;first&#39;</span><span class="p">),</span> <span class="p">:]</span>	<span class="c1">#	&#39;last&#39; False</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">duplicated</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">])</span>
</span></span></code></pre></div><h2 id="avoid-a-settingwithcopywarning">avoid a SettingWithCopyWarning</h2>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2021/08/19/image-20210819221914496.png" alt="image-20210819221914496"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2021/08/19/image-20210819222207602.png" alt="image-20210819222207602"  /></p>
<p>Not sure if it is a copy or a view.</p>
<h2 id="change-display-options">change display options</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">set_option</span><span class="p">(</span><span class="s1">&#39;display.max_rows&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">reset_option</span><span class="p">(</span><span class="s1">&#39;display.max_rows&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">set_option</span><span class="p">(</span><span class="s1">&#39;display.max_colwidth, None)</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">set_option</span><span class="p">(</span><span class="s1">&#39;display.precision, 2)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;new_col&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span> <span class="o">*</span> <span class="mi">1000</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">set_option</span><span class="p">(</span><span class="s1">&#39;display.float_format&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">{:,}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="create-a-pandas-dataframe-from-another-object">create a pandas DataFrame from another object</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">s</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">],</span> <span class="n">name</span><span class="o">=</span><span class="n">shape</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="apply-a-function-to-a-pandas-series-or-dataframe">apply a function to a pandas Series or DataFrame</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">ceil</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="p">[</span><span class="s1">&#39;col1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;col2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="multiindex">MultiIndex</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">ser</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">])</span><span class="o">.</span><span class="n">col3</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>	<span class="c1"># series with multiindex</span>
</span></span><span class="line"><span class="cl"><span class="n">ser</span><span class="o">.</span><span class="n">unstack</span><span class="p">()</span>	<span class="c1"># dataframe</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">pivot_table</span><span class="p">(</span><span class="n">values</span><span class="o">=</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="s1">&#39;col2&#39;</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="s1">&#39;col3&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">set_index</span><span class="p">([</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="s1">&#39;col2&#39;</span><span class="p">],</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span><span class="o">.</span><span class="n">sort_index</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="merge-dataframes">merge DataFrames</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">left_on</span><span class="o">=</span><span class="s1">&#39;col1&#39;</span><span class="p">,</span> <span class="n">right_on</span><span class="o">=</span><span class="s1">&#39;col2&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s1">&#39;inner&#39;</span><span class="p">)</span>	<span class="c1">#	outer left right</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Python全栈学习笔记</title>
      <link>https://blog.kanikig.xyz/Python%E5%85%A8%E6%A0%88%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 02 Feb 2021 15:34:12 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/Python%E5%85%A8%E6%A0%88%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>课程介绍 阶段一：基础到高级 三个项目 ATM+购物车：面向过程 选课系统：面向对象 计算机病毒：程序、服务端、客户端 阶段二：商业项目 BBS 路飞学城 微信小</description>
      <content:encoded><![CDATA[<h2 id="课程介绍">课程介绍</h2>
<h3 id="阶段一基础到高级">阶段一：基础到高级</h3>
<p>三个项目</p>
<ul>
<li>ATM+购物车：面向过程</li>
<li>选课系统：面向对象</li>
<li>计算机病毒：程序、服务端、客户端</li>
</ul>
<h3 id="阶段二商业项目">阶段二：商业项目</h3>
<ul>
<li>BBS</li>
<li>路飞学城</li>
<li>微信小程序</li>
<li>爬虫</li>
<li>数据分析：金融量化交易</li>
<li>自动化运维：cmdb、代码发布</li>
<li>GO语言开发</li>
<li>人工智能方向</li>
</ul>
<h2 id="计算机">计算机</h2>
<h3 id="计算机五大组成">计算机五大组成</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2021/02/04/dcc451da81cb39dbf8fed5fad5160924ab18305b.jpg" alt="dcc451da81cb39dbf8fed5fad5160924ab18305b.jpg"  /></p>
<ul>
<li>CPU中央处理器
<ul>
<li>控制器：控制所有其他组件</li>
<li>运算器：数学运算与逻辑运算</li>
</ul>
</li>
<li>存储器io设备：数据存取
<ul>
<li>内存：基于电，断电丢失数据，用于临时存取</li>
<li>外存：硬盘，基于磁，存取慢，永久保存</li>
</ul>
</li>
<li>输入设备：键盘鼠标</li>
<li>输出设备：显示器打印机</li>
</ul>
<h3 id="操作系统">操作系统</h3>
<h4 id="概念">概念</h4>
<ul>
<li>控制计算机硬件</li>
<li>硬件的复杂操作封装</li>
</ul>
<p>软件</p>
<ul>
<li>应用软件</li>
<li>系统软件</li>
</ul>
<h4 id="计算机体系三层结构">计算机体系三层结构</h4>
<ul>
<li>应用程序</li>
<li>操作系统</li>
<li>计算机硬件</li>
</ul>
<h4 id="平台与跨平台">平台与跨平台</h4>
<p>平台：</p>
<ul>
<li>操作系统</li>
<li>计算机硬件</li>
</ul>
<h3 id="其他">其他</h3>
<h4 id="程序与三大核心硬件">程序与三大核心硬件</h4>
<p>程序:硬盘-&gt;内存</p>
<p>cpu从内存读取指令执行</p>
<h4 id="cpu详解">cpu详解</h4>
<h5 id="cpu分类与指令集">cpu分类与指令集</h5>
<ul>
<li>X86-32bit：intel</li>
<li>x86-64bit：AMD</li>
</ul>
<p><em>指令集</em>，就是CPU中用来计算和控制计算机系统的一套指令的集合</p>
<ul>
<li>精简指令集RISC：指令短，稳定</li>
<li>复杂指令集CISC：指令长，丰富</li>
</ul>
<h5 id="x86-64">X86-64</h5>
<ul>
<li>
<p>x86：intel发明世界第一个cpu8086，故将这种架构型号统称为x86。</p>
</li>
<li>
<p>64位：cpu能一次性从内存中取出多少位二进制指令。</p>
</li>
</ul>
<p>cpu有向下兼容性。</p>
<h5 id="寄存器">寄存器</h5>
<p>和cpu同材质，速度比内存快。存cpu要用的关键数据，提升CPU取数据的速度。</p>
<h5 id="内核态与用户态">内核态与用户态</h5>
<p>两种程序</p>
<ul>
<li>操作系统：内核态，调用控制硬件的指令集与运算指令集</li>
<li>应用程序：用户态，只调用运算相关指令集</li>
</ul>
<p>故两种状态频繁切换。</p>
<h5 id="多线程与多核芯片">多线程与多核芯片</h5>
<p>moore定律。</p>
<p>单核双线程，即一个cpu干两个cpu的工作，伪并行，假双核。</p>
<p>4核8线程：每个cpu2线程。</p>
<ul>
<li>intel：所有核调用一个L2缓存</li>
<li>AMD：每个核分配单独L2缓存</li>
</ul>
<h4 id="存储器io相关">存储器io相关</h4>
<ul>
<li>寄存器L1：32位32x32，64位64x64</li>
<li>高速缓存L2：cpu先在高速缓存找，高速缓存命中，未命中再找内存</li>
<li>内存</li>
<li>磁盘</li>
<li>磁带</li>
</ul>
<p>速度快-慢</p>
<h5 id="ram">RAM</h5>
<p>随机存取存储器</p>
<h5 id="rom">ROM</h5>
<p>只读内存，速度和内存一样。故一般用于出厂关键程序存储，例如BIOS</p>
<h5 id="cmos">CMOS</h5>
<p>也是易失性。速度慢。耗电极低。主板有个主板电池，给时钟芯片供电，计算后存到cmos</p>
<h5 id="磁盘结构">磁盘结构</h5>
<p><a href="https://pic.kanikig.xyz/image/YKcR">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2021/02/04/v2-dc762f4e4037b261d0134171213c94a0_1440w.jpg" alt="v2-dc762f4e4037b261d0134171213c94a0_1440w.jpg"  /></a></p>
<p>硬盘：</p>
<ul>
<li>机械硬盘，即磁盘，依赖于机械转动。
<ul>
<li>磁道：一圈数据 bit（二进制位）-Byte（字节）-kB，实际上硬盘厂商是按1000记位</li>
<li>扇区：512字节，即硬盘一次性读写最小单位。操作系统一次读取一个block，即8个扇区=4096字节</li>
<li>柱面：相同半径的磁道叠在一起形成虚拟柱面</li>
<li>分区：即两个柱面之间的部分</li>
</ul>
</li>
<li>固态硬盘</li>
</ul>
<h5 id="io延迟">IO延迟</h5>
<p>硬盘读写速度很快，慢是在找数据的时间。</p>
<ul>
<li>平均寻道时间</li>
<li>平均延迟时间：最低为硬盘转半圈的时间</li>
</ul>
<p>io延迟为以上两者之和。</p>
<p>优化程序核心方法就是减少从硬盘读写，尽量从内存。</p>
<h5 id="虚拟内存swap">虚拟内存swap</h5>
<p>物理内存不足时在磁盘上划取。会带来io延迟。</p>
<h5 id="io设备">IO设备</h5>
<p>包含</p>
<ul>
<li>设备控制：驱动程序</li>
<li>设备本身</li>
</ul>
<h4 id="总线">总线</h4>
<p>连接主板上各组件交互。</p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2021/02/04/t01696027505b77ec8c.jpg" alt="t01696027505b77ec8c.jpg"  /></p>
<ul>
<li>PCI桥：北桥，连接高速设备</li>
<li>ISA桥：南桥，连接慢速设备</li>
</ul>
<h4 id="操作系统启动流程">操作系统启动流程</h4>
<p>BIOS:  Basic Input Output System，出厂被写入ROM设备。</p>
<p>启动流程：</p>
<ol>
<li>计算机加电</li>
<li>BIOS运行监测硬件正常</li>
<li>BIOS读取CMOS存储器的参数，选择启动设备</li>
<li>从启动设备上读取第一个扇区的内容（MBR主引导记录512字节，前446位引导信息，后64为分区信息，最后两个为标志位）</li>
<li>根据分区信息读入BootLoader启动装载模块，启动操作系统</li>
<li>操作系统询问BIOS获得配置信息，加载驱动。</li>
</ol>
<h2 id="python入门">Python入门</h2>
<h3 id="编程语言介绍">编程语言介绍</h3>
<ol>
<li>机器语言</li>
<li>汇编语言</li>
<li>高级语言
<ol>
<li>编译型：c-&gt;gcc编译器-&gt;机器语言，执行效率高</li>
<li>解释型：py-&gt;字节码-&gt;解释器（一行一行）-&gt;机器，跨平台性强</li>
</ol>
</li>
</ol>
<h3 id="python介绍">python介绍</h3>
<ul>
<li>解释型</li>
<li>语法风格：PEP8规范</li>
</ul>
<h3 id="解释器">解释器</h3>
<p>解释器可以用任意语言写，CPython，Jpython。</p>
<p>2.6-2008</p>
<p>2.7-2010 后推出的过渡版本</p>
<p>3.0-2008</p>
<p>3.1-2009</p>
<p>3.2-2011</p>
<h3 id="运行python程序的两种方式">运行python程序的两种方式</h3>
<ul>
<li>交互式</li>
<li>脚本</li>
</ul>
<h3 id="程序运行三步骤">程序运行三步骤</h3>
<ol>
<li>启动解释器</li>
<li>解释器读取py进内存</li>
<li>解释器解释执行</li>
</ol>
<h2 id="变量与基本数据类型">变量与基本数据类型</h2>
<h3 id="变量">变量</h3>
<h4 id="三大组成部分">三大组成部分</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">变量名</span> <span class="n">赋值符号</span> <span class="n">变量名</span>
</span></span></code></pre></div><h4 id="变量名">变量名</h4>
<p>推荐小写加下划线</p>
<h4 id="变量值三个特征">变量值三个特征</h4>
<ul>
<li>id：变量值的内存地址</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">id</span><span class="p">()</span>
</span></span></code></pre></div><ul>
<li>type</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">type</span><span class="p">()</span>
</span></span></code></pre></div><ul>
<li>value</li>
</ul>
<h4 id="可变与不可变类型">可变与不可变类型</h4>
<ul>
<li>可变类型：改value，内存地址id不变
<ul>
<li>set</li>
<li>list</li>
<li>dict</li>
</ul>
</li>
<li>不可变：改value，id也变
<ul>
<li>number</li>
<li>bool</li>
<li>string</li>
<li>tuple</li>
</ul>
</li>
</ul>
<h4 id="is与">is与==</h4>
<ul>
<li>is比较的是左右变量的内存地址是否相同</li>
<li>==比较变量值</li>
</ul>
<h4 id="小整数对象池">小整数对象池</h4>
<p>从解释器启动会在内存中事先申请一系列内存空间存放常用整数（-5, 256)</p>
<p>IDE的小整数池会更大。</p>
<h3 id="常量">常量</h3>
<p>python语法没有常量概念！</p>
<p>全大写代表常量，只是一种规范写法，实际还是变量。</p>
<h3 id="基本数据类型">基本数据类型</h3>
<h4 id="字符串">字符串</h4>
<p>单、双、三引号定义均可，嵌套时单双应相反，或转义</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -----------</span>
</span></span></code></pre></div><h4 id="列表">列表</h4>
<p>内存中存的是值的内存地址，不存值！</p>
<p>如果list2 = list1，即两者指向同一个堆，改变值，两个都会改。</p>
<p><strong>深浅拷贝</strong>：</p>
<ul>
<li>浅拷贝：将列表第一层内存地址拷贝，但若有可变类型，还是会连在一起</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list2</span> <span class="o">=</span> <span class="n">list1</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span></span></code></pre></div><ul>
<li>深拷贝：完全独立拷贝一份，不可变类型id不变，可变类型id改变</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">copy</span>
</span></span><span class="line"><span class="cl"><span class="n">list3</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">list1</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="字典">字典</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;key&#34;</span><span class="p">:</span><span class="s2">&#34;value&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s2">&#34;1&#34;</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;2&#34;</span><span class="p">:</span><span class="s2">&#34;qwe&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="垃圾回收机制gc">垃圾回收机制GC</h3>
<h4 id="引用计数">引用计数</h4>
<p>垃圾：变量值没有绑定变量名</p>
<p>引用计数：绑定某值的变量个数，python会清除计数为0的值</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">del</span> <span class="n">x</span>	<span class="c1"># 解除变量与值的绑定</span>
</span></span></code></pre></div><p>直接引用，间接引用</p>
<h4 id="标记清除">标记清除</h4>
<p>循环引用问题，可能导致内存泄漏</p>
<p>内存栈区存变量名，堆区存值</p>
<h4 id="分代回收">分代回收</h4>
<p>多次扫描都没有被回收的变量，会认为是常用变量，对他的扫描频率会降低</p>
<h3 id="用户交互">用户交互</h3>
<h4 id="输入">输入</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">input</span><span class="p">()</span> <span class="c1"># 存为str</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># python2</span>
</span></span><span class="line"><span class="cl"><span class="n">raw_input</span><span class="p">()</span>	<span class="c1"># 存为str</span>
</span></span><span class="line"><span class="cl"><span class="nb">input</span><span class="p">()</span>	<span class="c1"># 要求用户输入明确数据类型，输入的是什么类型就为什么类型</span>
</span></span></code></pre></div><h4 id="格式化输出">格式化输出</h4>
<ul>
<li>%格式化输出</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;name: </span><span class="si">%(name)s</span><span class="s2">, age:</span><span class="si">%(age)d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;a&#34;</span><span class="p">,</span> <span class="s2">&#34;age&#34;</span><span class="p">:</span> <span class="mi">10</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1"># %s可以接受任何类型</span>
</span></span></code></pre></div><ul>
<li>str.format</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;name: </span><span class="si">{name}</span><span class="s2">, age:</span><span class="si">{age}</span><span class="s2">&#34;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;a&#34;</span><span class="p">,</span> <span class="n">age</span> <span class="o">=</span> <span class="mi">10</span><span class="p">))</span>
</span></span></code></pre></div><ul>
<li>f</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;name: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">, age:</span><span class="si">{</span><span class="n">age</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="基本运算符">基本运算符</h2>
<h3 id="算数运算符">算数运算符</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="mi">10</span> <span class="o">//</span> <span class="mi">3</span>	<span class="c1">#只保留整数部分，即整除</span>
</span></span><span class="line"><span class="cl"><span class="mi">3</span> <span class="o">**</span> <span class="mi">10</span>	<span class="c1">#指数</span>
</span></span><span class="line"><span class="cl"><span class="mi">10</span> <span class="o">%</span> <span class="mi">3</span> <span class="c1">#取余数</span>
</span></span></code></pre></div><h3 id="比较运算符">比较运算符</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="mi">1</span> <span class="o">!=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="mi">1</span> <span class="o">&lt;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">3</span>
</span></span></code></pre></div><h3 id="赋值运算符">赋值运算符</h3>
<ul>
<li>变量赋值</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="mi">1</span>
</span></span></code></pre></div><ul>
<li>增量赋值</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"> <span class="n">a</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="n">b</span> <span class="o">*=</span> <span class="mi">1</span>
</span></span></code></pre></div><ul>
<li>链式赋值</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">z</span> <span class="o">=</span> <span class="n">y</span> <span class="o">=</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">10</span> 
</span></span></code></pre></div><ul>
<li>交叉赋值</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">m</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span>
</span></span></code></pre></div><ul>
<li>解压赋值</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="nb">list</span>
</span></span><span class="line"><span class="cl"><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="o">=</span> <span class="nb">list</span>	<span class="c1">#取前两个</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">_</span> <span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="nb">list</span>	<span class="c1">#取后两个</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 字典解压取值的是key</span>
</span></span></code></pre></div><h3 id="逻辑运算符">逻辑运算符</h3>
<p>隐式布尔：所有值，除了0，None， False，Null，空值 都是True</p>
<p>优先级 not&gt;and&gt;or</p>
<p><strong>短路运算</strong>：从左至右读取条件，连续and有一个false就不再往右读，并返回该位置的值</p>
<h3 id="成员运算符-in">成员运算符 in</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="s2">&#34;a&#34;</span> <span class="ow">in</span> <span class="s2">&#34;abc&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mi">1</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span></span></code></pre></div><h3 id="身份运算符-is">身份运算符 is</h3>
<h2 id="流程控制">流程控制</h2>
<h3 id="if">if</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">if</span> <span class="mi">16</span> <span class="o">&lt;</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="mi">20</span><span class="p">:</span>
</span></span></code></pre></div><p>elif 条件从上到下，上面的不满足才进下一个条件</p>
<h3 id="while">while</h3>
<p>条件循环</p>
<h4 id="whileelse">while+else</h4>
<p>循环正常结束，没有被break，运行else</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="o">...</span>
</span></span></code></pre></div><h3 id="for">for</h3>
<p>迭代循环</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">for</span> <span class="n">variable</span> <span class="ow">in</span> <span class="n">Iterable</span> <span class="nb">object</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="o">...</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="o">...</span>
</span></span><span class="line"><span class="cl">  
</span></span></code></pre></div><h4 id="forelse">for+else</h4>
<h4 id="range">range</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># py2</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="c1">#py3 优化</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="print">print</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;*&#34;</span><span class="p">)</span>	<span class="c1"># 自定义结束，默认为换行</span>
</span></span></code></pre></div><h2 id="基本数据类型及内置方法">基本数据类型及内置方法</h2>
<h3 id="数字类型">数字类型</h3>
<h4 id="int">int</h4>
<p>python3没有long长整型了</p>
<pre tabindex="0"><code>int(&#39;10&#39;)
bin(11) # 0b1011  0b开头即二进制
oct(11) # 0o13	8进制
hex(11)	# 0xb	16进制
int(int(&#39;0b1011&#39;, 2))	# 二进制转10进制
</code></pre><h4 id="float">float</h4>
<pre tabindex="0"><code>float(&#39;11&#39;)
</code></pre><h4 id="虚数">虚数</h4>
<pre tabindex="0"><code>x = 10 + 2j
x.real	#10
x.imag	#2
</code></pre><h3 id="字符串-1">字符串</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 不可变，是一个整体，不可单独改某个字符</span>
</span></span><span class="line"><span class="cl"><span class="nb">str</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span> <span class="o">=</span> <span class="s2">&#34;hello&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 切片</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># h</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># o</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">5</span><span class="p">]</span> <span class="c1"># hello 顾头不顾尾</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">5</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># hlo</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># olle</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s2">&#34;alex&#34;</span> <span class="ow">in</span> <span class="err">”</span><span class="n">alexxxx</span><span class="s2">&#34;	# true</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;alex&#34;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="err">”</span><span class="n">alexxxx</span><span class="s2">&#34;	# false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">msg</span> <span class="o">=</span> <span class="s2">&#34;    eee   &#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>	<span class="c1"># 默认去除两边空格 字符串不可变，故需要新赋值</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span> <span class="o">=</span> <span class="s2">&#34;***eee***&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="err">“</span><span class="o">*</span><span class="err">”</span><span class="p">)</span>  <span class="c1"># strip只去两边，不去中间</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 切分：按某字符分割字符串，返回列表</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&#34;:&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="c1"># 默认按空格为分隔符 分割次数，从左往右算</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">lsplit</span><span class="p">(</span><span class="s2">&#34;:&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&#34;:&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="c1">#从右往左</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">res2</span> <span class="o">=</span> <span class="s2">&#34;:&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># 以：为分隔符拼接</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># 小写</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;aaa&#34;</span><span class="p">)</span> <span class="c1"># True 以什么开头</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&#34;aaa&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;you&#34;</span><span class="p">,</span> <span class="s2">&#34;me&#34;</span> <span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="c1">#字符串替换，次数</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">“</span><span class="mi">123</span><span class="err">”</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="c1"># 纯数字</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&#34;e&#34;</span><span class="p">)</span> <span class="c1"># 返回索引，找不到返回-1</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&#34;e&#34;</span><span class="p">)</span> <span class="c1"># 返回索引，找不到程序报错</span>
</span></span><span class="line"><span class="cl"><span class="n">msg</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">&#34;e&#34;</span><span class="p">)</span> <span class="c1"># 数子串出现次数</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;分割线&#34;</span><span class="o">.</span><span class="n">center</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="s2">&#34;*&#34;</span><span class="p">)</span> <span class="c1">#两侧用*填充</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;分割线&#34;</span><span class="o">.</span><span class="n">ljust</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="s2">&#34;*&#34;</span><span class="p">)</span> <span class="c1">#右侧填充</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;分割线&#34;</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="s2">&#34;*&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;分割线&#34;</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="c1"># 左侧用0填充</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># is 判断系列 查文档</span>
</span></span><span class="line"><span class="cl"><span class="n">isalpha</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">isdigit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">isdecimal</span><span class="p">()</span> <span class="c1"># 只识别阿拉伯数字 py3 默认unicode</span>
</span></span><span class="line"><span class="cl"><span class="n">isnumeric</span><span class="p">()</span> <span class="c1"># 可以识别汉字，阿拉伯数字</span>
</span></span></code></pre></div><h3 id="列表-1">列表</h3>
<h3 id="元组">元组</h3>
<h3 id="字典-1">字典</h3>
<h3 id="集合">集合</h3>
]]></content:encoded>
    </item>
    
    <item>
      <title>正则表达式入门</title>
      <link>https://blog.kanikig.xyz/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%A5%E9%97%A8/</link>
      <pubDate>Thu, 07 Jan 2021 19:20:31 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%A5%E9%97%A8/</guid>
      <description>参考：https://deerchao.cn/tutorials/regex/regex.htm 正则表达式是什么 正则表达式就是记录文本规则的</description>
      <content:encoded><![CDATA[<blockquote>
<p>参考：https://deerchao.cn/tutorials/regex/regex.htm</p>
</blockquote>
<h2 id="正则表达式是什么">正则表达式是什么</h2>
<p>正则表达式就是记录文本规则的代码。</p>
<h2 id="测试正则表达式">测试正则表达式</h2>
<p>在线测试工具：<a href="https://deerchao.cn/tools/wegester/">wegester</a></p>
<h2 id="元字符">元字符</h2>
<table>
<thead>
<tr>
<th>代码</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>.</td>
<td>匹配除换行符以外的任意字符</td>
</tr>
<tr>
<td>\w</td>
<td>匹配字母或数字或下划线或汉字</td>
</tr>
<tr>
<td>\s</td>
<td>匹配任意的空白符</td>
</tr>
<tr>
<td>\d</td>
<td>匹配数字</td>
</tr>
<tr>
<td>\b</td>
<td>匹配单词的开始或结束</td>
</tr>
<tr>
<td>^</td>
<td>匹配字符串的开始</td>
</tr>
<tr>
<td>$</td>
<td>匹配字符串的结束</td>
</tr>
</tbody>
</table>
<p><strong>例</strong>:</p>
<table>
<thead>
<tr>
<th>查找目标</th>
<th>正则表达式</th>
</tr>
</thead>
<tbody>
<tr>
<td>hi后面不远处跟着一个Lucy</td>
<td>\bhi\b.*\bLucy\b</td>
</tr>
<tr>
<td>以0开头，然后是两个数字，然后是一个连字号“-”，最后是8个数字</td>
<td>0\d\d-\d\d\d\d\d\d\d\d 或 0\d{2}-\d{8}</td>
</tr>
<tr>
<td>匹配以字母a开头的单词</td>
<td>\ba\w*\b</td>
</tr>
<tr>
<td>1个或更多连续的数字</td>
<td>\d+</td>
</tr>
<tr>
<td>刚好6个字符的单词</td>
<td>\b\w{6}\b</td>
</tr>
<tr>
<td>整个字符串是5到12位数字</td>
<td>^\d{5,12}$</td>
</tr>
</tbody>
</table>
<h2 id="字符转义">字符转义</h2>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>查找目标</th>
<th>正则表达式</th>
</tr>
</thead>
<tbody>
<tr>
<td>deerchao.cn</td>
<td>deerchao\.cn</td>
</tr>
<tr>
<td>C:\Windows</td>
<td>C:\\Windows</td>
</tr>
</tbody>
</table>
<h2 id="重复">重复</h2>
<table>
<thead>
<tr>
<th>代码/语法</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>*</td>
<td>重复零次或更多次</td>
</tr>
<tr>
<td>+</td>
<td>重复一次或更多次</td>
</tr>
<tr>
<td>?</td>
<td>重复零次或一次</td>
</tr>
<tr>
<td>{n}</td>
<td>重复n次</td>
</tr>
<tr>
<td>{n,}</td>
<td>重复n次或更多次</td>
</tr>
<tr>
<td>{n,m}</td>
<td>重复n到m次</td>
</tr>
</tbody>
</table>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>正则表达式</th>
<th>查找目标</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows\d+</td>
<td>Windows后面跟1个或更多数字</td>
</tr>
<tr>
<td>^\w+</td>
<td>一行的第一个单词</td>
</tr>
</tbody>
</table>
<h2 id="字符类">字符类</h2>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>正则表达式</th>
<th>查找目标</th>
</tr>
</thead>
<tbody>
<tr>
<td>[aeiou]</td>
<td>任何一个英文元音字母</td>
</tr>
<tr>
<td>[0-9]</td>
<td>一位数字</td>
</tr>
<tr>
<td>(?0\d{2}[) -]?\d{8}</td>
<td>几种格式的电话号码</td>
</tr>
</tbody>
</table>
<h2 id="分枝条件">分枝条件</h2>
<p>匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。</p>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>正则表达式</th>
<th>查找目标</th>
</tr>
</thead>
<tbody>
<tr>
<td>0\d{2}-\d{8}|0\d{3}-\d{7}</td>
<td>三位区号，8位本地号 或 4位区号，7位本地号</td>
</tr>
<tr>
<td>\d{5}-\d{4}|\d{5}</td>
<td>美国邮编的规则是5位数字，或者用连字号间隔的9位数字</td>
</tr>
</tbody>
</table>
<h2 id="分组">分组</h2>
<p>可以用小括号来指定<strong>子表达式</strong>(也叫做<strong>分组</strong>)</p>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>正则表达式</th>
<th>查找目标</th>
</tr>
</thead>
<tbody>
<tr>
<td>(\d{1,3}.){3}\d{1,3}</td>
<td>简单的IP地址匹配</td>
</tr>
<tr>
<td>((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</td>
<td>正确的IP地址</td>
</tr>
</tbody>
</table>
<h2 id="反义">反义</h2>
<table>
<thead>
<tr>
<th>代码</th>
<th><strong>说明</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>\W</td>
<td>匹配任意不是字母，数字，下划线，汉字的字符</td>
</tr>
<tr>
<td>\S</td>
<td>匹配任意不是空白符的字符</td>
</tr>
<tr>
<td>\D</td>
<td>匹配任意非数字的字符</td>
</tr>
<tr>
<td>\B</td>
<td>匹配不是单词开头或结束的位置</td>
</tr>
<tr>
<td>[^x]</td>
<td>匹配除了x以外的任意字符</td>
</tr>
<tr>
<td>[^aeiou]</td>
<td>匹配除了aeiou这几个字母以外的任意字符</td>
</tr>
</tbody>
</table>
<p><strong>例：</strong></p>
<table>
<thead>
<tr>
<th>正则表达式</th>
<th>查找目标</th>
</tr>
</thead>
<tbody>
<tr>
<td>\S+</td>
<td>不包含空白符的字符串</td>
</tr>
<tr>
<td>&lt;a[^&gt;]+&gt;</td>
<td>用尖括号括起来的以a开头的字符串</td>
</tr>
</tbody>
</table>
<h2 id="后向引用">后向引用</h2>
]]></content:encoded>
    </item>
    
    <item>
      <title>OpenCV基础笔记</title>
      <link>https://blog.kanikig.xyz/opencv%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sun, 20 Sep 2020 10:25:22 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/opencv%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</guid>
      <description>概述：OpenCV介绍与环境 OpenCV介绍 opencv计算机视觉开源库，算法涉及图像处理与机器学习。 Intel公司贡献，俄罗斯工程师贡献大</description>
      <content:encoded><![CDATA[<h2 id="概述opencv介绍与环境">概述：OpenCV介绍与环境</h2>
<h3 id="opencv介绍">OpenCV介绍</h3>
<ul>
<li>opencv计算机视觉开源库，算法涉及图像处理与机器学习。</li>
<li>Intel公司贡献，俄罗斯工程师贡献大部分C/C++代码。</li>
<li>BSD许可，可免费商用。</li>
<li>SDK支持Java，Python，IOS，Android。</li>
</ul>
<h3 id="opencv框架">OpenCV框架</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2402.26.26.png" alt="iShot2020-09-2402.26.26.png"  /></p>
<h3 id="示例代码">示例代码</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;opencv2/opencv.hpp&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">using</span> <span class="k">namespace</span> <span class="n">cv</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Mat</span> <span class="n">srcImage</span> <span class="o">=</span> <span class="n">imread</span><span class="p">(</span><span class="s">&#34;/Users/kanikig/Documents/CProjects/test/test.jpg&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">srcImage</span><span class="p">.</span><span class="n">data</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Image not loaded&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">imshow</span><span class="p">(</span><span class="s">&#34;[img]&#34;</span><span class="p">,</span> <span class="n">srcImage</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">waitKey</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="加载修改保存图像">加载、修改、保存图像</h2>
<p><a href="https://blog.csdn.net/weixin_42730667/article/details/102299280">色彩空间</a>：</p>
<ul>
<li>位图</li>
<li>灰度</li>
<li>RGB真彩色</li>
<li>CMYK</li>
<li>HSV</li>
<li>YUV</li>
</ul>
<h3 id="加载图像">加载图像</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">srcImage</span> <span class="o">=</span> <span class="n">imread</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="kt">int</span> <span class="n">flags</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">flags</span> <span class="o">=</span> 
</span></span><span class="line"><span class="cl"><span class="n">IMREAD_UNCHANGED</span> <span class="p">(</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">)</span> <span class="err">表示加载原图，不做任何改变</span>
</span></span><span class="line"><span class="cl"><span class="n">IMREAD_GRAYSCALE</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="err">表示把原图作为灰度图像加载进来</span>
</span></span><span class="line"><span class="cl"><span class="n">IMREAD_COLOR</span> <span class="p">(</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">)</span> <span class="err">表示把原图作为</span><span class="n">RGB图像加载进来</span><span class="p">(</span><span class="k">default</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="显示图像">显示图像</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">namedWindow</span><span class="p">(</span><span class="s">&#34;窗口1&#34;</span><span class="p">,</span> <span class="n">CV_WINDOW_NORMAL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">	参数1：窗口的名字
</span></span></span><span class="line"><span class="cl"><span class="cm">	参数2：窗口类型，CV_WINDOW_AUTOSIZE 时表明窗口大小等于图片大小。不可以被拖动改变大小。
</span></span></span><span class="line"><span class="cl"><span class="cm">	CV_WINDOW_NORMAL 时，表明窗口可以被随意拖动改变大小。
</span></span></span><span class="line"><span class="cl"><span class="cm">	*/</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">imshow</span><span class="p">(</span><span class="s">&#34;窗口1&#34;</span><span class="p">,</span> <span class="n">srcImage</span><span class="p">);</span>	<span class="c1">//在“窗口1”这个窗口输出图片。
</span></span></span></code></pre></div><h3 id="修改图像">修改图像</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">gray_image</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">gray_image</span><span class="p">,</span> <span class="n">COLOR_RGB2GRAY</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="保存图像">保存图像</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">imwrite</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">Input_img</span><span class="p">,</span> <span class="n">param</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">	保存图像文件到指定目录路径
</span></span></span><span class="line"><span class="cl"><span class="cm">	只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGB的图像才可以通过这种方式保存
</span></span></span><span class="line"><span class="cl"><span class="cm">	保存PNG格式的时候可以保存透明通道的图片
</span></span></span><span class="line"><span class="cl"><span class="cm">	可以指定压缩参数
</span></span></span><span class="line"><span class="cl"><span class="cm">	*/</span>
</span></span></code></pre></div><h2 id="矩阵的掩膜操作">矩阵的掩膜操作</h2>
<h3 id="获取像素指针">获取像素指针</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//确定图像深度，若为false报错
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">CV_Assert</span><span class="p">(</span><span class="n">myImage</span><span class="p">.</span><span class="n">depth</span><span class="p">()</span> <span class="o">==</span> <span class="n">CV_8U</span><span class="p">);</span> 
</span></span><span class="line"><span class="cl"><span class="c1">//获取当前行指针（row从0开始）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">const</span> <span class="n">uchar</span><span class="o">*</span>  <span class="n">current</span><span class="o">=</span> <span class="n">Image</span><span class="p">.</span><span class="n">ptr</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//获得当前像素点像素值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">p</span><span class="p">(</span><span class="n">row</span><span class="p">,</span><span class="n">col</span><span class="p">)</span> <span class="o">=</span><span class="n">current</span><span class="p">[</span><span class="n">col</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="c1">//像素范围处理，保证RGB在0-255
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">saturate_cast</span><span class="o">&lt;</span><span class="n">ucahr</span><span class="o">&gt;</span><span class="p">();</span>
</span></span></code></pre></div><h3 id="掩膜mask操作">掩膜（mask）操作</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//定义掩膜
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel</span> <span class="o">=</span> <span class="p">(</span><span class="n">Mat_</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//掩膜操作
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">filter2D</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">src</span><span class="p">.</span><span class="n">depth</span><span class="p">(),</span> <span class="n">kernel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//程序计时
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">getTickCount</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">t</span> <span class="o">=</span> <span class="err">（</span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">getTickCount</span><span class="p">()</span> <span class="o">-</span> <span class="n">t</span><span class="p">)</span><span class="o">/</span><span class="n">getTickFrequency</span><span class="p">();</span>
</span></span></code></pre></div><h2 id="mat对象">Mat对象</h2>
<h3 id="mat对象使用">Mat对象使用</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//构造函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">dst</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">dst</span> <span class="o">=</span> <span class="n">Mat</span><span class="p">(</span><span class="kt">int</span> <span class="n">rows</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cols</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">dst</span> <span class="o">=</span> <span class="n">Mat</span><span class="p">(</span><span class="n">Size</span> <span class="n">size</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//等价于
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">dst</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">Size</span> <span class="n">size</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3，第四个参数是向量表示初始化每个像素值是多少，向量长度对应通道数目一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">dst</span> <span class="o">=</span> <span class="n">Mat</span> <span class="n">M</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">CV_8UC3</span><span class="p">,</span> <span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">dst</span> <span class="o">=</span> <span class="n">Scalar</span><span class="p">(</span><span class="mi">127</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">);</span> <span class="c1">//将图像设置成单一灰度和颜色
</span></span></span><span class="line"><span class="cl"><span class="c1">//常用方法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Image</span><span class="p">.</span><span class="n">cols</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">Image</span><span class="p">.</span><span class="n">rows</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">Image</span><span class="p">.</span><span class="n">copyTo</span><span class="p">(</span><span class="n">mat</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Image</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">Image</span><span class="p">.</span><span class="n">convertTo</span><span class="p">(</span><span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Image</span><span class="p">.</span><span class="n">channels</span><span class="p">();</span> <span class="c1">//RGB=3, 灰度图=1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Image</span><span class="p">.</span><span class="n">depth</span><span class="p">();</span> <span class="c1">//一般写-1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Image</span><span class="p">.</span><span class="n">empty</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">uchar</span><span class="o">*</span> <span class="nf">ptr</span><span class="p">(</span><span class="n">row</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">dst</span> <span class="o">=</span> <span class="n">src</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">src</span><span class="p">.</span><span class="n">copyTo</span><span class="p">(</span><span class="n">dst</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="mat定义数组">Mat定义数组</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">C</span> <span class="o">=</span> <span class="p">(</span><span class="n">Mat_</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">eye</span><span class="p">(</span><span class="kt">int</span> <span class="n">rows</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cols</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">)</span><span class="err">；</span> <span class="c1">//生产单位矩阵
</span></span></span></code></pre></div><h2 id="图像操作">图像操作</h2>
<h3 id="读写图像">读写图像</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">imread</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">imwrite</span><span class="p">();</span>
</span></span></code></pre></div><h3 id="读写像素">读写像素</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">px</span> <span class="o">=</span> <span class="n">Image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="修改像素">修改像素</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">rows</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">width</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">cols</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">channels</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">channels</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">printf</span><span class="p">(</span><span class="s">&#34;height=%d width=%d channels=%d&#34;</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">channels</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">row</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">row</span> <span class="o">&lt;</span> <span class="n">height</span><span class="p">;</span> <span class="n">row</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">col</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">col</span> <span class="o">&lt;</span> <span class="n">width</span><span class="p">;</span> <span class="n">col</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">channels</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// blue
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="n">image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// green
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">//Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。Vec3f对应三通道的float类型数据
</span></span></span><span class="line"><span class="cl"><span class="c1">//把CV_8UC1转换到CV32F1实现如下：src.convertTo(dst, CV_32F);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">//反色
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">bitwise_not</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="图像混合">图像混合</h2>
<h3 id="线性混合理论">线性混合理论</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2402.22.30.png" alt="iShot2020-09-2402.22.30.png"  /></p>
<h3 id="相关api">相关API</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">AddWeighted</span><span class="p">(</span> <span class="k">const</span> <span class="n">CvArr</span><span class="o">*</span> <span class="n">src1</span><span class="p">,</span> <span class="kt">double</span> <span class="n">alpha</span><span class="p">,</span><span class="k">const</span> <span class="n">CvArr</span><span class="o">*</span> <span class="n">src2</span><span class="p">,</span> <span class="kt">double</span> <span class="n">beta</span><span class="p">,</span><span class="kt">double</span> <span class="n">gamma</span><span class="p">,</span> <span class="n">CvArr</span><span class="o">*</span> <span class="n">dst</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">参数1：src1，第一个原数组
</span></span></span><span class="line"><span class="cl"><span class="cm">参数2：alpha，第一个数组元素权重
</span></span></span><span class="line"><span class="cl"><span class="cm">参数3：src2第二个原数组
</span></span></span><span class="line"><span class="cl"><span class="cm">参数4：beta，第二个数组元素权重
</span></span></span><span class="line"><span class="cl"><span class="cm">参数5：gamma，图1与图2作和后添加的数值(默认0）。不要太大，不然图片一片白。总和等于255以上就是纯白色了。
</span></span></span><span class="line"><span class="cl"><span class="cm">参数6：dst，输出图片
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h2 id="调整亮度与对比度">调整亮度与对比度</h2>
<h3 id="理论">理论</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2402.22.16.png" alt="iShot2020-09-2402.22.16.png"  /></p>
<h3 id="示例">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">new_image</span> <span class="o">=</span> <span class="n">Mat</span><span class="o">::</span><span class="n">zeros</span><span class="p">(</span> <span class="n">image</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">image</span><span class="p">.</span><span class="n">type</span><span class="p">()</span> <span class="p">);</span> <span class="c1">//创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">saturate_cast</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="c1">//确保值大小范围为0~255之间
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">y</span><span class="p">,</span><span class="n">x</span><span class="p">)[</span><span class="n">index</span><span class="p">]</span><span class="o">=</span><span class="n">value</span> <span class="c1">//给每个像素点每个通道赋值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">rows</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">width</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">cols</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">alpha</span> <span class="o">=</span> <span class="mf">1.2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">beta</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">output</span> <span class="o">=</span> <span class="n">Mat</span><span class="o">::</span><span class="n">zeros</span><span class="p">(</span><span class="n">image</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">image</span><span class="p">.</span><span class="n">type</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">row</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">row</span> <span class="o">&lt;</span> <span class="n">height</span><span class="p">;</span> <span class="n">row</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">col</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">col</span> <span class="o">&lt;</span> <span class="n">width</span><span class="p">;</span> <span class="n">col</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">saturate_cast</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">alpha</span> <span class="o">*</span> <span class="n">image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">beta</span><span class="p">);</span> <span class="c1">//blue
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">output</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">saturate_cast</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">alpha</span> <span class="o">*</span> <span class="n">image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">beta</span><span class="p">);</span> <span class="c1">//green
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">output</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">saturate_cast</span><span class="o">&lt;</span><span class="n">uchar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">alpha</span> <span class="o">*</span> <span class="n">image</span><span class="p">.</span><span class="n">at</span><span class="o">&lt;</span><span class="n">Vec3b</span><span class="o">&gt;</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">beta</span><span class="p">);</span> <span class="c1">//red
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="绘制形状和文字">绘制形状和文字</h2>
<h3 id="point与scalar">Point与Scalar</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//等价于
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">p</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Scalar</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">G</span><span class="p">,</span> <span class="n">R</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="绘制形状">绘制形状</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="p">(</span><span class="n">LINE_4</span><span class="p">,</span> <span class="n">LINE_8</span><span class="p">,</span> <span class="n">LINE_AA</span><span class="p">)</span> <span class="c1">//AA反锯齿
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">line</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">beginPoint</span><span class="p">,</span> <span class="n">endPoint</span><span class="p">,</span> <span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">//起点为beginPoint,终点是endPoint,颜色是红色，线宽是2，shift为默认值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="n">Rect</span> <span class="n">rect</span> <span class="o">=</span> <span class="n">Rect</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">);</span> <span class="c1">// 起始xy，宽高
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">rectangle</span><span class="p">(</span><span class="n">Image</span><span class="p">,</span> <span class="n">rect</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">LINE_8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">eclipse</span><span class="p">(</span><span class="n">Image</span><span class="p">,</span> <span class="n">Point</span><span class="p">(</span><span class="n">Image</span><span class="p">.</span><span class="n">cols</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">Image</span><span class="p">.</span><span class="n">rows</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span> <span class="n">Size</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">360</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">circle</span><span class="p">(</span><span class="n">central</span> <span class="n">point</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//多边形
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Point</span> <span class="n">pts</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">5</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="n">pts</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">fillpoly</span><span class="p">(</span><span class="n">Image</span><span class="p">,</span> <span class="n">in</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="文字">文字</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">putText</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">		<span class="n">cv</span><span class="o">::</span><span class="n">Mat</span><span class="o">&amp;</span> <span class="n">img</span><span class="p">,</span> <span class="c1">// 待绘制的图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">const</span> <span class="n">string</span><span class="o">&amp;</span> <span class="n">text</span><span class="p">,</span> <span class="c1">// 待绘制的文字
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="n">cv</span><span class="o">::</span><span class="n">Point</span> <span class="n">origin</span><span class="p">,</span> <span class="c1">// 文本框的左下角
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="kt">int</span> <span class="n">fontFace</span><span class="p">,</span> <span class="c1">// 字体 (如cv::FONT_HERSHEY_PLAIN)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="kt">double</span> <span class="n">fontScale</span><span class="p">,</span> <span class="c1">// 尺寸因子，值越大文字越大
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span> <span class="n">color</span><span class="p">,</span> <span class="c1">// 线条的颜色（RGB）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="kt">int</span> <span class="n">thickness</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// 线条宽度
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="kt">int</span> <span class="n">lineType</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span> <span class="c1">// 线型（4邻域或8邻域，默认8邻域）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="kt">bool</span> <span class="n">bottomLeftOrigin</span> <span class="o">=</span> <span class="nb">false</span> <span class="c1">// true=&#39;origin at lower left&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">);</span>
</span></span></code></pre></div><h3 id="随机绘制">随机绘制</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">RNG</span> <span class="nf">rng</span><span class="p">(</span><span class="mi">12345</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">pt1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">pt2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">1000</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="n">pt1</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Image</span><span class="p">.</span><span class="n">cols</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">pt1</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Image</span><span class="p">.</span><span class="n">rows</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">pt2</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Image</span><span class="p">.</span><span class="n">cols</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">pt2</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Image</span><span class="p">.</span><span class="n">rows</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">Scalar</span> <span class="n">color</span> <span class="o">=</span> <span class="n">Scalar</span><span class="p">(</span><span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">),</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">),</span> <span class="n">rng</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">wairKey</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">break</span><span class="p">;</span> <span class="c1">//50秒循环一次，直到按键
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="n">line</span><span class="p">(</span><span class="n">Image</span><span class="p">,</span> <span class="n">pt1</span><span class="p">,</span> <span class="n">pt2</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="模糊图像一">模糊图像一</h2>
<h3 id="原理">原理</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2403.32.36.png" alt="iShot2020-09-2403.32.36.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2403.32.43.png" alt="iShot2020-09-2403.32.43.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2403.32.48.png" alt="iShot2020-09-2403.32.48.png"  /></p>
<h3 id="示例-1">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">blur</span><span class="p">(</span><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="n">xradius</span><span class="p">,</span> <span class="n">yradius</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="n">GaussianBlur</span><span class="p">(</span><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="mi">11</span><span class="p">),</span> <span class="n">sigmax</span><span class="p">,</span> <span class="n">sigmay</span><span class="p">);</span> <span class="c1">//Size（x, y）, x, y 必须是正数而且是奇数
</span></span></span></code></pre></div><h2 id="图像模糊二">图像模糊二</h2>
<h3 id="中值滤波">中值滤波</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2404.20.14.png" alt="iShot2020-09-2404.20.14.png"  /></p>
<h3 id="双边滤波">双边滤波</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2404.23.30.png" alt="iShot2020-09-2404.23.30.png"  /></p>
<h3 id="示例-2">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">medianBlur</span><span class="p">(</span><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">Mat</span> <span class="n">dest</span><span class="p">,</span> <span class="n">ksize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">bilateralFilter</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* 15 –计算的半径d，半径之内的像数都会被纳入计算，如果提供-1 则根据sigma space参数取值
</span></span></span><span class="line"><span class="cl"><span class="cm">	 100 – sigma color 决定多少差值之内的像素会被计算
</span></span></span><span class="line"><span class="cl"><span class="cm"> 	 3 – sigma space 如果d的值大于0则声明无效，否则根据它来计算d值
</span></span></span><span class="line"><span class="cl"><span class="cm">中值模糊的ksize大小必须是大于1而且必须是奇数。
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h2 id="膨胀与腐蚀">膨胀与腐蚀</h2>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2803.40.02.png" alt="iShot2020-09-2803.40.02.png"  /></p>
<h3 id="腐蚀">腐蚀</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2803.40.14.png" alt="iShot2020-09-2803.40.14.png"  /></p>
<h3 id="膨胀">膨胀</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2803.40.09.png" alt="iShot2020-09-2803.40.09.png"  /></p>
<h3 id="示例-3">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">kernel</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="kt">int</span> <span class="n">shape</span><span class="p">,</span> <span class="n">Size</span> <span class="n">ksize</span><span class="p">,</span> <span class="n">Point</span> <span class="n">anchor</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm"> - 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
</span></span></span><span class="line"><span class="cl"><span class="cm"> - 大小 奇数 Size(1,1);
</span></span></span><span class="line"><span class="cl"><span class="cm"> - 锚点 默认是Point(-1, -1)意思就是中心像素
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span><span class="line"><span class="cl"><span class="n">dilate</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">kernel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">erode</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">kernel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//动态调整结构元素大小
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">createTrackbar</span><span class="p">(</span><span class="k">const</span> <span class="n">String</span> <span class="o">&amp;</span> <span class="n">trackbarname</span><span class="p">,</span> <span class="k">const</span> <span class="n">String</span> <span class="n">winName</span><span class="p">,</span>  <span class="kt">int</span><span class="o">*</span> <span class="n">value</span><span class="p">,</span> <span class="kt">int</span> <span class="n">count</span><span class="p">,</span> <span class="n">Trackbarcallback</span> <span class="n">func</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">userdata</span><span class="o">=</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">形式参数一、trackbarname：滑动空间的名称；
</span></span></span><span class="line"><span class="cl"><span class="cm">形式参数二、winname：滑动空间用于依附的图像窗口的名称；
</span></span></span><span class="line"><span class="cl"><span class="cm">形式参数三、value：初始化阈值；
</span></span></span><span class="line"><span class="cl"><span class="cm">形式参数四、count：滑动控件的刻度范围；
</span></span></span><span class="line"><span class="cl"><span class="cm">形式参数五、TrackbarCallback是回调函数，其定义如下：
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="p">(</span><span class="n">CV_CDECL</span> <span class="o">*</span><span class="n">TrackbarCallback</span><span class="p">)(</span><span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">userdata</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="demo">demo</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;opencv2/opencv.hpp&gt; </span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt; </span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">cv</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">OUTPUT_WIN</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;output image&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">element_size</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">max_size</span> <span class="o">=</span> <span class="mi">21</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">CallBack_Demo</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">**</span> <span class="n">argv</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="n">src</span> <span class="o">=</span> <span class="n">imread</span><span class="p">(</span><span class="s">&#34;D:/vcprojects/images/test1.png&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">src</span><span class="p">.</span><span class="n">data</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">printf</span><span class="p">(</span><span class="s">&#34;could not load image...</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">namedWindow</span><span class="p">(</span><span class="s">&#34;input image&#34;</span><span class="p">,</span> <span class="n">CV_WINDOW_AUTOSIZE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">imshow</span><span class="p">(</span><span class="s">&#34;input image&#34;</span><span class="p">,</span> <span class="n">src</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">namedWindow</span><span class="p">(</span><span class="n">OUTPUT_WIN</span><span class="p">,</span> <span class="n">CV_WINDOW_AUTOSIZE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">//上一与下二参数必须一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="n">createTrackbar</span><span class="p">(</span><span class="s">&#34;Element Size :&#34;</span><span class="p">,</span> <span class="n">OUTPUT_WIN</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">element_size</span><span class="p">,</span> <span class="n">max_size</span><span class="p">,</span> <span class="n">CallBack_Demo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">CallBack_Demo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">waitKey</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">CallBack_Demo</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">s</span> <span class="o">=</span> <span class="n">element_size</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">Mat</span> <span class="n">structureElement</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="n">MORPH_RECT</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// dilate(src, dst, structureElement, Point(-1, -1), 1);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="n">erode</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">structureElement</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">imshow</span><span class="p">(</span><span class="n">OUTPUT_WIN</span><span class="p">,</span> <span class="n">dst</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="形态学操作">形态学操作</h2>
<h3 id="开-open">开 open</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2804.12.31.png" alt="iShot2020-09-2804.12.31.png"  /></p>
<h3 id="闭-close">闭 close</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2804.12.46.png" alt="iShot2020-09-2804.12.46.png"  /></p>
<h3 id="形态学梯度-morphological-gradient">形态学梯度 Morphological Gradient</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2804.23.08.png" alt="iShot2020-09-2804.23.08.png"  /></p>
<h3 id="顶帽-top-hat">顶帽 top hat</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2804.23.13.png" alt="iShot2020-09-2804.23.13.png"  /></p>
<h3 id="黑帽-black-hat">黑帽 black hat</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2804.23.19.png" alt="iShot2020-09-2804.23.19.png"  /></p>
<h3 id="示例-4">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">kernel</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="n">MORPH_RECT</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span><span class="mi">11</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="n">morphologyEx</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">CV_MOP_BLACKHAT</span><span class="p">,</span> <span class="n">kernel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">- Mat src – 输入图像
</span></span></span><span class="line"><span class="cl"><span class="cm"> - Mat dest – 输出结果
</span></span></span><span class="line"><span class="cl"><span class="cm"> - int OPT – CV_MOP_OPEN/ CV_MOP_CLOSE/ CV_MOP_GRADIENT / CV_MOP_TOPHAT/ CV_MOP_BLACKHAT 形态学操作类型
</span></span></span><span class="line"><span class="cl"><span class="cm">Mat kernel 结构元素
</span></span></span><span class="line"><span class="cl"><span class="cm">int Iteration 迭代次数，默认是1
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h2 id="形态学操作-提取水平垂直线">形态学操作 提取水平垂直线</h2>
<h3 id="原理-1">原理</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2902.29.04.png" alt="iShot2020-09-2902.29.04.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2902.29.10.png" alt="iShot2020-09-2902.29.10.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2902.29.15.png" alt="iShot2020-09-2902.29.15.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2902.29.22.png" alt="iShot2020-09-2902.29.22.png"  /></p>
<h3 id="实现思路">实现思路</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2902.29.32.png" alt="iShot2020-09-2902.29.32.png"  /></p>
<h3 id="示例-5">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//二值化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">adaptiveThreshold</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="c1">// 输入的灰度图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">dest</span><span class="p">,</span> <span class="c1">// 二值图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">maxValue</span><span class="p">,</span> <span class="c1">// 二值图像最大值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">adaptiveMethod</span> <span class="c1">// 自适应方法，只能其中之一 – 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		         <span class="c1">// ADAPTIVE_THRESH_MEAN_C ， ADAPTIVE_THRESH_GAUSSIAN_C 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">thresholdType</span><span class="p">,</span><span class="c1">// 阈值类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">blockSize</span><span class="p">,</span> <span class="c1">// 块大小
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">C</span> <span class="c1">// 常量C 可以是正数，0，负数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">);</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">adaptiveThreshold</span><span class="p">(</span><span class="o">~</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">binImg</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="n">ADAPTIVE_THRESH_MEAN_C</span><span class="p">,</span> <span class="n">THRESH_BINARY</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ~ 反色 bitwise_not(src, dst);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 水平结构元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">hline</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="n">MORPH_RECT</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="n">src</span><span class="p">.</span><span class="n">cols</span> <span class="o">/</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 垂直结构元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">vline</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="n">MORPH_RECT</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">src</span><span class="p">.</span><span class="n">rows</span> <span class="o">/</span> <span class="mi">16</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 矩形结构，可以用于OCR
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel</span> <span class="o">=</span> <span class="n">getStructuringElement</span><span class="p">(</span><span class="n">MORPH_RECT</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">morphologyEx</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">CV_MOP_BLACKHAT</span><span class="p">,</span> <span class="n">hline</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="图像上采样和下采样">图像上采样和下采样</h2>
<h3 id="图像金字塔">图像金字塔</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.07.24.png" alt="iShot2020-09-2903.07.24.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.08.01.png" alt="iShot2020-09-2903.08.01.png"  /></p>
<p><a href="https://pic.kanikig.xyz/image/RRFz">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.07.36.png" alt="iShot2020-09-2903.07.36.png"  /></a></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.07.49.png" alt="iShot2020-09-2903.07.49.png"  /></p>
<h3 id="示例-6">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">pyrUp</span><span class="p">(</span><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="n">src</span><span class="p">.</span><span class="n">cols</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">src</span><span class="p">.</span><span class="n">rows</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span> 
</span></span><span class="line"><span class="cl"><span class="c1">//生成的图像是原图在宽与高各放大两倍
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">pyrDown</span><span class="p">(</span><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="n">src</span><span class="p">.</span><span class="n">cols</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">src</span><span class="p">.</span><span class="n">rows</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1">//生成的图像是原图在宽与高各缩小1/2
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// DOG
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="n">Mat</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">g1</span><span class="p">,</span> <span class="n">g2</span><span class="p">,</span> <span class="n">dogImg</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">cvtColor</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">CV_BGR2GRAY</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">GaussianBlur</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">g1</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">GaussianBlur</span><span class="p">(</span><span class="n">g1</span><span class="p">,</span> <span class="n">g2</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">subtract</span><span class="p">(</span><span class="n">g1</span><span class="p">,</span> <span class="n">g2</span><span class="p">,</span> <span class="n">dogImg</span><span class="p">,</span> <span class="n">Mat</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// 归一化显示
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="n">normalize</span><span class="p">(</span><span class="n">dogImg</span><span class="p">,</span> <span class="n">dogImg</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">NORM_MINMAX</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">imshow</span><span class="p">(</span><span class="s">&#34;DOG Image&#34;</span><span class="p">,</span> <span class="n">dogImg</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="基本阈值操作">基本阈值操作</h2>
<h3 id="阈值概念">阈值概念</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.25.07.png" alt="iShot2020-09-2903.25.07.png"  /></p>
<h3 id="阈值类型">阈值类型</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.25.56.png" alt="iShot2020-09-2903.25.56.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.26.08.png" alt="iShot2020-09-2903.26.08.png"  /></p>
<p><a href="https://pic.kanikig.xyz/image/RcmM">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.26.14.png" alt="iShot2020-09-2903.26.14.png"  /></a></p>
<p><a href="https://pic.kanikig.xyz/image/RKws">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.26.46.png" alt="iShot2020-09-2903.26.46.png"  /></a></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.26.52.png" alt="iShot2020-09-2903.26.52.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2903.27.06.png" alt="iShot2020-09-2903.27.06.png"  /></p>
<h3 id="示例-7">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">CV_BGR2GRAY</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">threshold</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="n">THRESH_TRIANGLE</span> <span class="o">|</span> <span class="n">type_value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//OISU和TRIANGLE自动计算阈值，故dst后阈值写0被忽略
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="k">enum</span> <span class="nc">ThresholdTypes</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_BINARY</span>     <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_BINARY_INV</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_TRUNC</span>      <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_TOZERO</span>     <span class="o">=</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_TOZERO_INV</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_MASK</span>       <span class="o">=</span> <span class="mi">7</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_OTSU</span>       <span class="o">=</span> <span class="mi">8</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">THRESH_TRIANGLE</span>   <span class="o">=</span> <span class="mi">16</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><h2 id="自定义线型滤波">自定义线型滤波</h2>
<h3 id="卷积概念">卷积概念</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.00.29.png" alt="iShot2020-09-2904.00.29.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.00.43.png" alt="iShot2020-09-2904.00.43.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.02.52.png" alt="iShot2020-09-2904.02.52.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.02.15.png" alt="iShot2020-09-2904.02.15.png"  /></p>
<h3 id="常见算子">常见算子</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.03.02.png" alt="iShot2020-09-2904.03.02.png"  /></p>
<h3 id="自定义卷积模糊">自定义卷积模糊</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">filter2D</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="c1">//输入图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="c1">// 模糊图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">depth</span><span class="p">,</span> <span class="c1">// 图像深度32/8
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel</span><span class="p">,</span> <span class="c1">// 卷积核/模板
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Point</span> <span class="n">anchor</span><span class="p">,</span> <span class="c1">// 锚点位置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">delta</span> <span class="c1">// 计算出来的像素+delta
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">)</span>
</span></span></code></pre></div><h3 id="示例-8">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">	<span class="c1">// Sobel X 方向
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">Mat_</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//Sobel Y 方向
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel_y</span> <span class="o">=</span> <span class="p">(</span><span class="n">Mat_</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 拉普拉斯算子
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Mat</span> <span class="n">kernel</span> <span class="o">=</span> <span class="p">(</span><span class="n">Mat_</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">filter2D</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">kernel_x</span><span class="p">,</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="边缘处理">边缘处理</h2>
<h3 id="卷积边缘问题">卷积边缘问题</h3>
<p><a href="https://pic.kanikig.xyz/image/ROJS">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.13.20.png" alt="iShot2020-09-2904.13.20.png"  /></a></p>
<h3 id="处理边缘">处理边缘</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-09-2904.13.34.png" alt="iShot2020-09-2904.13.34.png"  /></p>
<h3 id="示例-9">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">copyMakeBorder</span><span class="err">（</span>
</span></span><span class="line"><span class="cl"> <span class="n">Mat</span> <span class="n">src</span><span class="p">,</span> <span class="c1">// 输入图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">Mat</span> <span class="n">dst</span><span class="p">,</span> <span class="c1">// 添加边缘图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kt">int</span> <span class="n">top</span><span class="p">,</span> <span class="c1">// 边缘长度，一般上下左右都取相同值，
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kt">int</span> <span class="n">bottom</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="kt">int</span> <span class="n">right</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl"> <span class="kt">int</span> <span class="n">borderType</span> <span class="c1">// 边缘类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">Scalar</span> <span class="n">value</span> 
</span></span><span class="line"><span class="cl"><span class="err">）</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="nb">true</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="n">c</span> <span class="o">=</span> <span class="n">waitKey</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">//esc
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span><span class="p">((</span><span class="kt">char</span><span class="p">)</span><span class="n">c</span> <span class="o">==</span> <span class="mi">27</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="k">break</span><span class="p">;}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="sobel算子">Sobel算子</h2>
<h3 id="卷积应用-边缘提取">卷积应用-边缘提取</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0204.39.29.png" alt="iShot2020-10-0204.39.29.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0204.39.51.png" alt="iShot2020-10-0204.39.51.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0204.40.04.png" alt="iShot2020-10-0204.40.04.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0204.40.15.png" alt="iShot2020-10-0204.40.15.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0204.49.30.png" alt="iShot2020-10-0204.49.30.png"  /></p>
<h3 id="示例-10">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Sobel</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">Src</span> <span class="c1">// 输入图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">OutputArray</span> <span class="n">dst</span><span class="c1">// 输出图像，大小与输入图像一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">depth</span> <span class="c1">// 输出图像深度. 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Int</span> <span class="n">dx</span><span class="p">.</span>  <span class="c1">// X方向，几阶导数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">dy</span> <span class="c1">// Y方向，几阶导数. 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">ksize</span><span class="p">,</span> <span class="n">SOBEL算子kernel大小</span><span class="err">，必须是</span><span class="mi">1</span><span class="err">、</span><span class="mi">3</span><span class="err">、</span><span class="mi">5</span><span class="err">、</span><span class="mi">7</span><span class="err">、</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">scale</span>  <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">delta</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">borderType</span> <span class="o">=</span> <span class="n">BORDER_DEFAULT</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//Sobel 的改进
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Scharr</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">Src</span> <span class="c1">// 输入图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">OutputArray</span> <span class="n">dst</span><span class="c1">// 输出图像，大小与输入图像一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">depth</span> <span class="c1">// 输出图像深度. 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Int</span> <span class="n">dx</span><span class="p">.</span>  <span class="c1">// X方向，几阶导数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">dy</span> <span class="c1">// Y方向，几阶导数. 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">scale</span>  <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">delta</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">borderType</span> <span class="o">=</span> <span class="n">BORDER_DEFAULT</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//步骤
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">GaussianBlur</span><span class="p">(</span> <span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">BORDER_DEFAULT</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span> <span class="n">src</span><span class="p">,</span>  <span class="n">gray</span><span class="p">,</span> <span class="n">COLOR_RGB2GRAY</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Scharr</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">xgrad</span><span class="p">,</span> <span class="n">CV_16S</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Scharr</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">ygrad</span><span class="p">,</span> <span class="n">CV_16S</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
</span></span></span><span class="line"><span class="cl"><span class="c1">// Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">convertScaleAbs</span><span class="p">(</span><span class="n">xgrad</span><span class="p">,</span> <span class="n">xgrad</span><span class="p">);</span><span class="c1">// 计算图像A的像素绝对值，输出到图像B
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">convertScaleAbs</span><span class="p">(</span><span class="n">ygrad</span><span class="p">,</span> <span class="n">ygrad</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">addWeighted</span><span class="p">(</span> <span class="n">xgrad</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span><span class="n">ygrad</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">xygrad</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="laplance算子">Laplance算子</h2>
<h3 id="理论-1">理论</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.21.04.png" alt="iShot2020-10-0308.21.04.png"  /></p>
<p><a href="https://pic.kanikig.xyz/image/R6PE">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.21.20.png" alt="iShot2020-10-0308.21.20.png"  /></a></p>
<h3 id="示例-11">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Laplacian</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">src</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">OutputArray</span> <span class="n">dst</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">depth</span><span class="p">,</span> <span class="c1">//深度CV_16S
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">kisze</span><span class="p">,</span> <span class="c1">// 3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">scale</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">delta</span> <span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">borderType</span> <span class="o">=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Mat</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">edge_image</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">GaussianBlur</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">CV_BGR2GRAY</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Laplacian</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">edge_image</span><span class="p">,</span> <span class="n">CV_16S</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">convertScaleAbs</span><span class="p">(</span><span class="n">edge_image</span><span class="p">,</span> <span class="n">edge_image</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">threshold</span><span class="p">(</span><span class="n">edge_image</span><span class="p">,</span> <span class="n">edge_image</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="n">THRESH_OTSU</span> <span class="o">|</span> <span class="n">THRESH_BINARY</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="canny边缘检测">Canny边缘检测</h2>
<h3 id="算法介绍">算法介绍</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.33.22.png" alt="iShot2020-10-0308.33.22.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.33.30.png" alt="iShot2020-10-0308.33.30.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.33.36.png" alt="iShot2020-10-0308.33.36.png"  /></p>
<p><a href="https://pic.kanikig.xyz/image/R4rH">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.40.36.png" alt="iShot2020-10-0308.40.36.png"  /></a></p>
<h3 id="示例-12">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Canny</span><span class="err">（</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">src</span><span class="p">,</span> <span class="c1">// 8-bit的输入图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">OutputArray</span> <span class="n">edges</span><span class="p">,</span><span class="c1">// 输出边缘图像， 一般都是二值图像，背景是黑色
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">threshold1</span><span class="p">,</span><span class="c1">// 低阈值，常取高阈值的1/2或者1/3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">threshold2</span><span class="p">,</span><span class="c1">// 高阈值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">aptertureSize</span><span class="p">,</span><span class="c1">// Soble算子的size，通常3x3，取值3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">bool</span> <span class="n">L2gradient</span> <span class="c1">// 选择 true表示是L2来归一化，否则用L1归一化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="err">）</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">CV_BGR2GRAY</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">blur</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">gray_src</span><span class="p">,</span> <span class="n">Size</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">BORDER_DEFAULT</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Canny</span><span class="p">(</span><span class="n">gray_src</span><span class="p">,</span> <span class="n">edge_output</span><span class="p">,</span> <span class="n">t1_value</span><span class="p">,</span> <span class="n">t1_value</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="霍夫变换-直线检测">霍夫变换-直线检测</h2>
<h3 id="理论-2">理论</h3>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.48.47.png" alt="iShot2020-10-0308.48.47.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.49.31.png" alt="iShot2020-10-0308.49.31.png"  /></p>
<p>
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.49.25.png" alt="iShot2020-10-0308.49.25.png"  /></p>
<p><a href="https://pic.kanikig.xyz/image/RJiz">
  <img loading="lazy" src="https://pic.kanikig.xyz/images/2020/11/26/iShot2020-10-0308.50.04.md.png" alt="iShot2020-10-0308.50.04.md.png"  /></a></p>
<blockquote>
<p>补充资料：https://blog.csdn.net/leonardohaig/article/details/87907462?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight</p>
</blockquote>
<h3 id="示例-13">示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">HoughLines</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">src</span><span class="p">,</span> <span class="c1">// 输入图像，必须8-bit的灰度图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">OutputArray</span> <span class="n">lines</span><span class="p">,</span> <span class="c1">// 输出的极坐标来表示直线
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">rho</span><span class="p">,</span> <span class="c1">// 生成极坐标时候的像素扫描步长
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">theta</span><span class="p">,</span> <span class="c1">//生成极坐标时候的角度步长，一般取值CV_PI/180
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">threshold</span><span class="p">,</span> <span class="c1">// 阈值，只有获得足够交点的极坐标点才被看成是直线
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">srn</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="c1">// 是否应用多尺度的霍夫变换，如果不是设置0表示经典霍夫变换
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">stn</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="c1">//是否应用多尺度的霍夫变换，如果不是设置0表示经典霍夫变换
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">min_theta</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="c1">// 表示角度扫描范围 0 ~180之间， 默认即可
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">max_theta</span><span class="o">=</span><span class="n">CV_PI</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="c1">// 一般情况是有经验的开发者使用，需要自己反变换到平面空间
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="n">HoughLinesP</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="n">InputArray</span> <span class="n">src</span><span class="p">,</span> <span class="c1">// 输入图像，必须8-bit的灰度图像
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">OutputArray</span> <span class="n">lines</span><span class="p">,</span> <span class="c1">// 输出的极坐标来表示直线
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">rho</span><span class="p">,</span> <span class="c1">// 生成极坐标时候的像素扫描步长，一般为1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">theta</span><span class="p">,</span> <span class="c1">//生成极坐标时候的角度步长，一般取值CV_PI/180
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">threshold</span><span class="p">,</span> <span class="c1">// 阈值，只有获得足够交点的极坐标点才被看成是直线
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">minLineLength</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="c1">// 最小直线长度
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">double</span> <span class="n">maxLineGap</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="c1">// 最大间隔
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// extract edge
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Canny</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">src_gray</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">cvtColor</span><span class="p">(</span><span class="n">src_gray</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">CV_GRAY2BGR</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">imshow</span><span class="p">(</span><span class="s">&#34;edge image&#34;</span><span class="p">,</span> <span class="n">src_gray</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="n">Vec4f</span><span class="o">&gt;</span> <span class="n">plines</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">HoughLinesP</span><span class="p">(</span><span class="n">src_gray</span><span class="p">,</span> <span class="n">plines</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">CV_PI</span> <span class="o">/</span> <span class="mf">180.0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">Scalar</span> <span class="n">color</span> <span class="o">=</span> <span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">plines</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">Vec4f</span> <span class="n">hline</span> <span class="o">=</span> <span class="n">plines</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">		<span class="n">line</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="n">Point</span><span class="p">(</span><span class="n">hline</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">hline</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">Point</span><span class="p">(</span><span class="n">hline</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">hline</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span> <span class="n">color</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">LINE_AA</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Linux基础笔记</title>
      <link>https://blog.kanikig.xyz/Linux%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sat, 18 Apr 2020 22:37:02 +0000</pubDate>
      
      <guid>https://blog.kanikig.xyz/Linux%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</guid>
      <description>去年学习python基础课时包含的linux基础课程笔记 记得很简略基本上只有自己看得懂。。 一、操作系统与Linux 1. Operating System 1）操作硬件 2）将操</description>
      <content:encoded><![CDATA[<blockquote>
<p>去年学习python基础课时包含的linux基础课程笔记</p>
<p>记得很简略基本上只有自己看得懂。。</p>
</blockquote>
<h2 id="一操作系统与linux">一、操作系统与Linux</h2>
<h3 id="1-operating-system">1. Operating System</h3>
<p>1）操作硬件
2）将操作硬件的方法封装为系统调用</p>
<h4 id="11-操作系统分类">1.1 操作系统分类</h4>
<ul>
<li>桌面操作系统</li>
<li>服务器操作系统</li>
<li>嵌入式操作系统</li>
<li>移动设备操作系统</li>
</ul>
<h3 id="2操作系统发展史">2.操作系统发展史</h3>
<h4 id="21-unix">2.1 Unix</h4>
<p>星际旅行
BCPL-&gt;B语言-&gt;C语言
Unix
多用户</p>
<h4 id="22-linux">2.2 Linux</h4>
<p>在minix基础上
内核</p>
<h4 id="23-linux内核与发行版">2.3 Linux内核与发行版</h4>
<p>增加了终端命令
内核是封装好的系统调用
发行版是在内核基础上开发的一套应用程序</p>
<h4 id="24-linux文件系统">2.4 Linux文件系统</h4>
<p>win 盘符
因为xp之前都是单用户</p>
<p>linux
home下放着各个用户的文件夹</p>
<p>etc 系统配置文件
bin 可执行二进制文件
home 用户目录</p>
<h2 id="二linux终端命令">二、Linux终端命令</h2>
<p>掌握常用的十几个即可,不常用的查表</p>
<p>ctrl +/- 放大终端字体</p>
<h3 id="1最常见的7个命令">1.最常见的7个命令:</h3>
<ol>
<li><strong>ls</strong>      list 查看当前文件夹下的内容</li>
<li><strong>pwd</strong>     print work directoty 查看当前文件夹</li>
<li><strong>cd</strong>      change directory 切换文件夹</li>
<li><strong>touch</strong>   touch  如果文件不存在则新建文件</li>
<li><strong>mkdir</strong>   make directory 创建目录</li>
<li><strong>rm</strong>      remove 删除文件</li>
<li><strong>clear</strong>   清屏</li>
</ol>
<h3 id="2终端命令格式">2.终端命令格式</h3>
<p>command [-option][parameter]</p>
<p>rm -r 文件夹</p>
<h3 id="3查阅命令帮助信息">3.查阅命令帮助信息</h3>
<p>两种方式</p>
<p><strong>command &ndash;help</strong></p>
<p><strong>man command</strong>
空格 翻页
回车 下一行
b 回滚一页
f 翻页
q 退出</p>
<p>(command 为对应命令）</p>
<h3 id="4文件和目录常用命令">4.文件和目录常用命令</h3>
<p>ls cd touch rm mkdir</p>
<p>tab自动补全文件名 如果有其他选择，再按一次，系统会提示可能命令</p>
<p>上下可以切换至以前的命令
ctrl c 直接回到最下</p>
<p>拷贝和移动
tree cp mv</p>
<p>查看文件内容
cat more grep</p>
<h4 id="1-ls">1) ls</h4>
<p>.开头为隐藏文件 ls需要-a (all)
如果需要创建隐藏文件，只需要加.</p>
<p>. 当前目录
.. 上级目录</p>
<p>ls -a   显示全部文件
ls -l   列表方式显示文件全部信息
ls -h   配合-l人性化显示文件大小</p>
<p>drwxr-xr-x 4 kanikig kanikig    4096 5月  19 18:02 AppWebCache
drwxr-xr-x 3 kanikig kanikig    4096 6月  16 22:55 Audio
drwxr-xr-x 2 kanikig kanikig    4096 5月  18 18:13 CloudRes
-rw-r&ndash;r&ndash; 1 kanikig kanikig   33280 5月  26 15:05 CustomFace.db
-rw-r&ndash;r&ndash; 1 kanikig kanikig  494509 7月   9 14:01 CustomFace.dbc
-rw-r&ndash;r&ndash; 1 kanikig kanikig  132096 7月   9 14:01 DingDongStorage.db
-rw-r&ndash;r&ndash; 1 kanikig kanikig       0 5月  18 18:08 DingDongStorage.db-journal
-rw-r&ndash;r&ndash; 1 kanikig kanikig   25600 7月   9 14:01 DocImport.db</p>
<p>d代表目录</p>
<p>ls -l -h
文件大小更直观
drwxr-xr-x 4 kanikig kanikig 4.0K 5月  19 18:02 AppWebCache
drwxr-xr-x 3 kanikig kanikig 4.0K 6月  16 22:55 Audio
drwxr-xr-x 2 kanikig kanikig 4.0K 5月  18 18:13 CloudRes
-rw-r&ndash;r&ndash; 1 kanikig kanikig  33K 5月  26 15:05 CustomFace.db
-rw-r&ndash;r&ndash; 1 kanikig kanikig 483K 7月   9 14:01 CustomFace.dbc</p>
<p>选项可以连写 如
ls -alh</p>
<p>ls与通配符</p>
<ul>
<li>任意字符串
?   任意字符
[]  匹配字符组任意一个 [1-9] [abc]</li>
</ul>
<p>如 ls m* 找m开头的</p>
<h4 id="2-cd">2) cd</h4>
<p>常用参数</p>
<p>cd 直接回家
或者加波浪号 ~ 直接返回家目录
cd - 在最近两次目录切换</p>
<p>相对路径
绝对路径 /或者~开头</p>
<h4 id="3--touch">3)  touch</h4>
<p>如果已经存在，则修改日期更新</p>
<h4 id="4--mkdir">4)  mkdir</h4>
<p>-p 连续创建目录</p>
<p>mkdir -p a/b/c/d</p>
<p>(linux 一个目录下 文件夹和文件也不可重名)</p>
<h4 id="5--rm">5)  rm</h4>
<p>-f 强制删除
-r 递归删除</p>
<p>同样可使用通配符</p>
<h4 id="6--tree">6)  tree</h4>
<p>树状图列出文件系统</p>
<p>-d 只显示目录</p>
<h4 id="7--cp">7)  cp</h4>
<p>cd 源文件 目标文件</p>
<p>文本编辑器 ctrl s 快速保存</p>
<p>后面可以指定文件名
不改的话可以只写目录</p>
<p>-i 覆盖文件前提示
-r 递归复制整个文件夹</p>
<h4 id="8--mv">8)  mv</h4>
<p>mv 源文件 目标文件
-i 覆盖前提示</p>
<h4 id="9--cat">9)  cat</h4>
<p>concatenate
查看文件内容</p>
<p>-b 对非空输出行编号
-n 对全部输出行编号</p>
<h4 id="10-more">10) more</h4>
<p>分页显示
用来查看大文件</p>
<p>操作快捷键和man一样</p>
<h4 id="11-grep">11） grep</h4>
<p>强大的文本搜索工具</p>
<p>-n 显示行号
-v 不包含文本内容的行（求反
-i 忽略大小写</p>
<p>模式查找
^asdasd  行开头匹配
asdasd$  行尾匹配</p>
<h4 id="12-echo">12) echo</h4>
<p>在终端输出</p>
<p>重定向：把本应该在终端输出的内容输出到文件里</p>
<p>&lsquo;&gt;&lsquo;输出到文件（覆盖）</p>
<p>&lsquo;&raquo;&lsquo;追加</p>
<p>\就是换行
不仅可以用与echo
ls也可重定向</p>
<p>ls -lh &raquo;a</p>
<h4 id="13-">13) |</h4>
<p>管道
一个命令的输出通过管道作为另一个命令的输入</p>
<p>ls -lha | more  分页显示
ls -lha | grep ds 筛选输出</p>
<h2 id="三远程管理">三、远程管理</h2>
<h3 id="1shutdown">1.shutdown</h3>
<p>shutdown 选项 时间</p>
<p>默认是一分钟后关机
now 立即重启</p>
<p>shutdown 20:25
shutdown +10 十分钟后关机</p>
<p>-r 重启</p>
<h3 id="2查看配置网卡">2.查看配置网卡</h3>
<p>网卡
负责网络通讯的硬件设备
ip地址是设置在网卡上的地址信息</p>
<p><strong>ifconfig</strong> 查看/配置网卡信息
<strong>ping</strong> 测试连接是否正常</p>
<p>ifconfig | grep inet 快速看ip
一个物理网卡和多个虚拟网卡
物理网卡 ens..</p>
<p>ping
ctrl c 停止</p>
<h3 id="3远程登录和复制">3.远程登录和复制</h3>
<h4 id="1--ssh">1)  ssh</h4>
<p>Secure Shell</p>
<p>域名 ip地址别名
端口号 通过端口号可以找到计算机运行的应用程序
ssh端口号默认22 可缺省
ftp 21
web服务器 80</p>
<p><strong>ssh [-p port] user@remote</strong>
remote为远程ip
port 默认22</p>
<p>exit退出登录</p>
<h4 id="2--scp">2)  scp</h4>
<p>远程拷贝文件</p>
<p>从远程下到本地 scp -P(大写！) 22 源文件 user@remote:目标文件
从本地传到远程 scp user@remote:源文件 目标文件
-r 传送文件夹
-P指定端口</p>
<h4 id="3--ssh高级">3)  ssh高级</h4>
<p>免密码登录
配置别名</p>
<p>ssh的配置信息都在.ssh下</p>
<p>免密码登录：
本地 .ssh目录下执行ssh-keygen 一路回车 生成两个文件 （公钥，私钥）
然后ssh-copy-id [-p] user@remote 会把一个授权文件传到服务器的.ssh下</p>
<p>非对称加密算法
使用公钥加密的数据，需要用私钥解密
用私钥加密的数据，用公钥解密</p>
<p>在本地通过私钥加密数据，在服务器的公钥对数据解密</p>
<p>配置别名：
在.ssh下创建config文件
在其中写入</p>
<p>Host h1
HostName 202.182.115.91
User root
Port 22</p>
<h2 id="四用户与权限">四、用户与权限</h2>
<p>用户与权限的概念
用户管理
组管理
修改权限</p>
<h3 id="1用户与权限">1.用户与权限</h3>
<p>读 r 4
写 w 2
执行 x 1</p>
<p>用户组</p>
<h4 id="1">1）</h4>
<p>​     权限       用户     组
drwxr-xr-x 3 kanikig kanikig 4.0K 5月  18 16:45 Music
drwxr-xr-x 2 kanikig kanikig 4.0K 5月  18 22:17 Pictures
drwxr-xr-x 3 kanikig kanikig 4.0K 7月   8 22:58 PycharmProjects
-rw-r&ndash;r&ndash; 1 kanikig kanikig  485 7月  11 15:39 shadowsocks.json
-rw-r&ndash;r&ndash; 1 kanikig kanikig  485 7月  11 15:25 shadowsocs.json
-rw-r&ndash;r&ndash; 1 kanikig kanikig    0 5月  18 16:44 stale_outputs_checked
drwxr-xr-x 2 kanikig kanikig 4.0K 5月  18 14:25 Videos</p>
<p>硬链接数 有多少种方式能够访问一个文件或目录
文件一般是1 即绝对路径
文件夹 2或以上 因为可以cd. 或者从子目录cd..（这里可以无数个）</p>
<p>所以硬链接数可以判断子目录个数</p>
<p>第一列 文件或文件夹
之后每3个字符一组
第一组 文件或目录的拥有者
第二组 用户组的权限
第三组 其他用户</p>
<h4 id="2-chmod">2) chmod</h4>
<p>修改文件或目录权限
changemod</p>
<p><strong>chmod +/-rwx 文件或目录</strong></p>
<p>对于目录 可读是阅读目录内容 可写是修改目录内容 可执行是在目录下执行终端命令</p>
<h4 id="3root">3)root</h4>
<p>sudo
substitute user do
5分钟有效期限</p>
<h3 id="2组管理">2.组管理</h3>
<p>groupadd 组名
groupdel 组名
cat /etc/group 确认组信息
chagrp -R 组名 文件/目录  修改文件目录所属的组</p>
<h3 id="3用户管理">3.用户管理</h3>
<p>useradd -m -g 组 用户名
-m 自动建立用户目录
-g 指定用户的组，否则自动建立一个同名组</p>
<p>passwd 设置用户密码
userdel -r 用户名
-r 删除用户家目录
cat /etc/passwd | grep 用户名     确认用户信息
passwd文件
1用户名
2密码 x
3uid
4gid
5用户全名
6家目录
7登录使用的shell</p>
<p>查看用户信息
id 用户名  查看用户id和组id
who 查看当前登录的用户列表
whoami 查看当前登录的用户名</p>
<p>usermod
设置用户主组、附加组和登录shell</p>
<p>主组 建立用户时指定的组
附加组 指定附加组</p>
<p>usermod -g 组 用户名   修改用户主组
usermod -G 组 用户名   修改附加组
usermod -s /bin/bash  修改shell</p>
<p>usermod -G sudo 用户名  将用户添加到sudo</p>
<p>shell 输入终端命令的软件</p>
<p>dash
bash</p>
<p>which
查看执行命令的所在位置</p>
<p>/etc/passwd 保存用户信息
/usr/bin/passwd 修改密码的程序</p>
<p>su 用户名 切换用户
exit 退出</p>
<h3 id="4修改文件权限">4.修改文件权限</h3>
<p>chown 修改拥有者
chagrp 修改组
chmod 修改权限</p>
<p>chown 用户名 文件或目录
chgrp -R 组名 文件或目录
chmod -R 755 文件或目录</p>
<p>7 拥有者的权限
5 组成员权限
5 其他用户权限</p>
<p>r=4
w=2
x=1</p>
<p>所以可以推测</p>
<h2 id="五系统信息">五、系统信息</h2>
<h3 id="1时间日期">1.时间日期</h3>
<p>cal  本月日历  -y 一年的日历
date 当前系统时间</p>
<h3 id="2磁盘信息">2.磁盘信息</h3>
<p>df -h  disk free 显示磁盘剩余空间
du -h  [目录名]  查看目录的占用空间</p>
<h3 id="3进程信息">3.进程信息</h3>
<p>进程：当前正在执行的程序</p>
<p>ps aux   process status查看进程详细情况
top 动态显示进程并排序 q 退出
kill [-9] 进程代号  -9强行停止</p>
<p>ps默认只能看到终端启动的程序
a 所有用户的进程
u 显示进程详细状态
x 显示没有控制终端的进程</p>
<p>最好不要kill root的进程</p>
<h3 id="4其他命令">4.其他命令</h3>
<ul>
<li>find 查找文件</li>
<li>ln   软连接(相当于快捷方式)</li>
<li>tar  打包压缩</li>
<li>apt-get 软件安装</li>
</ul>
<p>find [路径] -name “*.py”
ln -s 源文件 链接文件
源文件要用绝对路径
如果没有-s 会创建一个硬链接</p>
<p>对于软连接，如果源文件被移动或删除，则会失效，硬链接不会</p>
<p>硬链接：
linux中，文件名和文件数据是分开存储的
通过文件名访问数据
而硬链接是和文件名等价的，直接访问数据，相当于别名
软连接是通过软连接文件数据，访问源文件的文件名，间接访问数据
日常基本不会建立硬链接
硬链接数为0时，文件的数据才会删除</p>
<h3 id="5打包压缩">5.打包压缩</h3>
<p>linux常用tar.gz
tar只是打包，不压缩</p>
<p>tar -cvf 打包文件.tar 被打包文件/路径   打包
tar -xvf 打包文件.tar  解包</p>
<p>-v列出打包详细过程
-f指定文件名（f必须放最后）</p>
<p>gzip
压缩打包后的文件</p>
<p>tar -zcvf 打包文件.tar.gz 被压缩文件
tar -zxvf 打包文件.tar.gz   解压缩
tar -zxvf 打包文件.tar.gz -C 目标路径   解压到指定路径</p>
<p>bzip2(two)</p>
<p>tar.bz2</p>
<p>在选项最前加-j</p>
<h3 id="6apt">6.apt</h3>
<p>advanced packaging tool</p>
<p>sudo apt install 软件包
sudo apt remove 软件包
sudo apt upgrade 更新软件包</p>
<p>sl 小火车
htop top的升级版
linuxlogo
screenfetch</p>
<p>让终端变得有意思
在终端输入sudo visudo
在“Defaults”末尾（文件的前半部分）添加一行“Defaults insults”。
保存
之后当你使用sudo，在输入密码的时候，如果输入错误了，那么终端开始胡说八道了</p>
<p>cmatrix 黑客帝国
rev 逆序输出 一般用于管道后
lolcat 彩色输出
cowsay 一头牛说出输出结果
aptitude moo 也是一头牛，但是是用来玩的
fortune 随机输出一段话 -zh 输出中国诗
toilet 打印出大字母
figlet 同上
aafire  这个会在屏幕上显示除一团燃烧着的火焰   sudo apt install libaa-bin
oneko 一只小猫追着鼠标跑
factor 分解质因数
espeak 朗读</p>
<p>fork炸弹。。指数自乘直到占用所有系统资源</p>
<p>bb 一个不太一样的播放器
ASCIIquarium 水族馆</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
