<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>伪技术 on 黑猫说</title>
    
    
    
    <link>https://zhaowang.me/categories/%E4%BC%AA%E6%8A%80%E6%9C%AF/</link>
    <description>Recent content in 伪技术 on 黑猫说</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 08 Feb 2024 20:40:00 +0000</lastBuildDate>
    
	<atom:link href="https://zhaowang.me/categories/%E4%BC%AA%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>软路由系列--Others</title>
      <link>https://zhaowang.me/archives/soft-router-others/</link>
      <pubDate>Thu, 08 Feb 2024 20:40:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/soft-router-others/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;others&#34;&gt;Others&lt;/h2&gt;
&lt;p&gt;还有一些其他的点，顺带记录下&lt;/p&gt;
&lt;h3 id=&#34;samba&#34;&gt;Samba&lt;/h3&gt;
&lt;p&gt;安装软件后，配置目录，添加smb用户和密码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install samba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/samba/smb.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;global&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  workgroup &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SAMBA
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  security &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; user
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  passdb backend &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tdbsam
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  printing &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; cups 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  printcap name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; cups
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  load printers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cups options &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; raw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;other&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  comment &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; other
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /data/other
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  browseable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  writable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  write list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; +smbuser1  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;smbpasswd -a smbuser1  &lt;span style=&#34;color:#75715e&#34;&gt;# 添加用户，设置密码，这个密码是samba的密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;把sonarr的docker-ip添加到transmission-访问白名单&#34;&gt;把Sonarr的docker IP添加到Transmission 访问白名单&lt;/h3&gt;
&lt;p&gt;Transmission我们是docker安装的，所以白名单的IP是docker的IP，我们使用以下命令获取到sonarr的IP&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network inspect sonarr_default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设得到的是172.18.0.1，那么我们在transmission的配置文件中添加以下内容即可，这样的话，sonarr就可以访问transmission了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- WHITELIST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;127.0.0.1,10.0.3.*,172.17.*.*
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- HOST_WHITELIST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;127.0.0.1,10.0.3.*,172.17.*.*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;fstab&#34;&gt;fstab&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/fstab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;       &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UUID&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;xxxxxx /data/other ext4 defaults &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中的UUID可以使用&lt;code&gt;blkid&lt;/code&gt;命令获取，填入即可&lt;/p&gt;
&lt;h3 id=&#34;rclocal&#34;&gt;rc.local&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/systemd/system/rclocal.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Unit&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Other Starting Scripts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;network.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Service&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/opt/rclocal/rc.local
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Install&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WantedBy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x /etc/systemd/system/rclocal.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable rclocal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /opt/rclocal/rc.local
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# your commands&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iptables -t nat -A POSTROUTING -j MASQUERADE &lt;span style=&#34;color:#75715e&#34;&gt;# 开启nat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sdparm --flexible -6 -l --set SCT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6000&lt;/span&gt; --set STANDBY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; /dev/sda &lt;span style=&#34;color:#75715e&#34;&gt;# 设置硬盘休眠时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        
        </description>
    </item>
    
    <item>
      <title>软路由系列--Docker</title>
      <link>https://zhaowang.me/archives/soft-router-docker/</link>
      <pubDate>Thu, 08 Feb 2024 20:30:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/soft-router-docker/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;why-docker&#34;&gt;Why Docker&lt;/h2&gt;
&lt;p&gt;为什么要用Docker，而不是直接安装软件？或者用虚拟机？&lt;/p&gt;
&lt;p&gt;问题1 直接安装，最大的是依赖问题，杂七杂八的会搞乱系统
问题2 虚拟机，比较复杂，占用资源，多一层虚拟化，性能损耗&lt;/p&gt;
&lt;h3 id=&#34;docker-安装&#34;&gt;Docker 安装&lt;/h3&gt;
&lt;p&gt;直接看官方系统吧&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/engine/install/ubuntu/&#34;&gt;docker install on ubuntu&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;docker-软件列表&#34;&gt;Docker 软件列表&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/linuxserver&#34;&gt;linuxserver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以安装如下软件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sonarr&lt;/li&gt;
&lt;li&gt;transmission&lt;/li&gt;
&lt;li&gt;jackett&lt;/li&gt;
&lt;li&gt;emby&lt;/li&gt;
&lt;li&gt;and so on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议大家使用docker compose来管理你的docker，存到单独一个软件的文件夹，这样方便管理&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;sonarr&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/linuxserver/sonarr:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;sonarr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=Asia/Shanghai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/docker/sonarr/config:/config&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 建议每个软件都有自己的配置文件夹,数据隔离&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/path/to/your/local/tv:/tv&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#optional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/path/to/your/local/downloads:/downloads&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#optional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8989&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        
        </description>
    </item>
    
    <item>
      <title>软路由系列--续篇--代理和DNS设置</title>
      <link>https://zhaowang.me/archives/soft-router-proxy-and-dns/</link>
      <pubDate>Thu, 08 Feb 2024 20:00:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/soft-router-proxy-and-dns/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;为啥要写这个&#34;&gt;为啥要写这个&lt;/h2&gt;
&lt;p&gt;之前买的零刻N-305小主机很好用，又买了一个，替换掉服役6年的小马n3700。趁这次机会，记录下代理和DNS的设置。&lt;/p&gt;
&lt;h3 id=&#34;clash代理&#34;&gt;Clash代理&lt;/h3&gt;
&lt;p&gt;这个我不多说了，大家google一下，网上很多，我记录下与软路由的集成。&lt;/p&gt;
&lt;h4 id=&#34;禁用ubuntu自带的dns&#34;&gt;禁用Ubuntu自带的DNS&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable systemd-resolved
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/resolv.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nameserver 10.0.1.1 &lt;span style=&#34;color:#75715e&#34;&gt;# 这里是你的软路由的ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;开启dhcp服务给其他设备分配ip或者提供dns服务&#34;&gt;开启dhcp服务,给其他设备分配ip或者提供dns服务&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; apt install dnsmasq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑配置文件, 设置dhcp的网段，dns，dns解析文件，端口&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/dnsmasq.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;interface&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;br0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhcp-range&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;10.0.1.2,10.0.1.254,72h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhcp-option&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;6,10.0.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;resolv-file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/resolv.dnsmasq.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1053&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 这里我改成了1053，我其他地方有个dns服务，端口是53，所以这里改成了1053&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;clash的dns设置&#34;&gt;Clash的DNS设置&lt;/h4&gt;
&lt;p&gt;这样的话，相当于你有一个本地的DNS代理，你上游是一些可信的DNS服务器，比如谷歌的，还有一些是宽带运营商的，同时开启fake-ip 模式，这样的话，你的设备比如访问一个被墙的网站，会被Clash代理到一个假的ip地址，你不需要单独设置iptables规则，直接可以透明翻墙。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;dns&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;enable&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0.0.0&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;default-nameserver&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.4.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;1.1.1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.8.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;114.114.114.114&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;enhanced-mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;fake-ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;fake-ip-range&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;198.18.0.1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/16&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Fake IP addresses pool CIDR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;nameserver&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;202.101.172.35&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;202.101.172.47&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.8.8&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# default value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;tls://dns.rubyfish.cn:853&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# DNS over TLS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;tls://dns.google:853&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;https://1.1.1.1/dns-query&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# DNS over HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;dhcp://enp1s0&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# dns from dhcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;fallback&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;tls://1.0.0.1:853&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;tls://dns.google:853&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;fallback-filter&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;geoip&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ipcidr&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;240.0.0.0&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        
        </description>
    </item>
    
    <item>
      <title>软路由系列--路由器系统-Ubuntu</title>
      <link>https://zhaowang.me/archives/soft-router-system-ubuntu/</link>
      <pubDate>Sat, 08 Jul 2023 21:00:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/soft-router-system-ubuntu/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;软路由的系统&#34;&gt;软路由的系统&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://zhaowang.me/archives/47/&#34;&gt;软路由系统安装&lt;/a&gt; 篇1也是写于三年前左右了&lt;/p&gt;
&lt;p&gt;自己的软路由系统一直在用linux发行版，第一次使用软路由是2018年了，当时使用的是centos7，还是小马的软路由n3700,当时自己加配了8G内存，也就是4C8G,固态硬盘120，而后这个固态也在今年挂掉了，4月份还重装了下系统，由于配置还在，所以当时继续沿用了centos7&lt;/p&gt;
&lt;p&gt;不过呢，最近刚好入手了一个零刻的小主机，i3-N305, 8核8线程，1.8GHz-&amp;gt;3.8GHz, 16G,512G。最近也是想换个系统了，因为centos7的软件源太老了，带的内核还是3.10的，官方也没人维护了，索性切换到Ubuntu 22.04.02了，内核5.15(晚些换成6)&lt;/p&gt;
&lt;h3 id=&#34;ubuntu-220402&#34;&gt;Ubuntu 22.04.02&lt;/h3&gt;
&lt;p&gt;我选择的是server版本，安装的时候，根本不会跳出来GUI，全部命令行，超级nice，而且很贴心的自动把SSH远程访问勾选了，只要安装好，就可以使用远程登陆了，也不需要自己开启了。&lt;/p&gt;
&lt;h4 id=&#34;开启软路由功能&#34;&gt;开启软路由功能&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install bridge-utils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑 netplan yaml文件,这台主机只有两个网口，所以搞个bridge，而后一个网口当做wan口，一个网口当做lan口，把lan口加入到bridge中即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/netplan/00-installer-config.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;network&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ethernets&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enp1s0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enp2s0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;bridges&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;br0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;addresses&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;10.0.1.1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/24]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;nameservers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;addresses&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.8.8&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;interfaces&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;enp2s0]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;应用配置，并且查看信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;netplan apply
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brctl show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;类似以下就成功了，其中enp2s0 就是lan口，你下面挂其他wifi放大器，或者交换机等等&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bridge name	bridge id		STP enabled	interfaces
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;br0		8000.6aa01d4c1f71	no		enp2s0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;开启dhcp服务给其他设备分配ip或者提供dns服务&#34;&gt;开启dhcp服务,给其他设备分配ip或者提供dns服务&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; apt install dnsmasq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑配置文件, 设置dhcp的网段，dns，dns解析文件，端口&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/dnsmasq.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;interface&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;br0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhcp-range&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;10.0.1.2,10.0.1.254,72h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhcp-option&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;6,10.0.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;resolv-file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/resolv.dnsmasq.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1053&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 这里我改成了1053，我其他地方有个dns服务，端口是53，所以这里改成了1053&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果有自己的dns proxy，这里要注意，ubuntu有个默认的resolv.service,可以把他禁用掉，不然会冲突&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable systemd-resolved
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;开启linux转发和nat功能&#34;&gt;开启linux转发和nat功能&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net.ipv4.ip_forward&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net.ipv6.conf.all.forwarding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sysctl -p /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iptables -A FORWARD -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iptables -t nat -A POSTROUTING -j MASQUERADE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;完结&#34;&gt;完结&lt;/h2&gt;
&lt;p&gt;这样就完结了，一个软路由就可以玩了.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>go解决c10k problem(二)--db版下单场景</title>
      <link>https://zhaowang.me/archives/go-c10k-problem-2/</link>
      <pubDate>Sat, 14 Jan 2023 17:20:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/go-c10k-problem-2/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TL;DR&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;这是一篇去年8月写的文章，本来是希望达到10k, 不过实际测试并没有成功，最终达到了1000+的事务，完成C10K的一个K，还有9个 :(&lt;/p&gt;
&lt;h2 id=&#34;db选择&#34;&gt;DB选择&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DB&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;业务&lt;/th&gt;
&lt;th&gt;io&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mysql&lt;/td&gt;
&lt;td&gt;sql，支持事务，有缓存&lt;/td&gt;
&lt;td&gt;强sql，强类型，类似java&lt;/td&gt;
&lt;td&gt;B &amp;amp; B+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;sql，支持事务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mongo&lt;/td&gt;
&lt;td&gt;nosql，key-value DB，读很快&lt;/td&gt;
&lt;td&gt;弱sql，非强制，类似js&lt;/td&gt;
&lt;td&gt;B+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;nosql&lt;/td&gt;
&lt;td&gt;just kv，代码复杂&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sqlite3&lt;/td&gt;
&lt;td&gt;sql&lt;/td&gt;
&lt;td&gt;强sql，支持事务&lt;/td&gt;
&lt;td&gt;Btree&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;初步结论，理论上是随便用，先用sqlite3把，如果性能达不到，再来排查原因和更改DB&lt;/p&gt;
&lt;h2 id=&#34;业务场景&#34;&gt;业务场景&lt;/h2&gt;
&lt;p&gt;我们设计一个sticker网站，可以售卖sticker，用户可以购买sticker，sticker是有库存的，如果用户的余额足够，则可以售卖，另外售卖的过程中，如果库存没了的话，需要回滚订单。&lt;/p&gt;
&lt;h2 id=&#34;主要对象&#34;&gt;主要对象&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用户&lt;/li&gt;
&lt;li&gt;商品，库存字段也在商品身上&lt;/li&gt;
&lt;li&gt;订单&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;主要流程&#34;&gt;主要流程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;商品的详情页面，get v1/api/sticker/:id&lt;/li&gt;
&lt;li&gt;商品的点赞+1接口，post v1/api/sticker/likes&lt;/li&gt;
&lt;li&gt;下单接口，post v1/api/order&lt;/li&gt;
&lt;li&gt;订单查看接口，get v1/api/order/:id&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;表现&#34;&gt;表现&lt;/h2&gt;
&lt;h2 id=&#34;get-接口-读&#34;&gt;get 接口 读&lt;/h2&gt;
&lt;p&gt;load&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10154&lt;/span&gt; ubuntu &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1757000&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;36888&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10020&lt;/span&gt; R 362.7 0.1 2:48.41 main 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9046&lt;/span&gt; ubuntu &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2125668&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;31976&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9876&lt;/span&gt; S 346.3 0.1 2:51.78 server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;QPS表现&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;14296&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15228.54&lt;/td&gt;
&lt;td&gt;39.92&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;td&gt;6.57&lt;/td&gt;
&lt;td&gt;2,201,584&lt;/td&gt;
&lt;td&gt;2,201,538&lt;/td&gt;
&lt;td&gt;200:14296&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;29744&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15753.80&lt;/td&gt;
&lt;td&gt;39.92&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;td&gt;6.35&lt;/td&gt;
&lt;td&gt;4,580,576&lt;/td&gt;
&lt;td&gt;2,290,266&lt;/td&gt;
&lt;td&gt;200:29744&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;45190&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15899.55&lt;/td&gt;
&lt;td&gt;39.92&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;td&gt;6.29&lt;/td&gt;
&lt;td&gt;6,959,260&lt;/td&gt;
&lt;td&gt;2,315,325&lt;/td&gt;
&lt;td&gt;200:45228&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;下单接口-事务写&#34;&gt;下单接口 事务写&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9046&lt;/span&gt; ubuntu &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5731688&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;145260&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10004&lt;/span&gt; S 11.0 0.4 8:56.24 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10310&lt;/span&gt; ubuntu &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1535804&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;21276&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9868&lt;/span&gt; S 2.3 0.1 0:45.78 main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;462.62&lt;/td&gt;
&lt;td&gt;921.42&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;td&gt;216.16&lt;/td&gt;
&lt;td&gt;4,854&lt;/td&gt;
&lt;td&gt;4,853&lt;/td&gt;
&lt;td&gt;200:234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;468&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;339.03&lt;/td&gt;
&lt;td&gt;1723.88&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;td&gt;294.95&lt;/td&gt;
&lt;td&gt;9,632&lt;/td&gt;
&lt;td&gt;4,813&lt;/td&gt;
&lt;td&gt;200:468&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3s&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;671&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;300.53&lt;/td&gt;
&lt;td&gt;2843.52&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;td&gt;332.75&lt;/td&gt;
&lt;td&gt;13,697&lt;/td&gt;
&lt;td&gt;4,564&lt;/td&gt;
&lt;td&gt;200:671&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4s&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;891&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;267.94&lt;/td&gt;
&lt;td&gt;3300.58&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;td&gt;373.22&lt;/td&gt;
&lt;td&gt;18,217&lt;/td&gt;
&lt;td&gt;4,553&lt;/td&gt;
&lt;td&gt;200:891&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1127&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;265.51&lt;/td&gt;
&lt;td&gt;4121.60&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;td&gt;376.64&lt;/td&gt;
&lt;td&gt;22,887&lt;/td&gt;
&lt;td&gt;4,577&lt;/td&gt;
&lt;td&gt;200:1127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1352&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;254.29&lt;/td&gt;
&lt;td&gt;4121.60&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;393.26&lt;/td&gt;
&lt;td&gt;27,634&lt;/td&gt;
&lt;td&gt;4,605&lt;/td&gt;
&lt;td&gt;200:1352&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1556&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;243.91&lt;/td&gt;
&lt;td&gt;5965.82&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;409.99&lt;/td&gt;
&lt;td&gt;31,668&lt;/td&gt;
&lt;td&gt;4,523&lt;/td&gt;
&lt;td&gt;200:1556&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1750&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;244.42&lt;/td&gt;
&lt;td&gt;5965.82&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;409.13&lt;/td&gt;
&lt;td&gt;35,364&lt;/td&gt;
&lt;td&gt;4,419&lt;/td&gt;
&lt;td&gt;200:1750&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;242.56&lt;/td&gt;
&lt;td&gt;5965.82&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;412.27&lt;/td&gt;
&lt;td&gt;40,688&lt;/td&gt;
&lt;td&gt;4,520&lt;/td&gt;
&lt;td&gt;200:2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2266&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;242.84&lt;/td&gt;
&lt;td&gt;5965.82&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;411.79&lt;/td&gt;
&lt;td&gt;45,980&lt;/td&gt;
&lt;td&gt;4,597&lt;/td&gt;
&lt;td&gt;200:2266&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2505&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;243.15&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;411.28&lt;/td&gt;
&lt;td&gt;50,668&lt;/td&gt;
&lt;td&gt;4,606&lt;/td&gt;
&lt;td&gt;200:2505&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2769&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;243.57&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;410.56&lt;/td&gt;
&lt;td&gt;56,198&lt;/td&gt;
&lt;td&gt;4,683&lt;/td&gt;
&lt;td&gt;200:2769&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2954&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;240.99&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;414.96&lt;/td&gt;
&lt;td&gt;59,611&lt;/td&gt;
&lt;td&gt;4,585&lt;/td&gt;
&lt;td&gt;200:2954&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3201&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;240.45&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;415.89&lt;/td&gt;
&lt;td&gt;64,578&lt;/td&gt;
&lt;td&gt;4,612&lt;/td&gt;
&lt;td&gt;200:3201&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3437&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;237.23&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;421.53&lt;/td&gt;
&lt;td&gt;69,516&lt;/td&gt;
&lt;td&gt;4,634&lt;/td&gt;
&lt;td&gt;200:3437&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3622&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;235.57&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;424.51&lt;/td&gt;
&lt;td&gt;73,425&lt;/td&gt;
&lt;td&gt;4,588&lt;/td&gt;
&lt;td&gt;200:3622&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3800&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;235.41&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;424.79&lt;/td&gt;
&lt;td&gt;76,927&lt;/td&gt;
&lt;td&gt;4,525&lt;/td&gt;
&lt;td&gt;200:3800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3990&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;234.07&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;427.21&lt;/td&gt;
&lt;td&gt;80,603&lt;/td&gt;
&lt;td&gt;4,477&lt;/td&gt;
&lt;td&gt;200:3990&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4176&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;233.61&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;428.07&lt;/td&gt;
&lt;td&gt;84,177&lt;/td&gt;
&lt;td&gt;4,430&lt;/td&gt;
&lt;td&gt;200:4176&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4328&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;229.46&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;435.81&lt;/td&gt;
&lt;td&gt;87,093&lt;/td&gt;
&lt;td&gt;4,354&lt;/td&gt;
&lt;td&gt;200:4328&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4506&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;229.19&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;436.32&lt;/td&gt;
&lt;td&gt;90,583&lt;/td&gt;
&lt;td&gt;4,313&lt;/td&gt;
&lt;td&gt;200:4506&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4701&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;222.47&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;449.51&lt;/td&gt;
&lt;td&gt;94,600&lt;/td&gt;
&lt;td&gt;4,299&lt;/td&gt;
&lt;td&gt;200:4701&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4862&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;219.28&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;456.03&lt;/td&gt;
&lt;td&gt;97,841&lt;/td&gt;
&lt;td&gt;4,253&lt;/td&gt;
&lt;td&gt;200:4862&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5031&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;216.87&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;461.10&lt;/td&gt;
&lt;td&gt;101,150&lt;/td&gt;
&lt;td&gt;4,214&lt;/td&gt;
&lt;td&gt;200:503&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5199&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;216.08&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;462.78&lt;/td&gt;
&lt;td&gt;104,284&lt;/td&gt;
&lt;td&gt;4,171&lt;/td&gt;
&lt;td&gt;200:519&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5374&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;213.84&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;467.64&lt;/td&gt;
&lt;td&gt;107,871&lt;/td&gt;
&lt;td&gt;4,148&lt;/td&gt;
&lt;td&gt;200:537&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5546&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;212.53&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;470.52&lt;/td&gt;
&lt;td&gt;111,251&lt;/td&gt;
&lt;td&gt;4,120&lt;/td&gt;
&lt;td&gt;200:554&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5718&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;211.58&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;472.63&lt;/td&gt;
&lt;td&gt;114,633&lt;/td&gt;
&lt;td&gt;4,093&lt;/td&gt;
&lt;td&gt;200:571&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5893&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;208.82&lt;/td&gt;
&lt;td&gt;6417.73&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;478.87&lt;/td&gt;
&lt;td&gt;118,122&lt;/td&gt;
&lt;td&gt;4,073&lt;/td&gt;
&lt;td&gt;200:58&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iostat -d -m &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 701.00 0.00 7.82 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 867.00 0.00 9.66 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 990.00 0.00 11.00 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 906.00 0.00 10.75 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 787.00 0.00 8.62 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 240.00 0.00 2.64 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xvda 387.00 0.00 4.25 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;问题出现了&#34;&gt;问题出现了&lt;/h2&gt;
&lt;p&gt;tps 只有200，而且是在8核32G内存的机器上，cpu没有瓶颈，内存也没有，问题出在哪里？&lt;/p&gt;
&lt;h3 id=&#34;1-慢sql&#34;&gt;1 慢sql&lt;/h3&gt;
&lt;p&gt;下单的时候，会读取用户和产品表，此时慢sql&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/04 09:55:45 /home/ubuntu/go/src/c10k-go/cmd/server/server.go:71 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1210.759ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; SELECT * FROM &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;users&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; WHERE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;name&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;demo-9475&amp;#34;&lt;/span&gt; AND &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;users&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; IS NULL ORDER BY &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;users&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; LIMIT &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/04 09:55:45 /home/ubuntu/go/src/c10k-go/cmd/server/server.go:81 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;929.940ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; SELECT * FROM &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; WHERE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;code&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sticker&amp;#34;&lt;/span&gt; AND &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; IS NULL ORDER BY &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; LIMIT &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;原因&#34;&gt;原因&lt;/h4&gt;
&lt;p&gt;查询的时候，没有索引，慢sql&lt;/p&gt;
&lt;h4 id=&#34;解决&#34;&gt;解决&lt;/h4&gt;
&lt;p&gt;索引： 加索引可以解决部分问题&lt;/p&gt;
&lt;p&gt;in-memory: 如果我们使用sqlite的in-memory 模式，这样避免从磁盘读取，速度更快&lt;/p&gt;
&lt;p&gt;预热: 预先放到缓存，读缓存的数据，从一个树的查找 O(log n), 放缓存的话，时间复杂度是 O(1)&lt;/p&gt;
&lt;p&gt;三种方案，应该有一个数量级的差异，晚些看下数据对比&lt;/p&gt;
&lt;h3 id=&#34;2-锁表导致的&#34;&gt;2 锁表导致的&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/04 09:55:45 /home/ubuntu/go/src/c10k-go/cmd/server/db.go:59 database is locked &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0.061ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; UPDATE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; SET &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-04 09:40:45.165&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-0 09:55:45.644&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;NULL,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;code&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sticker&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;price&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;100,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;quantity&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;99971357&lt;/span&gt; WHERE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; IS NULL AND &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;原因-为啥锁表报错&#34;&gt;原因-为啥锁表报错&lt;/h4&gt;
&lt;p&gt;业务场景：这里其实是扣减库存，扣减的是商品的库存，来更新的库存表，update的时候，更新库存-1&lt;/p&gt;
&lt;p&gt;报错：这里有锁表导致的事务失败，怎么解决？&lt;/p&gt;
&lt;p&gt;| &lt;a href=&#34;https://stackoverflow.com/questions/3172929/operationalerror-database-is-locked&#34;&gt;operationalerror-database-is-locked&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;搜索推荐是切换DB，更换掉sqlite，是一种解决方案，&lt;/p&gt;
&lt;h4 id=&#34;锁表报错解决&#34;&gt;锁表报错解决&lt;/h4&gt;
&lt;p&gt;业务：先看库存这个业务，他其实是一个有限的资源，一般来讲，是没办法超卖的，比如说你有100件手机，你不能卖出去101件，第101件你是发不出货的，卖出去后，就是超卖了，发不出货就会有投诉，退款等麻烦的事情。&lt;/p&gt;
&lt;p&gt;实物和虚拟的区别：不过我们这里测试的时候，库存其实是无限的，不太担心超卖的，数量极大，这就是卖虚拟的东西和实物的区别，虚拟的可以随便卖，履约成本无限低，不像实物，所以虚拟商品，一般来讲，库存超卖相对还好&lt;/p&gt;
&lt;p&gt;事务: 首先锁表商品表，减库存，创建订单，创单成功后，提交事务。 如果床单失败，则回滚事务，加上库存。&lt;/p&gt;
&lt;p&gt;系统：可以看到这里的压力有两点，一个是减库存，对商品表的压力，一个是创建订单，对订单表的压力。&lt;/p&gt;
&lt;p&gt;锁资源：我们知道一条record 更新的时候，一般是record 锁和索引锁，新增的时候，会有db的table 级别的锁.&lt;/p&gt;
&lt;p&gt;| 锁级别 &lt;a href=&#34;https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html&#34;&gt;innodb-locks-set&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;减库存流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果商品和库存在一个表里面的话，库存频繁更新的话，那么商品读取也会受到影响，解法是拆分表，相当于垂直拆分，缓解压力&lt;/li&gt;
&lt;li&gt;另外对于单个热点商品来讲，减库存的流程，其实相当于秒杀场景，大量的流量流入单个商品，单个库存，这里其实有数据库热点的，有热点就好办，最直观的解法，肯定是把热点与非热点拆分开来，特殊对待，为啥特殊对待？ 毕竟资源是有限的呀&lt;/li&gt;
&lt;li&gt;解法: 我们现在压测，而且是单个产品，相当于一个秒杀场景，所以把库存单独拿出来，放到redis缓存，利用redis的Decr 来减库存。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;订单创建流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里的压力主要是表锁，新增记录。&lt;/li&gt;
&lt;li&gt;解法很简单，水平扩容即可，分库分表来缓解新增的压力，暂时不加，看下效果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;限流：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;限流是为了保护集群，比如一个餐厅，最多提供100人同时就餐，如果来了1000人，餐厅会挤得水泄不通，资源可能会到非就餐人员身上，正常就餐受到影响，反而提供不了100人同时就餐服务了。&lt;/li&gt;
&lt;li&gt;我们压测，可以动态控制流量，所以暂时不加限流&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;解决1-读加缓存&#34;&gt;解决1-读加缓存&lt;/h4&gt;
&lt;p&gt;读的地方，都加到缓存里面&lt;/p&gt;
&lt;p&gt;load&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16869&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2570232&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;63384&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9648&lt;/span&gt; S 57.3 3.1 1:31.96 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16941&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1600468&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;22360&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9172&lt;/span&gt; S 23.7 1.1 0:37.09 main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并发表现：TPS 700 左右，latency最长13s，平均0.1 s，可接受的范围&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;235s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;173411&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;740.00&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;135.14&lt;/td&gt;
&lt;td&gt;3,790,647&lt;/td&gt;
&lt;td&gt;16,130&lt;/td&gt;
&lt;td&gt;200:173411&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;236s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;174178&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;740.61&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;135.02&lt;/td&gt;
&lt;td&gt;3,807,690&lt;/td&gt;
&lt;td&gt;16,134&lt;/td&gt;
&lt;td&gt;200:174178&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;237s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;174925&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;740.56&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;135.03&lt;/td&gt;
&lt;td&gt;3,823,497&lt;/td&gt;
&lt;td&gt;16,132&lt;/td&gt;
&lt;td&gt;200:174925&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;238s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;175642&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;740.56&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;135.03&lt;/td&gt;
&lt;td&gt;3,838,482&lt;/td&gt;
&lt;td&gt;16,128&lt;/td&gt;
&lt;td&gt;200:175642&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;239s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;176435&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;740.85&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;134.98&lt;/td&gt;
&lt;td&gt;3,855,447&lt;/td&gt;
&lt;td&gt;16,131&lt;/td&gt;
&lt;td&gt;200:176435&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;240s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;177571&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;741.99&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;134.77&lt;/td&gt;
&lt;td&gt;3,882,983&lt;/td&gt;
&lt;td&gt;16,178&lt;/td&gt;
&lt;td&gt;200:177571&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;241s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;178609&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;743.09&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;134.57&lt;/td&gt;
&lt;td&gt;3,907,901&lt;/td&gt;
&lt;td&gt;16,215&lt;/td&gt;
&lt;td&gt;200:178609&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;242s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;179479&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;744.23&lt;/td&gt;
&lt;td&gt;13486.30&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;134.37&lt;/td&gt;
&lt;td&gt;3,927,131&lt;/td&gt;
&lt;td&gt;16,227&lt;/td&gt;
&lt;td&gt;200:179479&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;慢SQL 相关报错日志&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 12:44:55 /root/go/src/c10k-go/cmd/server/db.go:59 database is locked &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0.047ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; UPDATE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; SET &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 12:11:54.183&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 12:44:55.893&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;NULL,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;code&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sticker&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;price&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;100,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;quantity&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;99989897&lt;/span&gt; WHERE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; IS NULL AND &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 12:44:55 /root/go/src/c10k-go/cmd/server/db.go:49 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;329.423ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; SELECT * FROM &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; WHERE &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; IS NULL AND &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ORDER BY &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;products&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; LIMIT &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个是product 锁表导致的，一个是下单报错，可以看到，压力全在product库，原因就是库存在这里&lt;/p&gt;
&lt;p&gt;怎么办？ 继续拆，把库存拆出去，但需要考虑一致性。 把减库存的压力放到redis，这样的话，product没压力了，事务就是减redis成功后，再增加order即可&lt;/p&gt;
&lt;h4 id=&#34;解决2-库存拆分&#34;&gt;解决2-库存拆分&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;18969&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2570512&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;34096&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11160&lt;/span&gt; S 28.3 1.7 1:00.64 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;19344&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1305540&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;17000&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9080&lt;/span&gt; S 13.3 0.8 0:12.72 main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TPS表现：结果更慢了，TPS 400+， why？&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;105s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;44999&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;431.17&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;115.96&lt;/td&gt;
&lt;td&gt;585,291&lt;/td&gt;
&lt;td&gt;5,574&lt;/td&gt;
&lt;td&gt;200:44999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45339&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;430.80&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;116.06&lt;/td&gt;
&lt;td&gt;589,711&lt;/td&gt;
&lt;td&gt;5,563&lt;/td&gt;
&lt;td&gt;200:45339&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;107s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45680&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;430.20&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;116.23&lt;/td&gt;
&lt;td&gt;594,144&lt;/td&gt;
&lt;td&gt;5,552&lt;/td&gt;
&lt;td&gt;200:45680&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;108s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45840&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;429.09&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;116.53&lt;/td&gt;
&lt;td&gt;596,224&lt;/td&gt;
&lt;td&gt;5,520&lt;/td&gt;
&lt;td&gt;200:45840&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;109s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;46161&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;427.25&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;117.03&lt;/td&gt;
&lt;td&gt;600,397&lt;/td&gt;
&lt;td&gt;5,508&lt;/td&gt;
&lt;td&gt;200:46161&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;110s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;46461&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;426.08&lt;/td&gt;
&lt;td&gt;5017.35&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;117.35&lt;/td&gt;
&lt;td&gt;604,313&lt;/td&gt;
&lt;td&gt;5,493&lt;/td&gt;
&lt;td&gt;200:46461&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;慢sql，现在压力全部在order库了，新增的时候，锁表导致的order 大于200ms, 本来均摊到两个表的压力，现在全部到一个表了，结果更慢了，当然也可能是order表数据变大了，先不细究&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:06:05 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2029.641ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 13:06:03.588&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 13:06:03.588&amp;#34;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; RETURNING &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:06:05 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;429.022ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 13:06:05.324&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2022-08-06 13:06:05.324&amp;#34;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; RETURNING &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;解决3-订单单表新增&#34;&gt;解决3-订单单表新增&lt;/h4&gt;
&lt;p&gt;就剩下一个问题了，怎么提高单表的事务插入速度？&lt;/p&gt;
&lt;p&gt;sqlite 切换成inmemory 试下看看，结果不贴了，反正是不行，可能是当时的机器不行 :(&lt;/p&gt;
&lt;p&gt;| &lt;a href=&#34;https://www.sqlite.org/inmemorydb.html&#34;&gt;inmemory&lt;/a&gt;&lt;/p&gt;
&lt;h5 id=&#34;切换成mysql&#34;&gt;切换成mysql&lt;/h5&gt;
&lt;p&gt;load ，两核的小鸡，不堪重负，mysql 就吃完了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;22971&lt;/span&gt; lxd &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1856120&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;511704&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30824&lt;/span&gt; S 69.4 25.3 5:59.03 mysqld 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;27494&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1453036&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18376&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9892&lt;/span&gt; S 47.2 0.9 0:54.78 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;22928&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1517876&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8208&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2476&lt;/span&gt; S 34.6 0.4 1:23.44 docker-proxy 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;27559&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1379016&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18584&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9304&lt;/span&gt; S 29.9 0.9 0:33.23 main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TPS表现：效果是显著的，并发数 1200+了&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;91s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;109297&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1203.37&lt;/td&gt;
&lt;td&gt;456.32&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;41.55&lt;/td&gt;
&lt;td&gt;1,420,861&lt;/td&gt;
&lt;td&gt;15,613&lt;/td&gt;
&lt;td&gt;200:109297&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;110507&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1203.60&lt;/td&gt;
&lt;td&gt;456.32&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;41.54&lt;/td&gt;
&lt;td&gt;1,436,591&lt;/td&gt;
&lt;td&gt;15,615&lt;/td&gt;
&lt;td&gt;200:110507&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;93s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;111691&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1203.39&lt;/td&gt;
&lt;td&gt;456.32&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;41.55&lt;/td&gt;
&lt;td&gt;1,451,983&lt;/td&gt;
&lt;td&gt;15,612&lt;/td&gt;
&lt;td&gt;200:111691&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;94s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;112890&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1203.36&lt;/td&gt;
&lt;td&gt;456.32&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;41.55&lt;/td&gt;
&lt;td&gt;1,467,570&lt;/td&gt;
&lt;td&gt;15,612&lt;/td&gt;
&lt;td&gt;200:112890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95s&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;114023&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1202.61&lt;/td&gt;
&lt;td&gt;456.32&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;41.58&lt;/td&gt;
&lt;td&gt;1,482,299&lt;/td&gt;
&lt;td&gt;15,603&lt;/td&gt;
&lt;td&gt;200:114023&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;慢sql&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:50:02 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;205.602ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:02.278&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:02.278&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:50:25 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;238.287ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:25.573&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:25.573&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:50:25 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;200.938ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:25.699&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:25.699&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/06 13:50:48 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;244.081ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:48.284&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-06 13:50:48.284&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;慢sql怎么解决？&lt;/p&gt;
&lt;p&gt;走批量插入，还是继续分片？ 要求是2k可以不？&lt;/p&gt;
&lt;p&gt;还是先加机器吧，继续加cpu，看下瓶颈在哪里，换成8核16G再来战&lt;/p&gt;
&lt;p&gt;加完机器 tps 650+？？？ what happend?&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;47s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;31555&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;676.78&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;147.76&lt;/td&gt;
&lt;td&gt;410,215&lt;/td&gt;
&lt;td&gt;8,727&lt;/td&gt;
&lt;td&gt;200:31555&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;32018&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;671.71&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;148.87&lt;/td&gt;
&lt;td&gt;416,234&lt;/td&gt;
&lt;td&gt;8,671&lt;/td&gt;
&lt;td&gt;200:32018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;49s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;32476&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;667.29&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;149.86&lt;/td&gt;
&lt;td&gt;422,188&lt;/td&gt;
&lt;td&gt;8,615&lt;/td&gt;
&lt;td&gt;200:32476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;33035&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;664.77&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;150.43&lt;/td&gt;
&lt;td&gt;429,455&lt;/td&gt;
&lt;td&gt;8,586&lt;/td&gt;
&lt;td&gt;200:33035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;33613&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;663.74&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;150.66&lt;/td&gt;
&lt;td&gt;436,969&lt;/td&gt;
&lt;td&gt;8,567&lt;/td&gt;
&lt;td&gt;200:33613&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;34161&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;661.17&lt;/td&gt;
&lt;td&gt;872.18&lt;/td&gt;
&lt;td&gt;22.54&lt;/td&gt;
&lt;td&gt;151.25&lt;/td&gt;
&lt;td&gt;444,093&lt;/td&gt;
&lt;td&gt;8,540&lt;/td&gt;
&lt;td&gt;200:34161&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;解决4-db最大连接数&#34;&gt;解决4-db最大连接数&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:17:20 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;268.386ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:17:20.273&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:17:20.273&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:17:20 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;276.732ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:17:20.265&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:17:20.265&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mysql&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 2022/08/07 12:18:19 packets.go:37: unexpected EOF &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mysql&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 2022/08/07 12:18:19 packets.go:37: unexpected EOF &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mysql&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 2022/08/07 12:18:19 packets.go:37: unexpected EOF &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mysql&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 2022/08/07 12:18:19 packets.go:37: unexpected EOF &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mysql&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 2022/08/07 12:18:19 packets.go:37: unexpected EOF
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一看就是最大链接数问题，看下gorm的最大连接数&lt;/p&gt;
&lt;p&gt;| &lt;a href=&#34;https://stackoverflow.com/questions/39980902/golang-mysql-error-packets-go33-unexpected-eof&#34;&gt;Golang MySQL error - packets.go:33: unexpected EOF&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sqlDB&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gormDB&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DB&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sqlDB&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SetMaxIdleConns&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sqlDB&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SetMaxOpenConns&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;解决5-docker-proxy-load-高&#34;&gt;解决5-docker-proxy load 高&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2046&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5730236&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;13968&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2832&lt;/span&gt; S 467.7 0.1 10:17.72 docker-proxy 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2088&lt;/span&gt; lxd &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5014264&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;499052&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;33452&lt;/span&gt; R 128.0 3.0 9:57.75 mysqld 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2706&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1526768&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;22588&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10020&lt;/span&gt; S 52.0 0.1 3:07.06 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20389&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1748444&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;21524&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9208&lt;/span&gt; S 33.7 0.1 0:40.35 main 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;778&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;57832&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9152&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6724&lt;/span&gt; S 5.7 0.1 0:19.09 redis-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;mysql 使用的是docker，看到网络肯定是挂了
mysql的load 基本在2左右
server 0.6
压测client 0.4
redis 0.05 左右&lt;/p&gt;
&lt;p&gt;解决：不使用docker了，直接裸机mysql，docker-proxy 就不会是问题了&lt;/p&gt;
&lt;p&gt;TPS 恢复 1000+&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;61s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;61452&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1019.02&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;98.13&lt;/td&gt;
&lt;td&gt;798,876&lt;/td&gt;
&lt;td&gt;13,096&lt;/td&gt;
&lt;td&gt;200:61452&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;62260&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1015.74&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;98.45&lt;/td&gt;
&lt;td&gt;809,380&lt;/td&gt;
&lt;td&gt;13,054&lt;/td&gt;
&lt;td&gt;200:62260&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;63s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63122&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1014.10&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;98.61&lt;/td&gt;
&lt;td&gt;820,586&lt;/td&gt;
&lt;td&gt;13,025&lt;/td&gt;
&lt;td&gt;200:63122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63996&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1011.60&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;98.85&lt;/td&gt;
&lt;td&gt;831,948&lt;/td&gt;
&lt;td&gt;12,998&lt;/td&gt;
&lt;td&gt;200:63996&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;64749&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1007.47&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.26&lt;/td&gt;
&lt;td&gt;841,737&lt;/td&gt;
&lt;td&gt;12,949&lt;/td&gt;
&lt;td&gt;200:64749&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;65603&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1004.88&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.51&lt;/td&gt;
&lt;td&gt;852,839&lt;/td&gt;
&lt;td&gt;12,921&lt;/td&gt;
&lt;td&gt;200:65603&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;66556&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1005.23&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.48&lt;/td&gt;
&lt;td&gt;865,228&lt;/td&gt;
&lt;td&gt;12,913&lt;/td&gt;
&lt;td&gt;200:66556&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;67401&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1003.13&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.69&lt;/td&gt;
&lt;td&gt;876,213&lt;/td&gt;
&lt;td&gt;12,885&lt;/td&gt;
&lt;td&gt;200:67401&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;69s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;68347&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1002.32&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.77&lt;/td&gt;
&lt;td&gt;888,511&lt;/td&gt;
&lt;td&gt;12,876&lt;/td&gt;
&lt;td&gt;200:68347&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;69240&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1001.25&lt;/td&gt;
&lt;td&gt;612.01&lt;/td&gt;
&lt;td&gt;18.68&lt;/td&gt;
&lt;td&gt;99.88&lt;/td&gt;
&lt;td&gt;900,120&lt;/td&gt;
&lt;td&gt;12,858&lt;/td&gt;
&lt;td&gt;200:69240&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;去掉docker db后，再看下load，恢复正常了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;45178&lt;/span&gt; mysql &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5046820&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;500292&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;37164&lt;/span&gt; S 240.2 3.1 7:22.01 mysqld 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;45625&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1600500&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;23016&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9852&lt;/span&gt; S 122.3 0.1 2:25.70 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;45779&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1822432&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;22776&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9268&lt;/span&gt; S 81.4 0.1 1:04.24 main 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;778&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;57832&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9212&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6724&lt;/span&gt; S 11.0 0.1 0:31.49 redis-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;| redis 真是厉害啊，才0.1，最占资源的还是DB，所以DB需要分拆出来，有专业的DBA团队来维护是一个必然的事情
mysql 2.5
server 1.2
client 0.8
redis 0.1&lt;/p&gt;
&lt;p&gt;磁盘io&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vda 352.00 0.00 4.38 0.00 &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;慢sql: 现在基本都是订单插入的慢sql了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:45:51 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;282.300ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:51.009&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:51.009&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:45:51 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;300.287ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.991&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.991&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:45:51 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;299.624ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.992&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.992&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:45:51 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;291.614ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:51&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:51&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 12:45:51 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;299.556ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.992&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 12:45:50.992&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;解决6-换db加配置&#34;&gt;解决6-换DB，加配置&lt;/h4&gt;
&lt;p&gt;到此没办法解决了，只能提高配置了，看下mysql 最大能力了, 换postgres or 换其他的mysql&lt;/p&gt;
&lt;p&gt;尝试了第三方解决方案，估计给的实例资源比较差，pg digitalOcean自带的，配置低的话，不行, digitalOcean 自带的mysql 900+一样，2c4G， 还不如自建的mysql&lt;/p&gt;
&lt;p&gt;digitalOcean pg的TPS&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;298&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1044.82&lt;/td&gt;
&lt;td&gt;934.47&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;95.71&lt;/td&gt;
&lt;td&gt;3,874&lt;/td&gt;
&lt;td&gt;3,856&lt;/td&gt;
&lt;td&gt;200:298&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;955&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1013.23&lt;/td&gt;
&lt;td&gt;1979.03&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;98.69&lt;/td&gt;
&lt;td&gt;12,415&lt;/td&gt;
&lt;td&gt;6,206&lt;/td&gt;
&lt;td&gt;200:955&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3s&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;1523&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;817.50&lt;/td&gt;
&lt;td&gt;2939.58&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;122.32&lt;/td&gt;
&lt;td&gt;19,799&lt;/td&gt;
&lt;td&gt;6,597&lt;/td&gt;
&lt;td&gt;200:1523&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;677.12&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;147.69&lt;/td&gt;
&lt;td&gt;25,922&lt;/td&gt;
&lt;td&gt;6,480&lt;/td&gt;
&lt;td&gt;200:1994&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2566&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;646.20&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;154.75&lt;/td&gt;
&lt;td&gt;33,358&lt;/td&gt;
&lt;td&gt;6,671&lt;/td&gt;
&lt;td&gt;200:2566&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3197&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;648.93&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;154.10&lt;/td&gt;
&lt;td&gt;41,561&lt;/td&gt;
&lt;td&gt;6,924&lt;/td&gt;
&lt;td&gt;200:3197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3837&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;652.61&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;153.23&lt;/td&gt;
&lt;td&gt;49,881&lt;/td&gt;
&lt;td&gt;7,125&lt;/td&gt;
&lt;td&gt;200:3837&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4442&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;647.12&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;154.53&lt;/td&gt;
&lt;td&gt;57,746&lt;/td&gt;
&lt;td&gt;7,213&lt;/td&gt;
&lt;td&gt;200:4442&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5132&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;649.41&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;153.98&lt;/td&gt;
&lt;td&gt;66,716&lt;/td&gt;
&lt;td&gt;7,412&lt;/td&gt;
&lt;td&gt;200:5132&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;5794&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;647.98&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;154.33&lt;/td&gt;
&lt;td&gt;75,322&lt;/td&gt;
&lt;td&gt;7,530&lt;/td&gt;
&lt;td&gt;200:5794&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;6444&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;651.26&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;153.55&lt;/td&gt;
&lt;td&gt;83,772&lt;/td&gt;
&lt;td&gt;7,614&lt;/td&gt;
&lt;td&gt;200:6444&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;7064&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;646.37&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.91&lt;/td&gt;
&lt;td&gt;154.71&lt;/td&gt;
&lt;td&gt;91,832&lt;/td&gt;
&lt;td&gt;7,651&lt;/td&gt;
&lt;td&gt;200:7064&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;7712&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;642.93&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.83&lt;/td&gt;
&lt;td&gt;155.54&lt;/td&gt;
&lt;td&gt;100,256&lt;/td&gt;
&lt;td&gt;7,711&lt;/td&gt;
&lt;td&gt;200:7712&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;8371&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;645.52&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.83&lt;/td&gt;
&lt;td&gt;154.91&lt;/td&gt;
&lt;td&gt;108,823&lt;/td&gt;
&lt;td&gt;7,772&lt;/td&gt;
&lt;td&gt;200:8371&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;9010&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;645.66&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.83&lt;/td&gt;
&lt;td&gt;154.88&lt;/td&gt;
&lt;td&gt;117,130&lt;/td&gt;
&lt;td&gt;7,808&lt;/td&gt;
&lt;td&gt;200:9010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;9658&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;644.54&lt;/td&gt;
&lt;td&gt;3060.34&lt;/td&gt;
&lt;td&gt;3.83&lt;/td&gt;
&lt;td&gt;155.15&lt;/td&gt;
&lt;td&gt;125,554&lt;/td&gt;
&lt;td&gt;7,846&lt;/td&gt;
&lt;td&gt;200:9658&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;digitalOcean mysql server 5 的TPS&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;159s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;134747&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;855.20&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;116.93&lt;/td&gt;
&lt;td&gt;1,751,711&lt;/td&gt;
&lt;td&gt;11,016&lt;/td&gt;
&lt;td&gt;200:134747&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;160s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;135554&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;853.64&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.14&lt;/td&gt;
&lt;td&gt;1,762,202&lt;/td&gt;
&lt;td&gt;11,013&lt;/td&gt;
&lt;td&gt;200:135558&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;161s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;136682&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;855.51&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;116.89&lt;/td&gt;
&lt;td&gt;1,776,866&lt;/td&gt;
&lt;td&gt;11,036&lt;/td&gt;
&lt;td&gt;200:136682&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;162s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;137457&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;855.16&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;116.94&lt;/td&gt;
&lt;td&gt;1,786,941&lt;/td&gt;
&lt;td&gt;11,030&lt;/td&gt;
&lt;td&gt;200:137457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;163s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;138103&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;854.17&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.07&lt;/td&gt;
&lt;td&gt;1,795,339&lt;/td&gt;
&lt;td&gt;11,014&lt;/td&gt;
&lt;td&gt;200:138103&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;164s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;138830&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;853.16&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.21&lt;/td&gt;
&lt;td&gt;1,804,790&lt;/td&gt;
&lt;td&gt;11,003&lt;/td&gt;
&lt;td&gt;200:138838&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;165s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;139687&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;853.15&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.21&lt;/td&gt;
&lt;td&gt;1,815,931&lt;/td&gt;
&lt;td&gt;11,005&lt;/td&gt;
&lt;td&gt;200:139687&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;166s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;140265&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;851.49&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.44&lt;/td&gt;
&lt;td&gt;1,823,445&lt;/td&gt;
&lt;td&gt;10,984&lt;/td&gt;
&lt;td&gt;200:140265&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;167s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;140952&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;850.71&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.55&lt;/td&gt;
&lt;td&gt;1,832,376&lt;/td&gt;
&lt;td&gt;10,972&lt;/td&gt;
&lt;td&gt;200:140952&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;168s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;141609&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;849.58&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.71&lt;/td&gt;
&lt;td&gt;1,840,917&lt;/td&gt;
&lt;td&gt;10,957&lt;/td&gt;
&lt;td&gt;200:141609&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;169s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;142296&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;848.47&lt;/td&gt;
&lt;td&gt;3156.15&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;117.86&lt;/td&gt;
&lt;td&gt;1,849,848&lt;/td&gt;
&lt;td&gt;10,945&lt;/td&gt;
&lt;td&gt;200:142296&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第三方DB的应用LOAD&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;73601&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5142000&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;23352&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11496&lt;/span&gt; R 527.8 0.1 8:34.38 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;73893&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1896164&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24076&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9380&lt;/span&gt; S 77.8 0.1 2:53.16 main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三方DB的慢sql&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 15:03:40 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;253.865ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:03:40.232&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:03:40.232&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 15:04:25 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;248.147ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:04:24.973&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:04:24.973&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2022/08/07 15:04:44 /root/go/src/c10k-go/cmd/server/db.go:60 SLOW SQL &amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 200ms &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;258.707ms&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rows:1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; INSERT INTO &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;orders&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;created_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;updated_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;deleted_at&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;product_id&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; VALUES &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:04:43.935&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2022-08-07 15:04:43.935&amp;#39;&lt;/span&gt;,NULL,1,1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pgsql 换成本地&lt;/p&gt;
&lt;p&gt;load&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;127490&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1897792&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;31676&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12208&lt;/span&gt; R 244.4 0.2 2:58.06 server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;127754&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1601236&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;22120&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9156&lt;/span&gt; S 53.0 0.1 0:37.00 main 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;73264&lt;/span&gt; postgres &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;218692&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30360&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27604&lt;/span&gt; R 32.8 0.2 1:09.48 postgres 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;778&lt;/span&gt; root &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;57832&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9232&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6724&lt;/span&gt; S 6.3 0.1 1:35.19 redis-server 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;73270&lt;/span&gt; postgres &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;73424&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7256&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4368&lt;/span&gt; R 2.6 0.0 0:05.10 postgres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TPS 1100+&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;th&gt;并发数&lt;/th&gt;
&lt;th&gt;成功数&lt;/th&gt;
&lt;th&gt;失败数&lt;/th&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;最长耗时&lt;/th&gt;
&lt;th&gt;最短耗时&lt;/th&gt;
&lt;th&gt;平均耗时&lt;/th&gt;
&lt;th&gt;下载字节&lt;/th&gt;
&lt;th&gt;字节每秒&lt;/th&gt;
&lt;th&gt;状态码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;97s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;111084&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1150.23&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.94&lt;/td&gt;
&lt;td&gt;1,446,540&lt;/td&gt;
&lt;td&gt;14,912&lt;/td&gt;
&lt;td&gt;200:111084&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;112243&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1150.17&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.94&lt;/td&gt;
&lt;td&gt;1,461,607&lt;/td&gt;
&lt;td&gt;14,914&lt;/td&gt;
&lt;td&gt;200:112243&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;113367&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1150.38&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.93&lt;/td&gt;
&lt;td&gt;1,476,219&lt;/td&gt;
&lt;td&gt;14,911&lt;/td&gt;
&lt;td&gt;200:113369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;114549&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1150.57&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.91&lt;/td&gt;
&lt;td&gt;1,491,585&lt;/td&gt;
&lt;td&gt;14,915&lt;/td&gt;
&lt;td&gt;200:114549&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;115704&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1151.13&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.87&lt;/td&gt;
&lt;td&gt;1,506,600&lt;/td&gt;
&lt;td&gt;14,916&lt;/td&gt;
&lt;td&gt;200:115704&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;117044&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1152.56&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.76&lt;/td&gt;
&lt;td&gt;1,524,020&lt;/td&gt;
&lt;td&gt;14,941&lt;/td&gt;
&lt;td&gt;200:117044&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;118235&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1152.99&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.73&lt;/td&gt;
&lt;td&gt;1,539,503&lt;/td&gt;
&lt;td&gt;14,946&lt;/td&gt;
&lt;td&gt;200:118235&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;119582&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1154.97&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.58&lt;/td&gt;
&lt;td&gt;1,557,014&lt;/td&gt;
&lt;td&gt;14,971&lt;/td&gt;
&lt;td&gt;200:119582&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;120818&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1155.32&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.56&lt;/td&gt;
&lt;td&gt;1,573,082&lt;/td&gt;
&lt;td&gt;14,981&lt;/td&gt;
&lt;td&gt;200:120818&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;122110&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1156.76&lt;/td&gt;
&lt;td&gt;524.39&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;86.45&lt;/td&gt;
&lt;td&gt;1,589,878&lt;/td&gt;
&lt;td&gt;14,998&lt;/td&gt;
&lt;td&gt;200:122110&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日志 sql 报错，没有慢sql，但事务失败的很多，原因未知,日志没有打印出来DB的，没有继续查&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create order failed: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;结论&#34;&gt;结论&lt;/h2&gt;
&lt;p&gt;1 读的地方加缓存，注意缓存失效&lt;/p&gt;
&lt;p&gt;2 如果是秒杀场景，库存可以使用Redis扣减，基本不占资源&lt;/p&gt;
&lt;p&gt;3 订单表的事务插入，尽量异步，不能异步的，加资源，使用Mysql或者Postgres 都可以&lt;/p&gt;
&lt;p&gt;在8c16g的资源下，单机做到1100+的TPS，还可以吧，下次继续 :)&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>go解决c10k problem(一)</title>
      <link>https://zhaowang.me/archives/go-c10k-problem-1/</link>
      <pubDate>Mon, 01 Aug 2022 09:40:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/go-c10k-problem-1/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;零缘起&#34;&gt;零：缘起&lt;/h1&gt;
&lt;p&gt;最近两个事情&lt;/p&gt;
&lt;p&gt;一个是easeprobe，haocl 对其http probe 做了一个10k的benchmark &lt;a href=&#34;https://github.com/megaease/easeprobe/blob/main/docs/Benchmark.md#benchmark&#34;&gt;easeprobe benchmark&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个是读到go memory这篇文章 &lt;a href=&#34;https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/&#34;&gt;go-memory-ballast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;谈到技术，并发是一个绕不过的话题，从第一家公司单机2万qps，到一个50w+ tps的超大型分布式交易系统。&lt;/p&gt;
&lt;p&gt;那么自己能否来简单来测试一下呢？ 跑一个web server，来个10k 并发，再来个可观测，看下瓶颈到底在哪里？ 如何提升？ 说干就干。&lt;/p&gt;
&lt;h1 id=&#34;一go-http-server&#34;&gt;一：go http server&lt;/h1&gt;
&lt;p&gt;goroutine的存在，让go在网络编程这块很高效，也有很多优秀的http 框架，比如 &lt;code&gt;gin&lt;/code&gt; &lt;code&gt;echo&lt;/code&gt; &lt;code&gt;fasthttp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;fasthttp 比较快，我们先不读取db和其他，仅让cpu是一个瓶颈，仅写个hello world，收到请求后，返回一行文本。&lt;/p&gt;
&lt;p&gt;示例代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;github.com/valyala/fasthttp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// request handler in fasthttp style, i.e. just plain function.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fastHTTPHandler&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;fasthttp&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;RequestCtx&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fprintf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hi there! RequestURI is %q&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;RequestURI&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;fasthttp&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ListenAndServe&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:8087&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;fastHTTPHandler&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;二go-http-client-压测的client&#34;&gt;二：go http client 压测的client&lt;/h1&gt;
&lt;h2 id=&#34;21-压测client选择&#34;&gt;2.1 压测client选择&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;简单实现版本，使用time.Sleep 函数，来均匀分布所有的请求到一个server。&lt;/li&gt;
&lt;li&gt;复杂实现版本，来一个goroutine的pool，一个http connect的pool，分别控制最大连接数和最大goroutine数目，并且根据请求耗时，动态调整两个pool的大小，然后到一个稳定的状态。&lt;/li&gt;
&lt;li&gt;别人现有的，找到一个 go-strees-testing 的项目，可以先用起来&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;22-先选择现有的试试效果&#34;&gt;2.2 先选择现有的试试效果&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/link1st/go-stress-testing&#34;&gt;https://github.com/link1st/go-stress-testing&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go-stress-testing-linux -c &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; -n &lt;span style=&#34;color:#ae81ff&#34;&gt;100000&lt;/span&gt; -u http://127.0.0.1:8087
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里原生不支持多核cpu，所以多核的话，我们需要下载下来，修改main函数，把cpu的数量从
&lt;code&gt;runtime.GOMAXPROCS(1) 修改成runtime.GOMAXPROCS(runtime.NumCPU())&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&#34;三可观测&#34;&gt;三：可观测&lt;/h1&gt;
&lt;h2 id=&#34;31-观测内容&#34;&gt;3.1 观测内容&lt;/h2&gt;
&lt;p&gt;观测分为几点，一个是业务监控，一个是系统监控，像我们这种，没有业务逻辑，仅监控系统即可&lt;/p&gt;
&lt;p&gt;系统监控，又分为主机系统监控，应用系统监控、中间件、DB&lt;/p&gt;
&lt;p&gt;主机监控有cpu、内存、磁盘、网络的监控，我们这里磁盘其实可以忽略掉&lt;/p&gt;
&lt;p&gt;应用系统监控，go runtime监控，比如gc、堆栈&lt;/p&gt;
&lt;p&gt;DB和中间件，暂时没有，先不写&lt;/p&gt;
&lt;h2 id=&#34;32-观测方案&#34;&gt;3.2 观测方案&lt;/h2&gt;
&lt;p&gt;系统监控，使用shell、linux 命令行即可，手动监控&lt;/p&gt;
&lt;p&gt;应用监控，使用prometheus 的golang client 采集，grafana 展示&lt;/p&gt;
&lt;h1 id=&#34;四实战&#34;&gt;四：实战&lt;/h1&gt;
&lt;h2 id=&#34;41-mac-实践&#34;&gt;4.1 Mac 实践&lt;/h2&gt;
&lt;h3 id=&#34;问题&#34;&gt;问题&lt;/h3&gt;
&lt;p&gt;server和client 配置好后，开始监测，QPS也就700左右，死活上不去了，内存和cpu都还好，不高，网络链接也不多，但请求的延时就开始超过10s&lt;/p&gt;
&lt;h3 id=&#34;解决&#34;&gt;解决&lt;/h3&gt;
&lt;p&gt;尽早放弃了，不想折腾，使用linux&lt;/p&gt;
&lt;h3 id=&#34;42-linux-实践&#34;&gt;4.2 Linux 实践&lt;/h3&gt;
&lt;h3 id=&#34;问题1&#34;&gt;问题1&lt;/h3&gt;
&lt;p&gt;这次简单，直接在现有的小鸡上来跑，0.5G内存，1VCPU&lt;/p&gt;
&lt;h3 id=&#34;结果1&#34;&gt;结果1&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;Untitled.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Untitled1.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;解决1&#34;&gt;解决1&lt;/h3&gt;
&lt;p&gt;可以看到，linux 直接就3800 QPS了，这次是单机CPU满载了，client 64%，server 36%， 100%&lt;/p&gt;
&lt;p&gt;这种简单，加机器就可以解决的问题&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Untitled2.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Untitled3.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;解决2&#34;&gt;解决2&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*GOMAXPROCS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; go run server.go &amp;amp;*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;17606&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1438212&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;119252&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;5284&lt;/span&gt; R 303.7   0.4   5:51.98 client
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;17485&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1527320&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;15384&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;9156&lt;/span&gt; S 230.0   0.0   4:29.19 server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;30k的top-和并发数&#34;&gt;30k+的top 和并发数&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;18814&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1816328&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;53512&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;9532&lt;/span&gt; S 549.8   0.2   4:21.05 main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;17485&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1748772&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;16164&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;9348&lt;/span&gt; R 166.8   0.0  14:03.47 server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────┬────────┬────────
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;耗时│ 并发数│ 成功数│ 失败数│   qps  │最长耗时│最短耗时│平均耗时│下载字节│字节每秒│ 状态码 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────┼────────┼────────
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1s│    100│  22654│      0│27766.78│   45.56│    0.17│    3.60│1,245,970│1,245,938│200:22654
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2s│    100│  46299│      0│28457.67│   45.56│    0.15│    3.51│2,546,445│1,273,204│200:46299
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3s│    100│  70470│      0│28828.85│   45.56│    0.15│    3.47│3,875,850│1,291,943│200:70470
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4s│    100│  94893│      0│29192.73│   45.56│    0.14│    3.43│5,219,115│1,304,771│200:94893
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5s│    100│ 119602│      0│29516.55│   45.56│    0.14│    3.39│6,578,110│1,315,573│200:119602
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6s│    100│ 144138│      0│29669.31│   45.56│    0.14│    3.37│7,927,590│1,321,143│200:144138
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7s│    100│ 169391│      0│29952.31│   45.56│    0.14│    3.34│9,316,505│1,330,926│200:169391
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8s│    100│ 194896│      0│30215.56│   45.56│    0.14│    3.31│10,719,280│1,339,904│200:194896
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9s│    100│ 220623│      0│30489.03│   45.56│    0.14│    3.28│12,134,265│1,348,246│200:220623
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10s│    100│ 246594│      0│30690.36│   45.56│    0.14│    3.26│13,562,670│1,356,265│200:246594
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;11s│    100│ 272641│      0│30889.66│   45.56│    0.14│    3.24│14,995,255│1,363,135│200:272641
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;12s│    100│ 299071│      0│31084.94│   45.56│    0.14│    3.22│16,448,905│1,370,737│200:299071
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;13s│    100│ 325628│      0│31266.74│   45.56│    0.14│    3.20│17,909,540│1,377,654│200:325628
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;14s│    100│ 352274│      0│31436.50│   45.56│    0.14│    3.18│19,375,070│1,383,930│200:352311
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15s│    100│ 379019│      0│31602.18│   45.56│    0.14│    3.16│20,846,045│1,389,734│200:379019
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;16s│    100│ 405848│      0│31756.00│   45.56│    0.14│    3.15│22,321,640│1,395,101│200:405848
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;17s│    100│ 432456│      0│31883.06│   45.56│    0.14│    3.14│23,785,080│1,399,121│200:432456
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;18s│    100│ 459049│      0│32011.63│   45.56│    0.14│    3.12│25,247,695│1,402,645│200:459227
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;19s│    100│ 486589│      0│32163.75│   45.56│    0.14│    3.11│26,762,395│1,408,546│200:486589
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20s│    100│ 513977│      0│32314.27│   45.56│    0.14│    3.09│28,268,735│1,413,435│200:513978
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;21s│    100│ 540328│      0│32372.83│   45.56│    0.14│    3.09│29,718,040│1,415,142│200:540328
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;22s│    100│ 568158│      0│32517.04│   45.56│    0.14│    3.08│31,248,690│1,420,373│200:568163
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;23s│    100│ 595715│      0│32614.98│   45.56│    0.14│    3.07│32,764,325│1,424,534│200:595715
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;24s│    100│ 623436│      0│32732.62│   45.56│    0.14│    3.06│34,288,980│1,428,599│200:623731
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25s│    100│ 650742│      0│32858.38│   45.56│    0.14│    3.04│35,790,810│1,431,629│200:650745
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;26s│    100│ 678444│      0│32945.23│   45.56│    0.14│    3.04│37,314,420│1,435,163│200:678444
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;27s│    100│ 706591│      0│33066.18│   45.56│    0.14│    3.02│38,862,505│1,439,116│200:706591
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;28s│    100│ 734065│      0│33133.34│   45.56│    0.14│    3.02│40,373,575│1,441,912│200:734065
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;29s│    100│ 761927│      0│33222.32│   45.56│    0.14│    3.01│41,905,985│1,445,032│200:761934
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;40k的结果&#34;&gt;40k的结果&lt;/h4&gt;
&lt;p&gt;可以达到40k，耗时很短，server 很高&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;18814&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2236976&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;187344&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;9532&lt;/span&gt; R 548.5   0.6  25:16.16 main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;17485&lt;/span&gt; root      &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1748772&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;16324&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;9540&lt;/span&gt; S 172.1   0.0  20:36.26 server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────┬────────┬────────
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;耗时│ 并发数│ 成功数│ 失败数│   qps  │最长耗时│最短耗时│平均耗时│下载字节│字节每秒│ 状态码 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────┼────────┼────────
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;247s│    100│7563722│      0│40026.69│   48.31│    0.14│    2.50│416,004,710│1,684,229│200:7563722
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;248s│    100│7595709│      0│40034.48│   48.31│    0.14│    2.50│417,763,995│1,684,532│200:7595709
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;249s│    100│7628010│      0│40044.40│   48.31│    0.14│    2.50│419,540,550│1,684,901│200:7628010
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;250s│    100│7659374│      0│40049.95│   48.31│    0.14│    2.50│421,265,570│1,685,058│200:7659374
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;251s│    100│7691688│      0│40060.62│   48.31│    0.14│    2.50│423,042,840│1,685,429│200:7691688
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;252s│    100│7723556│      0│40067.88│   48.31│    0.14│    2.50│424,795,580│1,685,695│200:7723556
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;结语&#34;&gt;结语&lt;/h1&gt;
&lt;p&gt;可以看到，go 来解决一个C10k的问题，很简单，当然这个只是最简单的一个模拟，下一期，我们加上数据库，再来解决数据库下面的C10k的问题。&lt;/p&gt;
&lt;h1 id=&#34;参考&#34;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;%5Bhttps://en.wikipedia.org/wiki/C10k_problem%5D(https://en.wikipedia.org/wiki/C10k_problem)&#34;&gt;C10K&lt;/a&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>typeScript的一个坑</title>
      <link>https://zhaowang.me/archives/typescript_1/</link>
      <pubDate>Thu, 30 Jun 2022 21:00:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/typescript_1/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;缘起&#34;&gt;缘起&lt;/h1&gt;
&lt;p&gt;最近找了个兼职，写了一段node的typescript代码，虽然上次写node还是5年前，但因为使用的框架是midway，写的过程中，几乎没有碰到bug，很自然的感觉，就是spring的那一套，面向对象，依赖注入等，写web还是很方便的。&lt;/p&gt;
&lt;p&gt;不过也由于这几年天天看和写java代码，写的时候，很容易就按照面向对象写起来，一切都是class，class的方法等，所以这也是bug的由来。&lt;/p&gt;
&lt;h1 id=&#34;问题来龙去脉&#34;&gt;问题来龙去脉&lt;/h1&gt;
&lt;h1 id=&#34;业务bug简单描述&#34;&gt;业务bug简单描述&lt;/h1&gt;
&lt;p&gt;一个学校有n个老师，每个老师一门课程，期末的时候，老师会给学生打分，学生同时也是一个用户。&lt;/p&gt;
&lt;p&gt;问题：在打分的过程中，为了方便，对学生对象list转换成了map，然后每个老师都会对学生的分数进行统计，然后再把统计结果返回给学生，这样就会导致学生的分数被覆盖。发现学生的成绩到最后都是一个老师打的。&lt;/p&gt;
&lt;h2 id=&#34;复现代码&#34;&gt;复现代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user1&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user1&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;user1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;user2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1A&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1B&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teachers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;userMap&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;reduce&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;acc&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;acc&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;acc&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, {});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gradeTeacher&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Array&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;teachers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;students&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Array&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teacherName&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;entries&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;userMap&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(([&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;]) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;userMap&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;teacherName&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;students&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;students&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gradeTeacher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gradeTeacher&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;teacher&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;理论期望的结果&#34;&gt;理论期望的结果&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1A&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1B&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;实际结果&#34;&gt;实际结果&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1A&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Teacher&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1B&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Students&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Age&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;why&#34;&gt;why?&lt;/h2&gt;
&lt;p&gt;可以看到，user 被循环了两次，而且每次都是user1，user2，这样就导致了学生的分数被覆盖。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;userMap&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也就是这段代码，执行之后，student 实际变成了一个 User对象，不再是一个Student对象，同时，对student的Grade赋值的时候，ts也没有报错，类型检查的时候，认为他是Student类型，但执行的时候，认为他是User类型，同时又由于js，没有类型约束，可以赋值，所以，这里的问题就出现了。&lt;/p&gt;
&lt;h2 id=&#34;解决方案&#34;&gt;解决方案&lt;/h2&gt;
&lt;p&gt;知道了原因就好了，我们让student获得一个深拷贝的user即可，而不是引用，这样再赋值Grade的时候，就不会出现问题。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;assign&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;userMap&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;student&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Grade&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;后记&#34;&gt;后记&lt;/h1&gt;
&lt;p&gt;JavaScript写业务，非强类型语言，还是要注意类型的约束，不然会出现一些问题。所以，在写业务的时候，Java和Go还是更加安全一些。&lt;/p&gt;
&lt;p&gt;同时typeScript也是一个静态类型语言，可以更加的更加安全一些。但IDE的提示，还有程序员自己的熟练程度也是影响代码质量的一个很重要的因素，如果typeScript编译没有检查出来，则实际执行的过程中，也会出现问题。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>go面试算法系列记录</title>
      <link>https://zhaowang.me/archives/algorithm-interview-go/</link>
      <pubDate>Sat, 25 Jun 2022 19:55:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/algorithm-interview-go/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;面试&#34;&gt;面试&lt;/h1&gt;
&lt;p&gt;最近从阿里离职，开始准备面试，刷了一个月左右的leetcode,然后实践出真知，去面试了几家公司。&lt;/p&gt;
&lt;h2 id=&#34;shopee-算法一面-螺旋矩阵反向螺旋矩阵&#34;&gt;shopee 算法一面 螺旋矩阵，反向螺旋矩阵&lt;/h2&gt;
&lt;h4 id=&#34;描述要求&#34;&gt;描述要求&lt;/h4&gt;
&lt;p&gt;给定一个n x n的，打印出一个螺旋矩阵，比如：&lt;/p&gt;
&lt;p&gt;输入n= 3,&lt;/p&gt;
&lt;p&gt;输出，则打印&lt;/p&gt;
&lt;p&gt;9 8 7
2 1 6
3 4 5&lt;/p&gt;
&lt;h4 id=&#34;思路和解决&#34;&gt;思路和解决&lt;/h4&gt;
&lt;p&gt;其实考察的是对数组的理解，还有矩阵的理解，就是找到矩阵的上下左右边界，遍历即可。反向的话，无非是从高到低遍历，正向的话，是从低到高遍历。&lt;/p&gt;
&lt;h4 id=&#34;代码&#34;&gt;代码&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;generateMatrix&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;printMatrix&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;printMatrix&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt; [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d &amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;generateMatrix&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 反向的话，number是最大值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt; = make([][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;] = make([]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;number00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right_bound&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lower_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;upper_bound&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;left_bound&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;matrix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;shopee-算法二面-手写lru&#34;&gt;shopee 算法二面 手写LRU&lt;/h2&gt;
&lt;h4 id=&#34;描述&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;LRU，即Least Recently Used，最近最少使用，是一种缓存算法，它的主要目的是为了防止缓存中的数据过期，过期后就不能再使用。&lt;/p&gt;
&lt;p&gt;实现LRU算法,O(1)的时间复杂度&lt;/p&gt;
&lt;h4 id=&#34;思路&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;LRU，数据结构组成，是双向链表+map，其中双向链表是用来记录LRU的，map是用来记录key和value的。&lt;/p&gt;
&lt;p&gt;问题一：为啥需要双向链表？&lt;/p&gt;
&lt;p&gt;因为需要记录LRU的顺序，所以需要双向链表，map是无序的。&lt;/p&gt;
&lt;p&gt;问题二：为啥需要map？&lt;/p&gt;
&lt;p&gt;双向链表，增删改查，查是O(n)的，但是map的查是O(1)的，所以需要map，这里用到了空间换时间。用一个map来存储所有的双向链表的节点，这样就可以O(1)的查找。查到双向链表的节点后，则删除和插入都是O(1)的。&lt;/p&gt;
&lt;p&gt;问题三：map 存储的是双向链表的节点，还是双向链表的节点的value？&lt;/p&gt;
&lt;p&gt;node 是key，value，prev，next 四个元素，map存储是key， value是 &amp;amp;node 指针。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//below generated by github copilot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;capacity&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;capacity&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;{},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;{},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;{},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;capacity&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;]; &lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;Put&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;]; &lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;capacity&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            delete(&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LRUCache&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Node&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prev&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;不知名公司1-算法一面&#34;&gt;不知名公司1 算法一面&lt;/h2&gt;
&lt;h4 id=&#34;描述-1&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;给了两个题目，二选一，一个是快速排序，一个是实现string的parseFloat&lt;/p&gt;
&lt;p&gt;可以使用ide&lt;/p&gt;
&lt;p&gt;我选了个parseFloat，因为当时快速排序的题目还没有刷到 :)，所以我选了parseFloat&lt;/p&gt;
&lt;h4 id=&#34;思路-1&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;首先，我们需要实现一个parseFloat函数，这个函数的功能是将一个string转换成float，如果转换失败，返回0.0。&lt;/p&gt;
&lt;p&gt;float 就是有小数的了，有可能还会丢失精度，所以我们需要实现一个精度的转换，这里我是把所有的先使用int存储，然后再统一转换成小数。&lt;/p&gt;
&lt;p&gt;同时考虑float的最大值，最小值问题。&lt;/p&gt;
&lt;p&gt;剩下的就是通用的十进制计算了，正负号了&lt;/p&gt;
&lt;p&gt;自己写的版本，比较简单，但是没有考虑最大值和最小值的问题，所以还是不能用了。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parseFloat&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;//negtive sign
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;neg&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;strconv&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ParseFloat&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;havePoint&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;//a number res
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;float64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;resNeg&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;float64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;negBase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;//for loop to get sign and number
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;havePoint&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;havePoint&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;neg&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; !&lt;span style=&#34;color:#a6e22e&#34;&gt;havePoint&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;havePoint&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;negBase&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;negBase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;resNeg&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;resNeg&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;resNeg&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;negBase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;neg&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//below generated by github copilot，所以人还是打不过电脑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parseFloat&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;float64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;+&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt; = &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;float64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &amp;lt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &amp;lt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;math&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Pow&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, float64(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; float64(&lt;span style=&#34;color:#a6e22e&#34;&gt;sign&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;不知名公司2算法一面&#34;&gt;不知名公司2，算法一面&lt;/h2&gt;
&lt;h4 id=&#34;描述-2&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;时间关系，两个人面，仅要求给思路，不看具体代码实现&lt;/p&gt;
&lt;p&gt;1 LRU的实现，why ？为啥使用这些数据结构，lru的使用场景？&lt;/p&gt;
&lt;p&gt;不再赘述&lt;/p&gt;
&lt;p&gt;2 单链表判断回文数，不能使用其他数据结构，只能使用单链表，不能新建一个单链表。&lt;/p&gt;
&lt;p&gt;这里有两种办法，一种是使用栈，就是用函数调用，也就是函数递归栈来解决反转的判断。&lt;/p&gt;
&lt;h2 id=&#34;paypal-二面全程英文面试&#34;&gt;paypal 二面（全程英文面试）&lt;/h2&gt;
&lt;h4 id=&#34;描述-3&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;给定一个string，判断是回文数？&lt;/p&gt;
&lt;h4 id=&#34;思路-2&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;没有要求，回文数很简单&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//below generated by github copilot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isPalindrome&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; = len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;众安保险一面&#34;&gt;众安保险，一面&lt;/h2&gt;
&lt;h4 id=&#34;描述-4&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;使用两个goroutine交替打印1-100之间的奇数和偶数, 输出时按照从小到大输出.&lt;/p&gt;
&lt;h4 id=&#34;思路-3&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;使用go的channel即可，本身就是一个队列，同时a b goroutine使用channel来交替获得channel的使用权，并且打印&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;print100&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doneC&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#a6e22e&#34;&gt;doneC&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt;{}{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#a6e22e&#34;&gt;doneC&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt;{}{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;doneC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;英语流利说-一面&#34;&gt;英语流利说 一面&lt;/h2&gt;
&lt;h4 id=&#34;描述-5&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;输入：{1, 1, 2, 3, 4, 5, 6, 7, 7}, 要求两个和是8的元素个数&lt;/p&gt;
&lt;p&gt;输出：6&lt;/p&gt;
&lt;p&gt;要求：O(n)时间复杂度,不能使用其他数据结构存储，不能增添额外的空间&lt;/p&gt;
&lt;h4 id=&#34;思路-4&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;双指针，一个指针从前往后，一个指针从后往前，如果两个指针相等，则两个指针向中间移动，如果不相等，则两个指针向中间移动，&lt;/p&gt;
&lt;p&gt;同时这里有个问题，对于重复元素的计数问题，这里面1，1 7,7 是4对，而不是1对，不需要去重元素。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, len(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;rightCount&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;leftCount&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;r&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;rightCount&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;leftCount&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rightCount&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;leftCount&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;rightCount&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;leftCount&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;某上海不知名web3-公司-一面&#34;&gt;某上海不知名web3 公司 一面&lt;/h2&gt;
&lt;h4 id=&#34;描述-6&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;1 15 threeSum  &lt;a href=&#34;https://leetcode.com/problems/3sum/&#34;&gt;https://leetcode.com/problems/3sum/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2 71 Simplify Path &lt;a href=&#34;https://leetcode.com/problems/simplify-path/&#34;&gt;https://leetcode.com/problems/simplify-path/&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;思路-5&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;都是leetcode原题&lt;/p&gt;
&lt;p&gt;threeSum的话，可以暴力解法，加一个map的key来去重，最后遍历map。或者使用递归，先twosum，再三sum，对于重复的元素，只计算一次，控制指针往前移并且忽略重复元素&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//below generated by github copilot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;threeSum&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;) &amp;lt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Ints&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;, []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;], &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;], &lt;span style=&#34;color:#a6e22e&#34;&gt;nums&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;simple path 的话，其实就是数据结构要用对，我自己用了队列，结果不对，实际要用栈。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//below generated by github copilot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;simplifyPath&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;[:len(&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;:&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;strings&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Join&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;stack&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;sap-accessments&#34;&gt;SAP accessments&lt;/h2&gt;
&lt;h4 id=&#34;描述-7&#34;&gt;描述&lt;/h4&gt;
&lt;p&gt;全是英文，题目比较简单，easy 水平，重要的是读懂问题，很长的描述&lt;/p&gt;
&lt;p&gt;1 数组求和&lt;/p&gt;
&lt;p&gt;2 路灯开关问题，8个路灯，有短路问题，如果前一天左右两个都开或者关，则自己今天是开，否则其他情况是关，开 1， 关0,边界条件是最边上的两盏灯，认为他们两侧的灯都是关即可。问n天后，路灯的开关情况。&lt;/p&gt;
&lt;h4 id=&#34;思路-6&#34;&gt;思路&lt;/h4&gt;
&lt;p&gt;比较简单，不写了&lt;/p&gt;
&lt;p&gt;重点是英文&lt;/p&gt;
&lt;p&gt;重点是英文&lt;/p&gt;
&lt;p&gt;重点是英文&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>How to install archlinux on a m1 mac</title>
      <link>https://zhaowang.me/archives/archlinux_1/</link>
      <pubDate>Fri, 24 Jun 2022 20:40:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/archlinux_1/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;reason&#34;&gt;Reason&lt;/h1&gt;
&lt;p&gt;I just have installed archlinux on a m1 mac. The reason is that I have a m1 mac.&lt;/p&gt;
&lt;h1 id=&#34;how-to-install&#34;&gt;How to install&lt;/h1&gt;
&lt;p&gt;Like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the archlinux iso&lt;/li&gt;
&lt;li&gt;Mount the iso&lt;/li&gt;
&lt;li&gt;Copy the archlinux folder to the root of the iso&lt;/li&gt;
&lt;li&gt;Unmount the iso&lt;/li&gt;
&lt;li&gt;Boot the iso&lt;/li&gt;
&lt;li&gt;Install the archlinux&lt;/li&gt;
&lt;li&gt;Reboot the mac&lt;/li&gt;
&lt;li&gt;Enjoy your new linux&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;wait wait ??? right now is 2022, why the steps are so complicated?&lt;/p&gt;
&lt;p&gt;dang dang dang&lt;/p&gt;
&lt;p&gt;This time I just use the &lt;a href=&#34;https://mac.getutm.app/&#34;&gt;UTM&lt;/a&gt; to install it.&lt;/p&gt;
&lt;p&gt;So the reallly steps are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the utm App&lt;/li&gt;
&lt;li&gt;Install the utm App&lt;/li&gt;
&lt;li&gt;Open the utm App&lt;/li&gt;
&lt;li&gt;Open the &lt;a href=&#34;https://mac.getutm.app/gallery/&#34;&gt;UTM Gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Select the archlinux iso&lt;/li&gt;
&lt;li&gt;Click the Open In UTM button&lt;/li&gt;
&lt;li&gt;Wait for the installation to finish&lt;/li&gt;
&lt;li&gt;Enjoy your new linux&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;archlinux-on-a-m1-mac&#34;&gt;archlinux on a m1 mac&lt;/h1&gt;
&lt;p&gt;Performance is so good, I didn&amp;rsquo;t need to install gui tools. I just need a terminal. And I use &lt;a href=&#34;https://warp.dev/&#34;&gt;Warp&lt;/a&gt; to connect to the archlinux ssh server.&lt;/p&gt;
&lt;p&gt;Then I will try docker. And different softwares with the great gui mac provides.&lt;/p&gt;
&lt;p&gt;Using pacman -Syu to go.&lt;/p&gt;
&lt;h1 id=&#34;problems--solutions&#34;&gt;Problems &amp;amp;&amp;amp; Solutions&lt;/h1&gt;
&lt;h2 id=&#34;1-cant-boot-the-iso-error-is-like-__get_cpu_fpsimd_context0x2c0x38&#34;&gt;1. can&amp;rsquo;t boot the iso, error is like &lt;code&gt;__get_cpu_fpsimd_context+0x2c/0x38&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Solution: Change the System-&amp;gt;CPU Option from Default to &amp;lsquo;a64fx&amp;rsquo;.&lt;/p&gt;
&lt;h2 id=&#34;2-pacman--syu-update-error-like-error-key-xxxxxx-could-not-be-looked-up-remotely-on-archlinux&#34;&gt;2. pacman -Syu update error, like &lt;code&gt;error key &amp;quot;xxx...xxx&amp;quot; could not be looked up remotely on ArchLinux&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Solution:
follow this one &lt;a href=&#34;https://superuser.com/questions/1675153/error-key-xxx-xxx-could-not-be-looked-up-remotely-on-archlinux&#34;&gt;error key &amp;ldquo;xxx&amp;hellip;xxx&amp;rdquo; could not be looked up remotely on ArchLinux&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman-key --init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman-key --populate archlinuxarm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-network-link-dev-lost-when-i-have-multiple-linux-and-alter-the-first-one-network-choices-the-first-one-lost-the-network-link&#34;&gt;3. network link dev lost, when I have multiple linux, and alter the first one network choices, the first one lost the network link&lt;/h2&gt;
&lt;p&gt;Solution: just reinstall the linux.&lt;/p&gt;
&lt;h2 id=&#34;4-add-a-port-forward-then-network-link-dev-lost&#34;&gt;4. add a port forward, then network link dev lost&lt;/h2&gt;
&lt;p&gt;Solution: give up utm.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>华为社招机考-字符串解压缩</title>
      <link>https://zhaowang.me/archives/huawei_strings_decompress/</link>
      <pubDate>Tue, 21 Jun 2022 20:40:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/huawei_strings_decompress/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;缘起&#34;&gt;缘起&lt;/h1&gt;
&lt;p&gt;最近参加华为的社招，有个牛客网的机考题。总分400分，共两道题，任选一道题，160分即可算即可。&lt;/p&gt;
&lt;p&gt;从网上搜索了下，题目是这样的&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jianshu.com/p/0ae024d0d3b5&#34;&gt;字符串解压缩&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;题目介绍&#34;&gt;题目介绍&lt;/h1&gt;
&lt;p&gt;将一段压缩后的字符串解压缩，并且排序输出。&lt;/p&gt;
&lt;h2 id=&#34;解压规则&#34;&gt;解压规则：&lt;/h2&gt;
&lt;p&gt;每个字符串后面跟着一个数字，表示这个字符串的重复次数。例如，”a5”解压后的结果为”aaaaa”；’abc3’解压后的结果为”abcabcabc”。&lt;/p&gt;
&lt;h2 id=&#34;排序规则&#34;&gt;排序规则：&lt;/h2&gt;
&lt;p&gt;1、根据每个字符串的重复次数升序排序，然后输出结果。例如，”a3b2”，输出的结果为”bbaaa”。
2、如果字符重复次数一样，则根据ASCII编码顺序做升序排序，然后输出结果。例如，”b2a2”，输出的结果为”aabb”。&lt;/p&gt;
&lt;h2 id=&#34;输入描述&#34;&gt;输入描述：&lt;/h2&gt;
&lt;p&gt;输入的原始字符串仅包含字母与数字&lt;/p&gt;
&lt;h2 id=&#34;输出描述&#34;&gt;输出描述：&lt;/h2&gt;
&lt;p&gt;输出的结果字符串仅包含字母&lt;/p&gt;
&lt;h3 id=&#34;示例1&#34;&gt;示例1&lt;/h3&gt;
&lt;p&gt;输入&lt;/p&gt;
&lt;p&gt;a11b2bac3bad3abcd2&lt;/p&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;p&gt;abcdabcdbbbacbacbacbadbadbadaaaaaaaaaaa&lt;/p&gt;
&lt;h1 id=&#34;我的实现&#34;&gt;我的实现&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decompress&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// using map to store freq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;freq&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; make(&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#75715e&#34;&gt;//store string frequency
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; int(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#75715e&#34;&gt;//for keeping get numbers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; int(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#75715e&#34;&gt;// set freq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;freq&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;] = &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#75715e&#34;&gt;//set key = &amp;#34;&amp;#34; and num = 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#75715e&#34;&gt;// set new key
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; string(&lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// sort nums freq low to high
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;sortRes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sortFreq&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;freq&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;//print numbers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;sortRes&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;freq&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;sortRes&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sortRes&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kv&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sortFreq&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;m&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt; []&lt;span style=&#34;color:#a6e22e&#34;&gt;kv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;m&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;kv&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kv&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;kv&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Slice&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;kvs&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        
        </description>
    </item>
    
    <item>
      <title>Go slice的一个坑</title>
      <link>https://zhaowang.me/archives/go_slice_reference/</link>
      <pubDate>Wed, 08 Jun 2022 10:51:57 +0800</pubDate>
      
      <guid>https://zhaowang.me/archives/go_slice_reference/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;问题&#34;&gt;问题&lt;/h1&gt;
&lt;p&gt;最近在刷leedcode，求二叉树的路径和，给定一个二叉树，求所有符合条件的路径。原题见 &lt;a href=&#34;https://leetcode.com/problems/path-sum-ii/&#34;&gt;113. Path Sum II&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这道题需要遍历所有的节点，并且记录遍历路径上的节点，可以使用回溯法，深度优先的方法。&lt;/p&gt;
&lt;p&gt;不过最近用习惯了广度优先的方法，把二叉树变成一个有序的队列，这种思想很好玩，把多个选择的，需要遍历的变成一个有序的来进行遍历即可，就是一个万能模板。&lt;/p&gt;
&lt;p&gt;下面贴下代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;TreeNode&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取当前节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取父节点的总和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取父节点的所有路径节点序列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;parents&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//当前节点的总和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;curSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//当前节点的序列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; append(&lt;span style=&#34;color:#a6e22e&#34;&gt;parents&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;curSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;targetSum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// 添加当前节点序列到结果集
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;大家细读一下，不知道有没有看出来哪里不对，我先贴一下结果
&lt;img src=&#34;https://assets.leetcode.com/uploads/2021/01/18/pathsumii1.jpg&#34; alt=&#34;test case&#34;&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Input: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
Output: [[5,4,11,2],[5,8,4,5]]
Explanation: There are two paths whose sum equals targetSum:
5 + 4 + 11 + 2 = 22
5 + 8 + 4 + 5 = 22
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面这段代码的输出 Output:
[[5,4,11,2],[5,8,4,1]]&lt;/p&gt;
&lt;h1 id=&#34;why-&#34;&gt;why ？&lt;/h1&gt;
&lt;p&gt;可以看到，问题出在了最后一个右侧的子树和节点，看代码怎么看都没有错，为啥5 变成 1 了，肯定是哪里有引用了，导致被修改掉了。&lt;/p&gt;
&lt;h2 id=&#34;go-不是引用传递是指传递吗&#34;&gt;go 不是引用传递，是指传递吗？&lt;/h2&gt;
&lt;p&gt;万事不决问google,贴一段stackoverflow的问题 &lt;a href=&#34;https://stackoverflow.com/questions/39993688/are-slices-passed-by-value&#34;&gt;are-slices-passed-by-value&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;{&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;double&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// ----&amp;gt; 3 will print [2, 20, 200, 2000] (original slice changed)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;double&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// ----&amp;gt; 1 will print [1, 10, 100, 1000]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// ----&amp;gt; 2 will print [2, 20, 200, 2000] (copy slice + under array changed)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://pkg.go.dev/reflect#SliceHeader&#34;&gt;reflect.SliceHeader&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SliceHeader&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Data&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uintptr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Len&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Cap&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按理来讲，main 函数里面的x 应该还是原样呀，对吧，为啥double了？贴一段最高票的答案&lt;/p&gt;
&lt;p&gt;Everything in Go is passed by value, slices too. But a slice value is a header, describing a contiguous section of a backing array, and a slice value only contains a pointer to the array where the elements are actually stored. The slice value does not include its elements (unlike arrays).&lt;/p&gt;
&lt;p&gt;So when you pass a slice to a function, a copy will be made from this header, including the pointer, which will point to the same backing array. Modifying the elements of the slice implies modifying the elements of the backing array, and so all slices which share the same backing array will &amp;ldquo;observe&amp;rdquo; the change.&lt;/p&gt;
&lt;p&gt;翻译过来就是go 是值传递，没有问题的，slice也是值传递，不过因为slice是一个header，所以传递的是一个header，而不是一个slice，所以修改slice的值，会修改数组的值，所以所有共享同一个数组的slice都会观察到这个修改。&lt;/p&gt;
&lt;h2 id=&#34;回过来我们的问题&#34;&gt;回过来我们的问题&lt;/h2&gt;
&lt;p&gt;可以发现右侧的5-8-4-5 是一个符合答案的结果，但当遍历右侧子树的时候，5-8-4-1 的时候，5-8-4-1 与5-8-4-5 共享了一个5-8-4 的parents nodes，当把1 添加到5-8-4 的nodes的时候，5-8-4-5 的序列被改成了5-8-4-1。&lt;/p&gt;
&lt;h2 id=&#34;怎么解决&#34;&gt;怎么解决？&lt;/h2&gt;
&lt;p&gt;当前节点的序列应该都创建一个新的slice，然后把当前节点添加到这个新的slice里面，然后把这个新的slice添加到结果集里面。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; [][]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;TreeNode&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;) &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; len(&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;); &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取当前节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取父节点的总和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//获取父节点的所有路径节点序列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;parents&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//当前节点的总和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;curSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//当前节点的序列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; append(&lt;span style=&#34;color:#a6e22e&#34;&gt;parents&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//新增一个nodes slice，复制之前的序列，并且更改传递
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;resNodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; make([]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, len(&lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        copy(&lt;span style=&#34;color:#a6e22e&#34;&gt;resNodes&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;curNodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;curSum&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;targetSum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// 添加当前节点序列到结果集
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; = append(&lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;resNodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;resNodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;ch&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Right&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;sumChan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cur&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Val&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parentSum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;nodes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;resNodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;结语&#34;&gt;结语&lt;/h1&gt;
&lt;p&gt;每一门语言都不是完美的，最好的语言，应该尽量简化理解成本，而不是让用户自己去理解。每个语言的设计也都是有tradeoffs的，有些语言的设计是为了提高性能，有些语言的设计是为了提高可读性。&lt;/p&gt;
&lt;p&gt;高级语言是在人类和汇编语言之间的桥梁，汇编语言是高级语言和计算机之前的桥梁。&lt;/p&gt;
&lt;p&gt;自然语言是人类的语言，会有新的AI将人类的语言变成计算机的语言吗？这些中间层，可能效率低一些，但他是增加了人类的参与度的，普适度的。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>软路由系列--你的家庭linux服务器</title>
      <link>https://zhaowang.me/archives/48/</link>
      <pubDate>Wed, 12 Aug 2020 22:07:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/48/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;不仅仅是路由&#34;&gt;不仅仅是路由&lt;/h2&gt;
&lt;p&gt;软路由不仅仅是一个路由器，如果你安装了发行版linux，那么他还是一台高性能的linux server，可以做很多有趣的事情。&lt;/p&gt;
&lt;h2 id=&#34;家庭服务器&#34;&gt;家庭服务器&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1 备份中心&lt;/strong&gt;
必要性：假如你也有很多网站，博客，自己的一些网盘等，你怕这些数据可能会丢失，所谓狡兔三窟，自己的数据至少也要保留两份把，并且需要是不同的介质。&lt;/p&gt;
&lt;p&gt;怎么做：软路由挂一个本地硬盘，写一些shell备份脚本，每天把你的网站的内容、数据库备份，网盘数据等同步拉到本地。并且设置备份策略，只保留30天以内，一年以内的，只保留每月初的备份。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2 code server，让vscode 无处不在&lt;/strong&gt;
如果你要写代码，后端使用code server，可以在各个移动端，电脑等通过浏览器直接使用vscode
教程直接见&lt;a href=&#34;https://github.com/cdr/code-server&#34;&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 mysql、mongo等数据库&lt;/strong&gt;
配合你本地电脑使用，防止占用你的本地笔记本资源，现在的笔记本性能不要求太高，只要有个好屏幕+键盘就可以连接一个强大的后端服务器，随意玩耍&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 docker&lt;/strong&gt;
这个就不用讲了，有了docker各种软件随意安装使用，真正的开箱即用&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5 爬虫&lt;/strong&gt;
你可以放一些自己的爬虫，让他来跑一些任务，爬一些你自己感兴趣的东西&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6 bt下载&amp;amp;nas服务器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7 配合树莓派硬件使用&lt;/strong&gt;
树莓派有一些gpio硬件接口，可以从淘宝买一些硬件，实现烟雾报警器、光线感应、温度计、遥控车等等好玩的东东。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>软路由系列--路由器系统&amp;软件篇</title>
      <link>https://zhaowang.me/archives/47/</link>
      <pubDate>Sat, 08 Aug 2020 14:38:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/47/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;软路由的系统&#34;&gt;软路由的系统&lt;/h2&gt;
&lt;p&gt;软路由，软字排在了路由器前面，说明软件是软路由的头等大事。&lt;/p&gt;
&lt;p&gt;软件分为操作系统和应用程序两类，选择了操作系统，也就选了对应的软件生态。那我们先来看操作系统。&lt;/p&gt;
&lt;p&gt;由于我们的路由是一个网络硬件，那么哪个操作系统软件的网络软件最丰富呢？毋庸置疑，就是linux了。windows和macos也是可用的，但没有linux的网络库全和大。&lt;/p&gt;
&lt;p&gt;适用路由器的linux操作系统，分为两种，路由器专用系统，和常见的linux发行版。下面分别讲下他们的优缺点。&lt;/p&gt;
&lt;h3 id=&#34;路由器专用系统&#34;&gt;路由器专用系统&lt;/h3&gt;
&lt;p&gt;如LEDE/openwrt，爱快，koolshare，是专门为路由器开发的嵌入式系统&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;
自带套件，安装方便，为了软路由而生,有web管理页面,配置管理方便&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;
软件源没有常见linux发行版多，很多软件需要适配&lt;/p&gt;
&lt;h3 id=&#34;常见linux发行版&#34;&gt;常见linux发行版&lt;/h3&gt;
&lt;p&gt;如centos、ubuntu、debian、archlinux等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;
软件丰富，可以装几乎所有的软件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;
配置复杂，安装麻烦，需要一定的shell、系统管理的知识&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;
如果你有一定的动手能力，我推荐你使用linux发行版做你的路由器系统（有一定的硬件配置要求，比如我的是4核赛扬的cpu、2G内存，128G的ssd硬盘+1T的hdd硬盘），如果你路由器配置比较低，那么推荐使用路由器专用系统，占用资源较少。&lt;/p&gt;
&lt;h2 id=&#34;软路由的软件&#34;&gt;软路由的软件&lt;/h2&gt;
&lt;p&gt;假设跟我一样，你选择了安装常见linux发行版，并且为了稳定选择了centos当作操作系统（当然你也可以选择自己的发行版），那么需要安装什么软件才能让他变成一个路由器呢？&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://zhaowang.me/usr/uploads/2020/08/network.png&#34; alt=&#34;软路由拓扑&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作系统安装&lt;/strong&gt;
&lt;a href=&#34;https://docs.centos.org/en-US/centos/install-guide/&#34;&gt;centos安装指南官方版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件列表&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dnsmasq （必选）提供dns、dhcp等功能&lt;/li&gt;
&lt;li&gt;iptables (可选）网络利器&lt;/li&gt;
&lt;li&gt;shadowsocks(可选）网络软件&lt;/li&gt;
&lt;li&gt;samba(可选） 本地共享&lt;/li&gt;
&lt;li&gt;adbyby（可选）广告过滤透明代理&lt;/li&gt;
&lt;li&gt;transmission(可选） bt下载&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;软件配置指南&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1 dnsmasq&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于我家里是光纤，网络运营商自带了一个modem兼路由器。从网上翻了下，找到一个超密，并且超密到路由器，可以设置这个路由器为桥接或者路由功能，如果选择桥接，相当于他什么作用也没有，仅仅是一个光纤信号转换器了，这里我选择的是路由，所以也不需要安装拨号软件了。&lt;/p&gt;
&lt;p&gt;首先：设置dhcp server，dns转发，编辑 /etc/dnsmasq.conf&lt;/p&gt;
&lt;p&gt;interface=br0 ## 设置你的网络接口，可能与我的不同
dhcp-range=10.0.1.2,10.0.1.254,72h ## 设置你要分配的内网地址段，租约时间，dhcp server
resolv-file=/etc/resolv.dnsmasq.conf  ## 设置你要使用的默认dns&lt;/p&gt;
&lt;p&gt;其次：配置系统转发封包，开启linux路由功能，这样你的linux服务器就是一个路由器了&lt;/p&gt;
&lt;p&gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
sysctl -p
net.ipv4.ip_forward = 1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2 shadowsocks&lt;/strong&gt;
你既然配置了dnsmasq,我推荐你设置全局透明翻墙，使用gfwlist 方案&lt;/p&gt;
&lt;p&gt;优点：只要你局域网内的设备连上了你的路由器，所有自动翻墙，无需设置，可以让特定域名根据dnsmasq解析出来的ip强制走ss。
缺点：域名列表需要维护，你可以自己设置，也可以直接使用&lt;a href=&#34;https://github.com/gfwlist/gfwlist&#34;&gt;gfwlist&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先：配置dns解析，配合使用dnsmasq进行dns转发,让你获取正确的ip。 这里如果你安装的dnsmaq已经包含了ipset，则直接使用即可。 把dns请求根据域名路由到特定的服务器，可以把他添加到你的配置文件即可,如下（具体示例配置如下）。&lt;/p&gt;
&lt;p&gt;配置说明：对于google.com 的域名dns解析请求转发到本地的5353端口， 并且把解析出来的ip地址放入gfwlist这个ipset集合里面。&lt;/p&gt;
&lt;p&gt;server=/.google.com/127.0.0.1#5353
ipset=/.google.com/gfwlist&lt;/p&gt;
&lt;p&gt;其次：设置iptables 路由规则，把上一步获取的正确的ip地址进行路由，把gfwlist ipset里面的ip地址自动路由到你的ss-server ss-redir监听的端口，iptables nat 规则如下,设置prerouting 是为了你的局域网内设备翻墙，设置output 是为了你路由器自己也能翻墙。&lt;/p&gt;
&lt;p&gt;iptables -t nat -A PREROUTING -p tcp -m set &amp;ndash;match-set gfwlist dst -j REDIRECT &amp;ndash;to-port 1080
iptables -t nat -A OUTPUT -p tcp -m set &amp;ndash;match-set gfwlist dst -j REDIRECT &amp;ndash;to-ports 1080&lt;/p&gt;
&lt;p&gt;最后：设置好后，你的设备先通过dnsmasq 把dns解析路由到你的ss的服务器，防止dns污染。然后根据解析出来的正确的地址，再把这些地址的访问请求路由到代理服务器，获得正确的连接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 adbyby&lt;/strong&gt;
广告过滤安装启动后，会有一个监听端口，这个软件可以过滤http流量的广告，足够用了，所以只要把80端口的流量转发即可。（这个软件开启后会有性能损失）&lt;/p&gt;
&lt;p&gt;配置iptables 规则，8118 是adbyby 监听端口&lt;/p&gt;
&lt;p&gt;iptables -t nat -A PREROUTING -p tcp &amp;ndash;dport 80 -j REDIRECT &amp;ndash;to-ports 8118&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 transmission &amp;amp; samba&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如何配置，请查看软件官方指导，比较简单。
作用：下载bt，本地看视频等
一个是下载bt软件，一个是本地共享服务器，bt下载的视频等可以通过samba协议在手机端&amp;amp;电脑端&amp;amp;电视等各个下挂设备使用。（这里推荐你局域网的设备，有线一定要千兆，无线也一定要千兆，传输速度不要是瓶颈）
transmission 还有一个网页管理页面，还可以随时随地往里面放入下载任务。咱不多说。&lt;/p&gt;
&lt;h3 id=&#34;软路由其他玩法&#34;&gt;软路由其他玩法&lt;/h3&gt;
&lt;p&gt;由于他是一个linux系统，你还可以把他当作一个代码仓库，可以放你自己的爬虫，可以做网络qos等管理，设置某些网站无法访问（防止熊孩子系列）等等，只要你可以想到，就可以做到，还可以配合树莓派等硬件做一些只能硬件，快乐玩耍吧&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>软路由系列--强大的软路由</title>
      <link>https://zhaowang.me/archives/46/</link>
      <pubDate>Wed, 05 Aug 2020 20:53:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/46/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;&lt;strong&gt;什么是软路由？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;是相对于硬路由而来的概念，先说硬路由，市面上常见的路由器基本都是各个厂商自己订购的硬件，加上自己的嵌入式系统，组成了一个常见的路由器，它可以提供路由功能，NAT,现在主流的基本都有无线AP，可以供无线上网的功能。软路由呢？软路由是软件模拟路由，它不像传统路由器有专门的硬件设备来做路由，他的路由功能由软件来模拟，系统可以跑在任何支持linux的系统之上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么有软路由？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还不是市场上的路由器性能太差，cpu能力太弱，普通家庭上个网是没啥问题，但涉及到加解密等cpu消耗型工作或者一些定制化的网路需求，就无能为力了。软路由还有个优点，即价格便宜，同样性能的路由器，你买市面大厂商的可能需要几千大洋，但软路由可能几百就有同样的性能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择什么牌子的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你有钱，土豪，不在乎电费，那随便来一台高配版都可以。
如果你差钱，但不在乎电费，可以使用家里旧的电脑来搞搞，但记得要买个网卡。
如果你有一丢丢预算，在乎电费，推荐买一些工控机，直接关键词软路由就可以找到很多你想要的，几百块钱就可以买一个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软路由装什么系统？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你是小白，就想搞个成品的，我推荐你使用LEDE,基本的路由功能都有，而且还有很多插件可以选择，可以进行扩展。
如果你是爱折腾的，我推荐你安装一个linux 发行版，而且不需要安装图形界面，装一个console的即可，常见发行版如centos，ubuntu，debian，archlinux等等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无线AP选购&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;软路由设置好了后，一般都是没有无线AP模块的，需要你有个专门的AP搭配使用，你可以选择购买市场上的ap，也可以买一些便宜的路由器，仅仅把它当作一个无线AP使用，因为路由器比AP便宜。由于我穷，所以买的是网件的路由器，设置成无线AP模式，当作AP使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软路由能干啥？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我仅仅讲下我的日常使用，我的软路由是淘宝买的一个工控机，4核的6w的小机器，性能足够。路由器系统选择的是centos。 这台小机器，也是我自己的一个家庭服务器，可以装各种软件。可以当作家庭存储中心，可以播放视频，可以当作下载机器，可以翻墙，可以去广告，可以跑爬虫等等。只要你能想到，他基本都能做到。&lt;/p&gt;
&lt;p&gt;接下来会分开讲讲软路由系统软件的选择和安装&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>google pixelbook install ubuntu archlinux</title>
      <link>https://zhaowang.me/archives/44/</link>
      <pubDate>Fri, 24 Jan 2020 15:59:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/44/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;happy-chinese-luner-new-year&#34;&gt;Happy Chinese Luner New Year&lt;/h2&gt;
&lt;p&gt;So I bought a pixelbook(2017 i5 256G) from Taobao for 450$.Then I began to tweak my pixelbook. First I switch my pixelbook to develop mode.&lt;/p&gt;
&lt;h2 id=&#34;install-arch-linux&#34;&gt;Install Arch Linux&lt;/h2&gt;
&lt;p&gt;First I follow a article install archlinux with legacy boot,I spent half my day troubleshooting. &lt;a href=&#34;https://gist.github.com/daemonp/ecead946317b175e3b54731a513efe94&#34;&gt;install-archlinux-on-pixelbook&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;archlinux-problems&#34;&gt;Archlinux Problems&lt;/h2&gt;
&lt;p&gt;I install a console environment, I can&amp;rsquo;t connect to wifi,but my archlinux usb stick work well,then I found I forget install dialog and wpa_supplicant library,I install those,then I only got a ipv6 address,I know that I did not got a address, Then I go back to my chroot environment install dhclient, I manuly run dhclient got a ipv4 address,then I got connected to internet, then I install a gnome desktop environtment ,but the trackpad is lagged and I can&amp;rsquo;t stand it. So I switch back to google official linux on chromeos.&lt;/p&gt;
&lt;h2 id=&#34;install-galliumos&#34;&gt;Install GalliumOs&lt;/h2&gt;
&lt;p&gt;After My first try on standlone linux, I began to know there is a website named MrChromeBox. And I know a lot of about my pixelbook.And I happend to know chrx script. So I tried and change proper mirror and downloaded finally.&lt;/p&gt;
&lt;h2 id=&#34;galliumos-problem&#34;&gt;GalliumOs Problem&lt;/h2&gt;
&lt;p&gt;My trackpad not working. and the hiDpi not support,so I switch back.&lt;/p&gt;
&lt;h2 id=&#34;install-ubuntu&#34;&gt;Install Ubuntu&lt;/h2&gt;
&lt;p&gt;I read a lot from MrChromeBox. chrx is just a legacy boot dual system. You can spare your ssd with your chrome book. and I spare 128Gb to my newly install Ubuntu.&lt;/p&gt;
&lt;h2 id=&#34;ubuntu-problem&#34;&gt;Ubuntu problem&lt;/h2&gt;
&lt;p&gt;Ubuntu is the best ever linux on chromebook standalone I experienced. Also I got some little problems,but it work fine and gorgerous.&lt;/p&gt;
&lt;p&gt;The stock Ubuntu is not good, the trackpad not good,the screen backlight is 100% ,voice not work. And I got answer from a website &lt;a href=&#34;https://github.com/yusefnapora/pixelbook-linux&#34;&gt;pixelbook-linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The script above do a lot of tweaking for ubuntu.After that my trackpad is almost work like on stock chromeos, but audio not working. and the ubuntu is beautiful .&lt;/p&gt;
&lt;h2 id=&#34;final-advice&#34;&gt;Final Advice&lt;/h2&gt;
&lt;p&gt;So in my opinion, If you want try standalone linux, I would suggest You try chrx ubuntu standard version,then install gnome-desktop,and got tweaking use pixelbook-linux.&lt;/p&gt;
&lt;p&gt;Finally I switch back to stock chromeos.&lt;/p&gt;
&lt;p&gt;Pixelbook Is not friendly to web development enough,Not good compared to macbook pro.&lt;/p&gt;
&lt;p&gt;Maybe I just do little development with stock linux on chromeos. Although sometimes a little laggy and not responsive.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>golang爬虫之无名小说网站</title>
      <link>https://zhaowang.me/archives/40/</link>
      <pubDate>Sun, 14 Jul 2019 14:46:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/40/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;最近无聊，在看一些之前追更的小说，发现一些下载的完本质量太差，排版太乱，发现一个在线网站排版优美，质量上乘，于是简单写一个爬虫下载下来，放到 kindle 看，美哉。&lt;/p&gt;
&lt;p&gt;当然使用自己最喜欢的 golang 了，短短几行代码就足够了。&lt;/p&gt;
&lt;p&gt;源码贴出来，我的代码写的很烂，不过能用就行。&lt;/p&gt;
&lt;p&gt;使用：命令行下执行命令，输入书名 id 即可下载。&lt;/p&gt;
&lt;p&gt;后续：当然也可以改善下，使用书名下载，不过需要多一步，再加几行代码，懒得做了，以下是源码。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/nullsimon/c303072b14af9940f98814de398b903f&#34;&gt;代码见github gist&lt;/a&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>使用letsencrypt 来加密自己的个人网站</title>
      <link>https://zhaowang.me/archives/39/</link>
      <pubDate>Fri, 12 Jul 2019 22:42:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/39/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;流量黑产，在有了加密的https后偃旗息鼓，中国的大型网站为了自己的收益，也早早就拥抱了https。&lt;/p&gt;
&lt;p&gt;自己的小站很早使用了letsencrypt，之前是ubuntu系统，certbot 机器人很好用，直接傻瓜输入命令即可。&lt;/p&gt;
&lt;p&gt;后来从ubuntu 搬到了centos，因为自己的nginx是自定义路径安装，certbot无法使用，只好手动生成后拷贝密钥。但每隔3个月就要拷贝太麻烦。于是花点时间研究下。&lt;/p&gt;
&lt;p&gt;letsencrypt是一个证书签署机构，原理很简单，分为两步
1 给一串文本，引导你放到自己域名的机器上，然后验证这串文本，通过后即可知道此域名属于你。
2 本地生成你自己的key，根据你提供的key，签署生成你的ca证书，并且给到你使用。&lt;/p&gt;
&lt;p&gt;因为我的web server是nginx，所以证书的使用放到了nginx。&lt;/p&gt;
&lt;p&gt;以上可以搞成自动化，certbot不好用的话，从官方推荐工具中选择了一个纯bash的小工具。
官方小工具列表： &lt;a href=&#34;https://letsencrypt.org/docs/client-options/&#34;&gt;https://letsencrypt.org/docs/client-options/&lt;/a&gt;
个人推荐小工具： &lt;a href=&#34;https://github.com/Neilpang/acme.sh&#34;&gt;https://github.com/Neilpang/acme.sh&lt;/a&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>一句话理解反射</title>
      <link>https://zhaowang.me/archives/38/</link>
      <pubDate>Sun, 26 May 2019 11:10:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/38/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;反射其实很简单，就是一句话的事情，看了网上的各种文章，都是讲了各种使用方法，基本都没提及为啥要有反馈？仅仅做到了知其然，不知其所以然。&lt;/p&gt;
&lt;p&gt;我们都知道整个软件工程其实就是0和1.&lt;/p&gt;
&lt;p&gt;数据的存储其实是存储的0和1，计算的过程中就是0和1的各种运算。随之衍生的是存储用的数据结构，运算使用的算法。&lt;/p&gt;
&lt;p&gt;一个语言是否支持反射需要看这个语言是否有一个父类（如java的object，go的interface）。这门语言的数据结构里面存储了类型信息和数据，也就是他自己约定好的格式。&lt;/p&gt;
&lt;p&gt;举个例子
ipv4 数据包
&lt;img src=&#34;http://4.bp.blogspot.com/-MVavT89AhdE/UrFoY30f3yI/AAAAAAAABfs/msVn9E9w1Nw/s1600/ipv4.png&#34; alt=&#34;请输入图片描述&#34;&gt;&lt;/p&gt;
&lt;p&gt;也就是说，当一个数据过来的时候，你就知道他是v4还是v6，知道他的长度，知道他的协议，这些都是约定好的数据。同理各语言支持的反射也是如此，当一个数据过来，他自己本身已经自带解释了，他是什么类，他有啥方法，有啥数据，只要程序读出来就好了。&lt;/p&gt;
&lt;p&gt;以上，反射就是如此简单。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>openwrt 更改登录用户名</title>
      <link>https://zhaowang.me/archives/33/</link>
      <pubDate>Thu, 10 Nov 2016 12:52:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/33/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;换了电信宽带，网速很是令人沮丧，虽然是100兆的光纤，但是访问外网的话，就是4M小水管了，期间为了不停测试各个vps，为自己的路由器加了个ddns，然而这样以后，就是相当于把自己的服务器放到互联网上了，很是不安全，于是更改用户名。&lt;/p&gt;
&lt;p&gt;更改  /etc/shadow,/etc/shadow-,/etc/passwd,/etc/passwd-,把其中的第一个root换成自己的username后，就ok了，ssh已经没问题了，可是新问题又出来了，http没法登录了。&lt;/p&gt;
&lt;p&gt;google后发现还需要更改  /usr/lib/lua/luci/controller/admin/index.lua 把其中的	page.sysauth = &amp;ldquo;root&amp;rdquo;  换成  page.sysauth = &amp;ldquo;username&amp;rdquo; ，其中username为你想要更换的名字，而后就可以愉快的登录了。&lt;/p&gt;
&lt;p&gt;这样其实还有个问题，我的是15.05版本，登录页默认有用户名，而且这个还没有防暴力登录机制，为了安全，我把默认的用户名修改了，当然也可以去掉，修改/usr/lib/lua/luci/view/sysauth.htm 模板文件，把其中的&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cbi-input-user&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;luci_username&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;%=duser%&amp;gt;&amp;#34;&lt;/span&gt; /&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改为&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cbi-input-user&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;luci_username&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt; /&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者，直接把value去掉也可以，混淆敌人。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Inbox Gmail 邮件通知推送收不到</title>
      <link>https://zhaowang.me/archives/32/</link>
      <pubDate>Wed, 12 Oct 2016 17:26:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/32/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;最近折腾手机，最新的Pixel 出来后，Android 给他一个专属App ，名叫Google Assistant。看着就是很有趣，而且很方便，最主要还是比较智能。可惜自己的手机是Nexus6，并不能使用。刷Xda，看到修改build.prop 就可以成功欺骗Google 从而使用，于是修改build.prop为&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-conf&#34; data-lang=&#34;conf&#34;&gt;    ro.product.model=Pixel XL
    ro.opa.eligible_device=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后重启手机，清空Google App 的data，长按中间home键，然后就可以使用了。&lt;/p&gt;
&lt;p&gt;可惜，这样完了以后，Google App 的信息流就没了，也就是以前的Google Now，而且选择加入也不行，说是你的账户不能使用此服务，只能按照老方法，清除 Google Play Service，Google App，Google Play Store，Google Service Framework数据，桌面长按，选择 Setting，选择Accounts&amp;amp;Privacy，点击Google Account，点击Sign Out，然后返回桌面，选择 I&amp;rsquo;m In，开启Google Now.&lt;/p&gt;
&lt;p&gt;问题接踵而至，然后邮件推送失败，gmail，inbox 都是收不到邮件推送了。接着；继续清除数据才能成功，方法如下&lt;/p&gt;
&lt;p&gt;清除 Google Play Service，Google Play Store，Google Service Framework， Inbox， Gmail， Exchange Services（这个最重要，莫要忘了）的数据，如无意外，发一封测试邮件吧，就能看到邮件推送通知了。&lt;/p&gt;
&lt;p&gt;另外吐槽，Google自家的设备推送邮件太慢，还没有Apple 的设备快，每次邮件都是我的iPhone 先收到推送，反而是Nexus 后收到推送，垃圾 Google（手动滑稽）。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>typecho 搬家出现500数据库错误</title>
      <link>https://zhaowang.me/archives/31/</link>
      <pubDate>Thu, 29 Sep 2016 15:42:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/31/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;这两天，测试了vultr，用站长ping测试了下，这个ping比我远在美国的机器好多了，虽然以前的vps用着也还行，但好在vultr很便宜，而且现在还有各种优惠赠送，所以就把博客什么的一块迁移到这里来了。&lt;/p&gt;
&lt;p&gt;打包，备份数据库，scp到新的机器上，添加nginx信息，而后打开首页，我就坑了，发现是500 数据库错误，百思不得其解，自己本地数据库链接信息没有错误，google 也没有找到正确答案，于是乎，我拿出杀器，从官方下载原版的typecho，把install.php 拷贝到网站目录下，然后安装，重新生成config.inc.php；对比了一下以前的config.inc.php发现，数据库的参数设置有误，我的可工作的数据库配置如下图
![BA82D82C-7709-4E86-96D0-6CEF40B28B3E.png][1]
[1]: &lt;a href=&#34;http://zhaowang.me/usr/uploads/2016/09/1050427988.png&#34;&gt;http://zhaowang.me/usr/uploads/2016/09/1050427988.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;应该是我的数据库变化了吧，不管如何，搞定成功。&lt;/p&gt;
&lt;p&gt;首页是ok了，兴高采烈了没多久，发现子页面全部是404；&lt;/p&gt;
&lt;p&gt;这个一看就知道是php-pathinfo的锅，以前的配置文件也不管用了，所以直接把include enable-php.conf 改成 include enable-php-pathinfo.conf 搞定，顺带贴出来&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;location&lt;/span&gt; ~ &lt;span style=&#34;color:#e6db74&#34;&gt;[^/]\.php(/|$)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;fastcgi_pass&lt;/span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;unix:/tmp/php-cgi.sock&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;fastcgi_index&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;index.php&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;fastcgi.conf&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;pathinfo.conf&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;搞定，终于可以愉快的写博客了。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>openvpn 折腾记</title>
      <link>https://zhaowang.me/archives/27/</link>
      <pubDate>Thu, 12 May 2016 21:54:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/27/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;自己平时用的vps，一直使用的是centos，可是后来自从用了ubuntu以后，发现ubuntu很简单，而且对于自己这个半吊子来说，ubuntu很好用。&lt;/p&gt;
&lt;p&gt;于是把vps重装了个ubuntu的发行版，而后以前所用的openvpn就不能用了。&lt;/p&gt;
&lt;p&gt;按照以前教程，使用的ufw防火墙，然后配置使用，折腾了半天，也没弄好。&lt;/p&gt;
&lt;p&gt;于是google了一番，发现一个国外大神做了一个自动安装的脚本，哇哈哈，看了一下代码，知道自己的iptables没有设置转发，而ufw貌似设置了，没管用。对于半吊子的我来说，能用就足够了。&lt;/p&gt;
&lt;p&gt;附上脚本地址。https://github.com/Nyr/openvpn-install/&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>欺骗你的进度条</title>
      <link>https://zhaowang.me/archives/20/</link>
      <pubDate>Mon, 15 Feb 2016 10:50:53 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/20/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;打开极品飞车，然后显示更新，出现一个进度条，进度条一共是80m，显示已经下载了70m，还有10m正在走进度条。我为此特意去看了下使用流量，果然就是走了10m。&lt;/p&gt;
&lt;p&gt;同样的还有google play store更新app的时候，比如说显示一共是25m，下载到10m就开始安装了，不明白这个25m难道是全量包，下载的10m是增量更新吗？亦或这是压缩算法所致？25m的压缩到10m，然后解压更新，亦或也是如同极品飞车的逻辑，逗你玩，欺骗你呢。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>利用hosts走向世界</title>
      <link>https://zhaowang.me/archives/6/</link>
      <pubDate>Wed, 30 Sep 2015 11:16:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/6/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;这肯定是老生常谈了，至于为什么发个这个，因为我的伪技术分类下没有文章，所以就随便写一篇凑数。&lt;/p&gt;
&lt;p&gt;=================================&lt;/p&gt;
&lt;p&gt;hosts文件，其实就是起到域名转换作用，正常情况下，计算机器是通过ip地址通讯的，显然人脑比较笨，记不住ip地址，所以有了一个转换，也就是有了域名，人们输入域名，然后需要去dns提供商查询下该域名所对应的ip地址，然后计算机继续通过ip地址通讯。&lt;/p&gt;
&lt;p&gt;替换系统的hosts文件后，省去dns查询，直接给了计算机ip地址，省去了去查dns，dns就给不了你不能用的ip，你也能上网了。&lt;/p&gt;
&lt;p&gt;以上，科普不一定对，反正我也不知道。&lt;/p&gt;
&lt;p&gt;=================================&lt;/p&gt;
&lt;p&gt;linux和os x下，替换 /etc/hosts 文件，记得不要把 localhost 127.0.0.1 给删了&lt;/p&gt;
&lt;p&gt;windows下，替换 /windows/system32/drivers/hosts 文件。&lt;/p&gt;
&lt;p&gt;至于其他设备，详见 &lt;a href=&#34;https://en.wikipedia.org/wiki/Hosts_(file)&#34;&gt;https://en.wikipedia.org/wiki/Hosts_(file)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;=================================&lt;/p&gt;
&lt;p&gt;福利：hosts文件 
百度盘：http://pan.baidu.com/s/1bnyQXLP&lt;/p&gt;

        
        </description>
    </item>
    
  </channel>
</rss>