<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>不落虚`blog</title>
  
  <subtitle>do what you like</subtitle>
  <link href="http://riyuejuyjyj.github.io/atom.xml" rel="self"/>
  
  <link href="http://riyuejuyjyj.github.io/"/>
  <updated>2023-01-02T20:59:15.000Z</updated>
  <id>http://riyuejuyjyj.github.io/</id>
  
  <author>
    <name>不落虚</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>docker相关知识（1）</title>
    <link href="http://riyuejuyjyj.github.io/posts/7074a9e.html"/>
    <id>http://riyuejuyjyj.github.io/posts/7074a9e.html</id>
    <published>2023-01-02T20:59:14.000Z</published>
    <updated>2023-01-02T20:59:15.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="docker相关知识（1）"><a href="#docker相关知识（1）" class="headerlink" title="docker相关知识（1）"></a>docker相关知识（1）</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#获取镜像</span></span><br><span class="line"><span class="comment">#获取镜像，生成容器</span></span><br></pre></td></tr></table></figure><p>nginx web服务器，运行一个端口80的网站</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#在宿主机上</span></span><br><span class="line"><span class="comment">#1.开启服务器</span></span><br><span class="line"><span class="comment">#2.在服务器上安装好nginx所需依赖关系</span></span><br><span class="line"><span class="comment">#3.安装nginx yum install nginx -y</span></span><br><span class="line"><span class="comment">#4.修改nginx.conf配置文件</span></span><br><span class="line"><span class="comment">#5.启动nginx</span></span><br><span class="line"><span class="comment">#6.客户端去访问nginx</span></span><br><span class="line"><span class="comment">#比较耗时</span></span><br></pre></td></tr></table></figure><p>docker获取nginx镜像</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#获取镜像，从配置好的docker镜像站，拉取镜像</span></span><br><span class="line"><span class="comment">#先搜索以下镜像文件</span></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># docker search nginx</span></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># docker pull nginx:latest #默认最新</span></span><br></pre></td></tr></table></figure><p>docker查看镜像</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># docker rmi &quot;IMAGE ID&quot; #删除镜像</span></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># docker image ls</span></span><br></pre></td></tr></table></figure><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/photos/d67fd10ac27599f1832fe040667e7f09.png" alt="image"></p><p>docker运行镜像，创建出具体的容器，容器中跑着nginx的服务</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># docker run 参数 镜像的名字/id</span></span><br><span class="line"><span class="comment">#-d 后台运行容器</span></span><br><span class="line"><span class="comment"># -p 80:80 端口映射，宿主机端口：容器内端口 </span></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># docker run -d -p 80:80 nginx</span></span><br></pre></td></tr></table></figure><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/photos/c26bec8be2dc3f96e7f7c2c234e53697.png" alt="image"></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># netstat -tunlp #查看端口运行情况</span></span><br><span class="line"> </span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  </span><br><span class="line">tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2046/sshd         </span><br><span class="line">tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1074/master       </span><br><span class="line">tcp6       0      0 :::22                   :::*                    LISTEN      2046/sshd         </span><br><span class="line">tcp6       0      0 ::1:25                  :::*                    LISTEN      1074/master       </span><br><span class="line">udp        0      0 127.0.0.1:323           0.0.0.0:*                           524/chronyd       </span><br><span class="line">udp        0      0 0.0.0.0:68              0.0.0.0:*                           619/dhclient      </span><br><span class="line">udp6       0      0 ::1:323                 :::*                                524/chronyd   </span><br></pre></td></tr></table></figure><p>可以看到此时端口80并没有被占用</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># docker run -d -p 80:80 nginx </span></span><br><span class="line">4d45bbd3e057aa39d1fd6b9437807e3cd26432f27219999ac9163b29ce9b2d65 <span class="comment">#容器id</span></span><br><span class="line"></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># netstat -tunlp</span></span><br><span class="line"></span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  </span><br><span class="line">tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      18747/docker-proxy  </span><br><span class="line">tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2046/sshd         </span><br><span class="line">tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1074/master       </span><br><span class="line">tcp6       0      0 :::80                   :::*                    LISTEN      18753/docker-proxy  </span><br><span class="line">tcp6       0      0 :::22                   :::*                    LISTEN      2046/sshd         </span><br><span class="line">tcp6       0      0 ::1:25                  :::*                    LISTEN      1074/master       </span><br><span class="line">udp        0      0 127.0.0.1:323           0.0.0.0:*                           524/chronyd       </span><br><span class="line">udp        0      0 0.0.0.0:68              0.0.0.0:*                           619/dhclient      </span><br><span class="line">udp6       0      0 ::1:323                 :::*                                524/chronyd  </span><br></pre></td></tr></table></figure><p>此时可以看到已经有了</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># docker ps -a </span></span><br><span class="line"></span><br><span class="line">CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES</span><br><span class="line">4d45bbd3e057   nginx     <span class="string">&quot;/docker-entrypoint.…&quot;</span>   4 minutes ago   Up 4 minutes   0.0.0.0:80-&gt;80/tcp, :::80-&gt;80/tcp   stupefied_mclean</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这时访问服务器公网地址:80 就有welcome nginx</p><p>停止容器docker stop 容器id</p><p>开始容器docker restart 容器id</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root@ecs-402020 ~]<span class="comment"># docker stop 4d45bbd3e057 </span></span><br><span class="line">[root@ecs-402020 ~]<span class="comment"># docker restart  4d45bbd3e057 </span></span><br></pre></td></tr></table></figure><h2 id="docker生命周期"><a href="#docker生命周期" class="headerlink" title="docker生命周期"></a>docker生命周期</h2><p>dockerfile：一个构建docker image的脚本</p><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/photos/43c055b21e7dda50f7a69bc1266283e2.png" alt="image"></p><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/photos/e267b9e72cbdff5be819a1129c8c0c75.png" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;docker相关知识（1）&quot;&gt;&lt;a href=&quot;#docker相关知识（1）&quot; class=&quot;headerlink&quot; title=&quot;docker相关知识（1）&quot;&gt;&lt;/a&gt;docker相关知识（1）&lt;/h2&gt;&lt;figure class=&quot;highlight bash</summary>
      
    
    
    
    <category term="docker" scheme="http://riyuejuyjyj.github.io/categories/docker/"/>
    
    
    <category term="docker" scheme="http://riyuejuyjyj.github.io/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>day01懂了VMware/KVM/Docker原来是这么回事儿</title>
    <link href="http://riyuejuyjyj.github.io/posts/76ec598e.html"/>
    <id>http://riyuejuyjyj.github.io/posts/76ec598e.html</id>
    <published>2023-01-01T19:43:50.000Z</published>
    <updated>2023-01-01T19:55:06.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="day01-懂了！VMware-x2F-KVM-x2F-Docker原来是这么回事儿"><a href="#day01-懂了！VMware-x2F-KVM-x2F-Docker原来是这么回事儿" class="headerlink" title="day01 懂了！VMware&#x2F;KVM&#x2F;Docker原来是这么回事儿"></a>day01 懂了！VMware&#x2F;KVM&#x2F;Docker原来是这么回事儿</h1><h2 id="linux部署形式"><a href="#linux部署形式" class="headerlink" title="linux部署形式"></a>linux部署形式</h2><p>vmware虚拟机+centos&#x3D;得到一个可以使用的linux系统<br>如上的大前提，是得有个宿主机</p><p>lnmp集群部署<br>mysql集群部署<br>zabbix监控系统</p><p>之前都是在自己安装的Linux机器上，进行部署</p><ul><li>安装</li><li>修改配置文件</li><li>启动</li><li>适用各种功能</li></ul><p>引出为什么使用docker</p><p>物理服务器：真实购买的一台硬件机器</p><ul><li>部署非常慢</li><li>成本非常高</li><li>资源浪费</li><li>难于迁移和扩展</li><li>可能会被限定硬件厂商</li></ul><p>后来一台物理机可以通过vmware虚拟化安装多个操作系统，每一个应用独立运行在一个vm（cpu必须支持虚拟化技术）<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/b846e9072eb1cac0df8cb44a021d15bb.png" alt="image.png"><br>但是虚拟化也是有局限性的，每一个虚拟机都是一个完整的操作系统，要分配系统资源，虚拟机多道一定程度时，操作系统本身资源也就消耗殆尽，或者说必须扩容</p><h2 id="虚拟化技术"><a href="#虚拟化技术" class="headerlink" title="虚拟化技术"></a>虚拟化技术</h2><p>什么是虚拟化技术？<br>维基百科中的解释是这样的：</p><blockquote><p>虚拟化（技术）是一种资源管理技术，是将计算机的各种实体资源（CPU、内存、磁盘空间、网络适配器等），予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。</p></blockquote><p>对于一台计算机，我们可以简单的划分为三层：从下到上依次是物理硬件层，操作系统层、应用程序层<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/051facf8d222b54dd293866cd1413242.png" alt="image.png"><br>1974年，两位计算机科学家Gerald Popek 和 Robert Goldberg发表了一篇重要的论文《虚拟化第三代体系结构的正式要求》，在这篇论文中提出了虚拟化的三个基本条件：</p><ul><li>等价性：程序在本地计算机执行和在虚拟机中执行应该表现出一样的结果（不包括执行时间的差异）</li><li>安全性：虚拟机彼此隔离，与宿主计算机隔离</li><li>性能：绝大多数情况下虚拟机中的代码指令应该直接在物理CPU中执行，少部分特殊指令可由VMM参与。</li></ul><p>那如何实现对计算机底层的物理资源的虚拟化分割呢？在计算机技术的发展历史上，出现了两种著名的方案，分别是I型虚拟化和II型虚拟化</p><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/f9eafa1387ed2fc4cd4a5e8d6b335ab9.png" alt="image.png"><br>::: hljs-center</p><p>I型虚拟化</p><p>:::</p><p><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/c3a60ad6ad746e98df66001a01f210d5.png" alt="image.png"><br>::: hljs-center</p><p>II型虚拟化</p><p>:::</p><p>图中的VMM意为Virtual Machine Monitor，虚拟机监控程序，或者用另一个更专业的名词：HyperVisor<br>从图中可以清楚的看到两种虚拟化方案的区别：<br>Type I: 直接凌驾于硬件之上，构建出多个隔离的操作系统环境<br>Type II: 依赖于宿主操作系统，在其上构建出多个隔离的操作系统环境<br>我们熟知的VMware事实上有两个产品线，一个是VMware ESXi，直接安装在裸金属之上，不需要额外的操作系统，属于第一类虚拟化。另一个是我们普通用户更加熟知的VMware WorkStation，属于第二类虚拟化。<br>如何实现上述的虚拟化方案呢？<br>一个典型的做法是——陷阱 &amp; 模拟技术<br>什么意思？简单来说就是正常情况下直接把虚拟机中的代码指令放到物理的CPU上去执行，一旦执行到一些敏感指令，就触发异常，控制流程交给VMM，由VMM来进行对应的处理，以此来营造出一个虚拟的计算机环境。<br>不过这一经典的虚拟化方案在Intel x86架构上却遇到了问题。</p><p>虚拟机工具巨头</p><ul><li>vmware workstation (个人学习使用)，主要用于win，创建虚拟机（安装系统）</li><li>企业版虚拟化 VMware esxi虚拟化技术，高性能服务器结合进行服务器资源虚拟化</li><li>linux下的虚拟机工具，kvm工具</li></ul><h2 id="全虚拟化：VMware-二进制翻译技术"><a href="#全虚拟化：VMware-二进制翻译技术" class="headerlink" title="全虚拟化：VMware 二进制翻译技术"></a>全虚拟化：VMware 二进制翻译技术</h2><p>不同于8086时代16位实地址工作模式，x86架构进入32位时代后，引入了保护模式、虚拟内存等一系列新的技术。同时为了安全性隔离了应用程序代码和操作系统代码，其实现方式依赖于x86处理器的工作状态。<br>这就是众所周知的x86处理器的Ring0-Ring3四个“环”。<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/25fe8aa2bf397ff77794282da4fd56ff.png" alt="image.png"><br>操作系统内核代码运行在最高权限的Ring0状态，应用程序工作于最外围权限最低的Ring3状态，剩下的Ring1和Ring2主流的操作系统都基本上没有使用。<br>这里所说的权限，有两个层面的约束：</p><p>能访问的内存空间<br>能执行的特权指令<br>来关注一下第二点，特权指令。<br>CPU指令集中有一些特殊的指令，用于进行硬件I&#x2F;O通信、内存管理、中断管理等等功能，这一些指令只能在Ring0状态下执行，被称为特权指令。这些操作显然是不能让应用程序随便执行的。处于Ring3工作状态的应用程序如果尝试执行这些指令，CPU将自动检测到并抛出异常。<br>回到我们的主题虚拟化技术上面来，如同前面的定义所言，虚拟化是将计算资源进行逻辑或物理层面的切割划分，构建出一个个独立的执行环境。<br>按照我们前面所说的陷阱 &amp; 模拟手段，可以让虚拟机中包含操作系统在内的程序统一运行在低权限的Ring3状态下，一旦虚拟机中的操作系统进行内存管理、I&#x2F;O通信、中断等操作时，执行特权指令，从而触发异常，物理机将异常派遣给VMM，由VMM进行对应的模拟执行。<br>这本来是一个实现虚拟化很理想的模式，不过x86架构的CPU在这里遇到了一个跨不过去的坎。<br>到底是什么问题呢？<br>回顾一下前面描绘的理想模式，要这种模式能够实现的前提是执行敏感指令的时候能够触发异常，让VMM有机会介入，去模拟一个虚拟的环境出来。<br>但现实是，x86架构的CPU指令集中有那么一部分指令，它不是特权指令，Ring3状态下也能够执行，但这些指令对于虚拟机来说却是敏感的，不能让它们直接执行。一旦执行，没法触发异常，VMM也就无法介入，虚拟机就露馅儿了！<br>这结果将导致虚拟机中的代码指令出现无法预知的错误，更严重的是影响到真实物理计算机的运行，虚拟化所谓的安全隔离、等价性也就无从谈起。<br>怎么解决这个问题，让x86架构CPU也能支持虚拟化呢？<br>VMware和QEMU走出了两条不同的路。<br>VMware创造性的提出了一个二进制翻译技术。VMM在虚拟机操作系统和宿主计算机之间扮演一个桥梁的角色，将虚拟机中的要执行的指令“翻译”成恰当的指令在宿主物理计算机上执行，以此来模拟执行虚拟机中的程序。你可以简单理解成Java虚拟机执行Java字节码的过程，不同的是Java虚拟机执行的是字节码，而VMM模拟执行的就是CPU指令。<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/68144e45037e8f04e67d76082c00e33f.png" alt="image.png"><br>另外值得一提的是，为了提高性能，也并非所有的指令都是模拟执行的，VMware在这里做了不少的优化，对一些“安全”的指令，就让它直接执行也未尝不可。所以VMware的二进制翻译技术也融合了部分的直接执行。<br>对于虚拟机中的操作系统，VMM需要完整模拟底层的硬件设备，包括处理器、内存、时钟、I&#x2F;O设备、中断等等，换句话说，VMM用纯软件的形式“模拟”出一台计算机供虚拟机中的操作系统使用。<br>这种完全模拟一台计算机的技术也称为全虚拟化，这样做的好处显而易见，虚拟机中的操作系统感知不到自己是在虚拟机中，代码无需任何改动，直接可以安装。而缺点也是可以想象：完全用软件模拟，转换翻译执行，性能堪忧！<br>而QEMU则是完全软件层面的“模拟”，乍一看和VMware好像差不多，不过实际本质是完全不同的。VMware是将原始CPU指令序列翻译成经过处理后的CPU指令序列来执行。而QEMU则是完全模拟执行整个CPU指令集，更像是“解释执行”，两者的性能不可同日而语。<img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/5325d3a183a2c0e70e56b787b9dd5afe.png" alt="image.png"></p><h2 id="半虚拟化：Xen-内核定制修改"><a href="#半虚拟化：Xen-内核定制修改" class="headerlink" title="半虚拟化：Xen 内核定制修改"></a>半虚拟化：Xen 内核定制修改</h2><p>既然有全虚拟化，那与之相对的也就有半虚拟化，前面说了，由于敏感指令的关系，全虚拟化的VMM需要捕获到这些指令并完整模拟执行这个过程，实现既满足虚拟机操作系统的需要，又不至于影响到物理计算机。<br>但说来简单，这个模拟过程实际上相当的复杂，涉及到大量底层技术，并且如此模拟费时费力。<br>而试想一下，如果把操作系统中所有执行敏感指令的地方都改掉，改成一个接口调用（HyperCall），接口的提供方VMM实现对应处理，省去了捕获和模拟硬件流程等一大段工作，性能将获得大幅度提升。<br>这就是半虚拟化，这项技术的代表就是Xen，一个诞生于2003年的开源项目。<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/f11e2d88b48845bc9f1fe35626f96b8b.png" alt="image.png"><br>这项技术一个最大的问题是：需要修改操作系统源码，做相应的适配工作。这对于像Linux这样的开源软件还能接受，充其量多了些工作量罢了。但对于Windows这样闭源的商业操作系统，修改它的代码，无异于痴人说梦。</p><h2 id="硬件辅助虚拟化-VT-x2F-AMD-v"><a href="#硬件辅助虚拟化-VT-x2F-AMD-v" class="headerlink" title="硬件辅助虚拟化 VT &#x2F; AMD-v"></a>硬件辅助虚拟化 VT &#x2F; AMD-v</h2><p>折腾来折腾去，全都是因为x86架构的CPU天然不支持经典虚拟化模式，软件厂商不得不想出其他各种办法来在x86上实现虚拟化。<br>如果进一步讲，CPU本身增加对虚拟化的支持，那又会是一番怎样的情况呢？<br>在软件厂商使出浑身解数来实现x86平台的虚拟化后的不久，各家处理器厂商也看到了虚拟化技术的广阔市场，纷纷推出了硬件层面上的虚拟化支持，正式助推了虚拟化技术的迅猛发展。<br>这其中为代表的就是Intel的VT系列技术和AMD的AMD-v系列技术。<br>硬件辅助虚拟化细节较为复杂，简单来说，新一代CPU在原先的Ring0-Ring3四种工作状态之下，再引入了一个叫工作模式的概念，有VMX root operation和VMX non-root operation两种模式，每种模式都具有完整的Ring0-Ring3四种工作状态，前者是VMM运行的模式，后者是虚拟机中的OS运行的模式。<br>VMM运行的层次，有些地方将其称为Ring -1，VMM可以通过CPU提供的编程接口，配置对哪些指令的劫持和捕获，从而实现对虚拟机操作系统的掌控。<img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/d1740abb386cfaee4b02949f914e0b82.png" alt="image.png"><br>换句话说，原先的VMM为了能够掌控虚拟机中代码的执行，不得已采用“中间人”来进行翻译执行，现在新的CPU告诉VMM：不用那么麻烦了，你提前告诉我你对哪些指令哪些事件感兴趣，我在执行这些指令和发生这些事件的时候就通知你，你就可以实现掌控了。完全由硬件层面提供支持，性能自然高了不少。<br>上面只是硬件辅助虚拟化技术的一个简单理解，实际上还包含更多的要素，提供了更多的便利给VMM，包括内存的虚拟、I&#x2F;O的虚拟等等，让VMM的设计开发工作大大的简化，VMM不再需要付出昂贵的模拟执行成本，整体虚拟化的性能也有了大幅度的提升。<br>VMware从5.5版本开始引入对硬件辅助虚拟化的支持，随后在2011年的8.0版本中正式全面支持。于是乎，我们在创建虚拟机的时候，可以选择要使用哪一种虚拟化引擎技术，是用原先的二进制翻译执行，还是基于硬件辅助虚拟化的新型技术。<img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/03a494d570cd7a1407938d5fb11b6b79.png" alt="image.png"><br>同一时期的XEN从3.0版本也加入对硬件辅助虚拟化的支持，从此基于XEN的虚拟机中也能够运行Windows系统了。</p><h2 id="KVM-QEMU"><a href="#KVM-QEMU" class="headerlink" title="KVM-QEMU"></a>KVM-QEMU</h2><p>有了硬件辅助虚拟化的加持，虚拟化技术开始呈现井喷之势。VirtualBox、Hyper-V、KVM等技术如雨后春笋般接连面世。这其中在云计算领域声名鹊起的当属开源的KVM技术了。<br>KVM全称for Kernel-based Virtual Machine，意为基于内核的虚拟机。<br>在虚拟化底层技术上，KVM和VMware后续版本一样，都是基于硬件辅助虚拟化实现。不同的是VMware作为独立的第三方软件可以安装在Linux、Windows、MacOS等多种不同的操作系统之上，而KVM作为一项虚拟化技术已经集成到Linux内核之中，可以认为Linux内核本身就是一个HyperVisor，这也是KVM名字的含义，因此该技术只能在Linux服务器上使用。<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/47bf233f2caf5239825d712f59e80594.png" alt="image.png"><br>KVM技术常常搭配QEMU一起使用，称为KVM-QEMU架构。前面提到，在x86架构CPU的硬件辅助虚拟化技术诞生之前，QEMU就已经采用全套软件模拟的办法来实现虚拟化，只不过这种方案下的执行性能非常低下。<br>KVM本身基于硬件辅助虚拟化，仅仅实现CPU和内存的虚拟化，但一台计算机不仅仅有CPU和内存，还需要各种各样的I&#x2F;O设备，不过KVM不负责这些。这个时候，QEMU就和KVM搭上了线，经过改造后的QEMU，负责外部设备的虚拟，KVM负责底层执行引擎和内存的虚拟，两者彼此互补，成为新一代云计算虚拟化方案的宠儿。</p><h2 id="容器技术-LXC-amp-Docker"><a href="#容器技术-LXC-amp-Docker" class="headerlink" title="容器技术-LXC &amp; Docker"></a>容器技术-LXC &amp; Docker</h2><p>前面谈到的无论是基于翻译和模拟的全虚拟化技术、半虚拟化技术，还是有了CPU硬件加持下的全虚拟化技术，其虚拟化的目标都是一台完整的计算机，拥有底层的物理硬件、操作系统和应用程序执行的完整环境。<br>为了让虚拟机中的程序实现像在真实物理机器上运行“近似”的效果，背后的HyperVisor做了大量的工作，付出了“沉重”的代价。<br>虽然HyperVisor做了这么多，但你有没有问过虚拟机中的程序，这是它想要的吗？或许HyperVisor给的太多，而目标程序却说了一句：你其实可以不用这样辛苦。<br>确实存在这样的情况，虚拟机中的程序说：我只是想要一个单独的执行执行环境，不需要你费那么大劲去虚拟出一个完整的计算机来。<br>这样做的好处是什么？<br>虚拟出一台计算机的成本高还是只虚拟出一个隔离的程序运行环境的成本高？答案很明显是前者。一台物理机可能同时虚拟出10台虚拟机就已经开始感到乏力了，但同时虚拟出100个虚拟的执行环境却还是能够从容应对，这对于资源的充分利用可是有巨大的好处。<br>近几年大火的容器技术正是在这样的指导思想下诞生的。<img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/269a37d70fffc6e197313f026c7a9203.png" alt="image.png"><br>不同于虚拟化技术要完整虚拟化一台计算机，容器技术更像是操作系统层面的虚拟化，它只需要虚拟出一个操作系统环境。<br>LXC技术就是这种方案的一个典型代表，全称是LinuX Container，通过Linux内核的Cgroups技术和namespace技术的支撑，隔离操作系统文件、网络等资源，在原生操作系统上隔离出一个单独的空间，将应用程序置于其中运行，这个空间的形态上类似于一个容器将应用程序包含在其中，故取名容器技术。<br>举个不是太恰当的比喻，一套原来是三居室的房子，被二房东拿来改造成三个一居室的套间，每个一居室套间里面都配备了卫生间和厨房，对于住在里面的人来说就是一套完整的住房。<br>如今各个大厂火爆的Docker技术底层原理与LXC并不本质区别，甚至在早期Docker就是直接基于LXC的高层次封装。Docker在LXC的基础上更进一步，将执行执行环境中的各个组件和依赖打包封装成独立的对象，更便于移植和部署。<br><img src="http://myblogzt.oss-cn-hangzhou.aliyuncs.com/articles/dffc335a1b37b2a65bf8f3d8cfc4a36e.png" alt="image.png"><br>容器技术的好处是轻量，所有隔离空间的程序代码指令不需要翻译转换，就可以直接在CPU上执行，大家底层都是同一个操作系统，通过软件层面上的逻辑隔离形成一个个单独的空间。<br>容器技术的缺点是安全性不如虚拟化技术高，毕竟软件层面的隔离比起硬件层面的隔离要弱得多。隔离环境系统和外面的主机共用的是同一个操作系统内核，一旦利用内核漏洞发起攻击，程序突破容器限制，实现逃逸，危及宿主计算机，安全也就不复存在。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;day01-懂了！VMware-x2F-KVM-x2F-Docker原来是这么回事儿&quot;&gt;&lt;a href=&quot;#day01-懂了！VMware-x2F-KVM-x2F-Docker原来是这么回事儿&quot; class=&quot;headerlink&quot; title=&quot;day01 懂了</summary>
      
    
    
    
    <category term="docker&amp;k8s" scheme="http://riyuejuyjyj.github.io/categories/docker-k8s/"/>
    
    
    <category term="docker" scheme="http://riyuejuyjyj.github.io/tags/docker/"/>
    
    <category term="k8s" scheme="http://riyuejuyjyj.github.io/tags/k8s/"/>
    
  </entry>
  
  <entry>
    <title>Go-09结构体</title>
    <link href="http://riyuejuyjyj.github.io/posts/b72373e2.html"/>
    <id>http://riyuejuyjyj.github.io/posts/b72373e2.html</id>
    <published>2022-12-13T21:54:01.000Z</published>
    <updated>2022-12-14T19:13:41.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Go-09结构体"><a href="#Go-09结构体" class="headerlink" title="Go-09结构体"></a>Go-09结构体</h1><h2 id="结构体的定义"><a href="#结构体的定义" class="headerlink" title="结构体的定义"></a>结构体的定义</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Person <span class="keyword">struct</span>&#123;</span><br><span class="line">   Name <span class="type">string</span></span><br><span class="line">   Age  <span class="type">int</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">   <span class="keyword">var</span> p1 Person </span><br><span class="line">   p1.Name=<span class="string">&quot;张三&quot;</span></span><br><span class="line">   p1.Age=<span class="number">18</span></span><br><span class="line">   fmt.Printf(<span class="string">&quot;%#v&quot;</span>,p1)</span><br><span class="line"></span><br><span class="line">   p2:=Person&#123;</span><br><span class="line">    Name:<span class="string">&quot;李四&quot;</span>，</span><br><span class="line">    Age:<span class="number">20</span>,</span><br><span class="line">   &#125;</span><br><span class="line">   fmt.Printf(<span class="string">&quot;%#v&quot;</span>,p2)</span><br><span class="line"></span><br><span class="line">   p3:=<span class="built_in">new</span>(Person)</span><br><span class="line">   p3.Name=<span class="string">&quot;王五&quot;</span></span><br><span class="line">   p3.Age=<span class="number">20</span></span><br><span class="line">   fmt.Printf(<span class="string">&quot;%#v&quot;</span>,p3)</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>从上面来看定义还是十分的简单的在此说明一下结构体名大写表示允许外部访问，变量名大小表示公有变量.</p><h2 id="结构体定义方法"><a href="#结构体定义方法" class="headerlink" title="结构体定义方法"></a>结构体定义方法</h2><h3 id="自定义方法"><a href="#自定义方法" class="headerlink" title="自定义方法"></a>自定义方法</h3><h3 id="继承父类方法和属性"><a href="#继承父类方法和属性" class="headerlink" title="继承父类方法和属性"></a>继承父类方法和属性</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Father <span class="keyword">struct</span>&#123;</span><br><span class="line">    FirstName <span class="type">string</span></span><br><span class="line">    LastName  <span class="type">string</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span><span class="params">(father Father)</span></span> Print()&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;your father&#x27;s name is:%v $v&quot;</span>,father.FirstName,father.LastName)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">type</span> Son <span class="keyword">struct</span>&#123;</span><br><span class="line">    FirstName <span class="type">string</span></span><br><span class="line">    Father <span class="comment">//结构体继承</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span><span class="params">(son Son)</span></span> Print()&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;your name is:%v $v&quot;</span>,son.FirstName,son.LastName)</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> son1 = Son&#123;</span><br><span class="line">      FirstName:<span class="string">&quot;Jack&quot;</span>,</span><br><span class="line">      Father: Father&#123;</span><br><span class="line">        FirstName:<span class="string">&quot;Sam&quot;</span>  </span><br><span class="line">        LastName:<span class="string">&quot;Smith&quot;</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">   son1.Print()</span><br><span class="line">   son1.Father.Print()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>比较好懂在此不再解释</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Go-09结构体&quot;&gt;&lt;a href=&quot;#Go-09结构体&quot; class=&quot;headerlink&quot; title=&quot;Go-09结构体&quot;&gt;&lt;/a&gt;Go-09结构体&lt;/h1&gt;&lt;h2 id=&quot;结构体的定义&quot;&gt;&lt;a href=&quot;#结构体的定义&quot; class=&quot;headerli</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>witch on the holy night</title>
    <link href="http://riyuejuyjyj.github.io/posts/b1397760.html"/>
    <id>http://riyuejuyjyj.github.io/posts/b1397760.html</id>
    <published>2022-12-11T22:56:40.000Z</published>
    <updated>2022-12-12T08:17:35.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近今天有点摆烂明明大三了却还是如此任性。当然自认为也没有浪费这一段时间吧，我再次重温了魔法使之夜。</p><p>魔法使之夜是一部Type-Moon的一部视觉小说，我是1几年的作品了吧， 我第一次接触是在大二这一段时间，跨越近十年的作品当时带给我的感动，让人难以述说。</p><p>在此之前我想说的是我并不是一个严格的月厨，对于一些游戏设定我也不甚了解,但就算这样那有如何呢？透过蘑菇细腻的文字配上深泽秀行悠远宁静的音乐，出色的战斗演示，为我们上演了魔法的奇迹，那一晚的感动</p><p>故事发生在一个正在现代化小镇上，城市的发展与乡村的保留的这一环境下总是会给人一种悲伤的感觉。故事的内核上也算是boy meets girl吧。</p><p>突然打不出字了，唉，千万思绪卡在胸中。</p><p>我不知道何事能再次回到那座洋房里静静听着蘑菇讲着属于他们三人的故事，或许第二部是我已工作了吧，但我依然相信我回到那里，继续听着这一段故事，就算是一个人也要好好的过啊。</p><p>封面让我好好想一下</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近今天有点摆烂明明大三了却还是如此任性。当然自认为也没有浪费这一段时间吧，我再次重温了魔法使之夜。&lt;/p&gt;
&lt;p&gt;魔法使之夜是一部Type-Moon的一部视觉小说，我是1几年的作品了吧， 我第一次接触是在大二这一段时间，跨越近十年的作品当时带给我的感动，让人难以述说。&lt;/</summary>
      
    
    
    
    <category term="Games" scheme="http://riyuejuyjyj.github.io/categories/Games/"/>
    
    
    <category term="Games" scheme="http://riyuejuyjyj.github.io/tags/Games/"/>
    
  </entry>
  
  <entry>
    <title>08time</title>
    <link href="http://riyuejuyjyj.github.io/posts/6a391210.html"/>
    <id>http://riyuejuyjyj.github.io/posts/6a391210.html</id>
    <published>2022-12-03T09:51:18.000Z</published>
    <updated>2022-12-11T09:49:54.000Z</updated>
    
    <content type="html"><![CDATA[<p>先讲一个冷知识go语言诞生的日期是2006年1月2号15点4分5秒</p><h3 id="time-Now"><a href="#time-Now" class="headerlink" title="time.Now()"></a>time.Now()</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span>(</span><br><span class="line">   <span class="string">&quot;fmt&quot;</span></span><br><span class="line">)</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span></span>&#123;</span><br><span class="line">   timeobj:=time.Now()</span><br><span class="line">   fmt.Println(timeobj)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>2022-12-03 09:57:30.4484774 +0800 CST m&#x3D;+0.003</p><p>这便是打印出的结果，看着是很不习惯的，于是我们将其格式化输出看看</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">fmt.Println(timeobj.Format(<span class="string">&quot;2006-01-02-03-04-05&quot;</span>))</span><br><span class="line">fmt.Println(timeobj.Format(<span class="string">&quot;2006-01-02-15-04-05&quot;</span>))</span><br></pre></td></tr></table></figure><p>不知大家是否发现这个格式化的时间与go诞生的时间是一样的，第一种代表12小时制，第二种代表24小时制<br>其结果分别是：<br>2022-12-03 10:01:56<br>2022-12-03 10:01:56<br>因为现在还是早上，并不能看出区别</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="built_in">println</span>(timeObj.Year())</span><br><span class="line"><span class="built_in">println</span>(timeObj.Month())</span><br><span class="line"><span class="built_in">println</span>(timeObj.Day())</span><br><span class="line"><span class="built_in">println</span>(timeObj.Hour())</span><br><span class="line"><span class="built_in">println</span>(timeObj.Minute())</span><br><span class="line"><span class="built_in">println</span>(timeObj.Second())</span><br></pre></td></tr></table></figure><p>这些相信大家能轻松看懂的吧，在此不再赘述。</p><h3 id="timeobj-Unix"><a href="#timeobj-Unix" class="headerlink" title="timeobj.Unix()"></a>timeobj.Unix()</h3><p>在Go语言中，时间包提供了确定和查看时间的函数。 Go语言中的Unix()函数用于产生本地时间，该时间与UTC中自1970年1月1日起的Unix时间有关。</p><p>其实很好理解通过该函数获取到我们到1970年1月1日的秒数</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  timeObj := time.Now()</span><br><span class="line">  unixTime := timeObj.Unix()</span><br><span class="line">  fmt.Println(unixTime)                                              </span><br><span class="line">  fmt.Println(time.Unix(unixTime, <span class="number">0</span>).Format(<span class="string">&quot;2006-01-02 03:04:05&quot;</span>)) <span class="comment">//戳转time</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>结果便是</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="comment">//1670033347</span></span><br><span class="line"><span class="comment">//2022-12-03 10:09:07</span></span><br></pre></td></tr></table></figure><h3 id="time里中的常量"><a href="#time里中的常量" class="headerlink" title="time里中的常量"></a>time里中的常量</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  fmt.Println(time.Millisecond) <span class="comment">//毫秒</span></span><br><span class="line">  fmt.Println(time.Second)      <span class="comment">//秒</span></span><br><span class="line">  fmt.Println(time.Minute)      <span class="comment">//分</span></span><br><span class="line">  fmt.Println(time.Hour)        <span class="comment">//小时</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> timeObj = time.Now()</span><br><span class="line">  fmt.Println(timeObj) <span class="comment">//</span></span><br><span class="line">  timeObj = timeObj.Add(time.Hour)<span class="comment">//增加一小时</span></span><br><span class="line">  fmt.Println(timeObj) <span class="comment">//</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>很好理解doge</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="comment">//1ms</span></span><br><span class="line"><span class="comment">//1s</span></span><br><span class="line"><span class="comment">//1m0s</span></span><br><span class="line"><span class="comment">//1h0m0s</span></span><br><span class="line"><span class="comment">//2022-12-03 10:12:03.1304458 +0800 CST m=+0.004897501</span></span><br><span class="line"><span class="comment">//2022-12-03 11:12:03.1304458 +0800 CST m=+3600.004897501</span></span><br></pre></td></tr></table></figure><h3 id="time中的计时器"><a href="#time中的计时器" class="headerlink" title="time中的计时器"></a>time中的计时器</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">ticker=time.Newicker(time.Second)</span><br></pre></td></tr></table></figure><p>这样我们就建立了一个每一秒钟的计时器，接着我们使用它</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">n:=<span class="number">5</span></span><br><span class="line"><span class="keyword">for</span> t:= <span class="keyword">range</span> ticker.C&#123;</span><br><span class="line">     fmt.Println(t)</span><br><span class="line">     n--</span><br><span class="line">     <span class="keyword">if</span> n==<span class="number">0</span>&#123;</span><br><span class="line">        ticker.Stop()</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">  &#125;   </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>stop和break缺一不可。<br><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-12-03%20102050.jfif" alt="image"></p><p>然后就是还有一个time.Sleep的函数</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">time.Sleep(time.Second)</span><br></pre></td></tr></table></figure><p>休眠一秒</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;先讲一个冷知识go语言诞生的日期是2006年1月2号15点4分5秒&lt;/p&gt;
&lt;h3 id=&quot;time-Now&quot;&gt;&lt;a href=&quot;#time-Now&quot; class=&quot;headerlink&quot; title=&quot;time.Now()&quot;&gt;&lt;/a&gt;time.Now()&lt;/h3&gt;&lt;fig</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>阳光正好</title>
    <link href="http://riyuejuyjyj.github.io/posts/a9520.html"/>
    <id>http://riyuejuyjyj.github.io/posts/a9520.html</id>
    <published>2022-12-02T20:37:49.000Z</published>
    <updated>2022-12-02T20:40:15.000Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 夏至</span><br><span class="line">&gt;一生的时间很短</span><br><span class="line"> 短到不过是两颗新之间的距离</span><br><span class="line"></span><br><span class="line">&#123;% tip %&#125;default&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# 夏至&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;gt;一生的时间很短&lt;/span&gt;</summary>
      
    
    
    
    <category term="生活" scheme="http://riyuejuyjyj.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="生活" scheme="http://riyuejuyjyj.github.io/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>07panic recover 监听异常</title>
    <link href="http://riyuejuyjyj.github.io/posts/10bb64ab.html"/>
    <id>http://riyuejuyjyj.github.io/posts/10bb64ab.html</id>
    <published>2022-12-02T20:25:22.000Z</published>
    <updated>2022-12-11T09:49:29.000Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go语言不像python，java有try，cathch，所以我们需要手动抛出</span><br><span class="line">```go</span><br><span class="line">func fn1(a,b int) int&#123;</span><br><span class="line"> return a/b</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这是一个很经典的函数，我们都知道当除数为0时，肯定是除不了的，我们此时调用</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">fn1(<span class="number">10</span>,<span class="number">0</span>)</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-12-01%20181603.jfif" alt="image"><br>我们便可以看到此时抛出了除数不为0的异常</p><h3 id="panic"><a href="#panic" class="headerlink" title="panic"></a>panic</h3><p>当然我们也可以手动的抛出</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fn1</span><span class="params">(a,b <span class="type">int</span>)</span></span> <span class="type">int</span>&#123;</span><br><span class="line"><span class="keyword">if</span> b==<span class="number">0</span>&#123;</span><br><span class="line">    <span class="built_in">panic</span>(<span class="string">&quot;runtime error: integer divide by zero&quot;</span>)</span><br><span class="line">   &#125;</span><br><span class="line"> <span class="keyword">return</span> a/b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在主函数内</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  fn1(<span class="number">10</span>,<span class="number">0</span>)</span><br><span class="line">  fmt.Println(<span class="string">&quot;10&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>此时的结果和上面的截图一样，程序抛出异常后就结束了导致我们后面的<br>fmt.Println(“10”)无法执行</p><h3 id="recover"><a href="#recover" class="headerlink" title="recover"></a>recover</h3><p>panic 可以在任何地方引发，但recover只有在defer调用的函数中有效,结合我们上一篇章的defer</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fn1</span><span class="params">(a,b <span class="type">int</span>)</span></span> <span class="type">int</span>&#123;</span><br><span class="line"><span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span>&#123;</span><br><span class="line">    err:=<span class="built_in">recover</span>()</span><br><span class="line">    <span class="keyword">if</span> err!=<span class="literal">nil</span>&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;error:%v\n&quot;</span>,err)</span><br><span class="line">    &#125;</span><br><span class="line">   &#125;()</span><br><span class="line"> <span class="keyword">return</span> a/b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在主函数内</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  fn1(<span class="number">10</span>,<span class="number">0</span>)</span><br><span class="line">  fmt.Println(f2(<span class="number">10</span>, <span class="number">1</span>)) </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样使用recover后我们后面的函数也能执行了<br><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-12-01%20182700.jfif" alt="image"></p><h3 id="recover-与panic结合使用"><a href="#recover-与panic结合使用" class="headerlink" title="recover 与panic结合使用"></a>recover 与panic结合使用</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">readFile</span><span class="params">(filename String)</span></span> <span class="type">error</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> filename==<span class="string">&quot;main.go&quot;</span>&#123;</span><br><span class="line">     <span class="keyword">return</span> <span class="literal">nil</span>  </span><br><span class="line">  &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">     <span class="keyword">return</span> errors.New(<span class="string">&quot;读取文件失败&quot;</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">myfn</span><span class="params">()</span></span>&#123;</span><br><span class="line">  <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span>&#123;</span><br><span class="line">    e:=<span class="built_in">recover</span>()</span><br><span class="line">    <span class="keyword">if</span> e!=<span class="literal">nil</span>&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;error:%v&quot;</span>,err)</span><br><span class="line">  &#125;</span><br><span class="line">  err:=readFile(<span class="string">&quot;xxx.go&quot;</span>)</span><br><span class="line">  <span class="keyword">if</span> err!=<span class="literal">nil</span>&#123;</span><br><span class="line">   <span class="built_in">panic</span>(err)</span><br><span class="line">  &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"> myfn()</span><br><span class="line"> fmt.Println(<span class="string">&quot;ok&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>结果便是error:读取文件失败 ok</p><p>执行的逻辑也很好理解<br>panic抛出这个异常，recover接受到这个异常，恢复并打印出错误</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;go语言不像python，java有try，cathch，所以我们需要手动抛出&lt;/span&gt;&lt;br&gt;&lt;s</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>06函数相关more</title>
    <link href="http://riyuejuyjyj.github.io/posts/f651be.html"/>
    <id>http://riyuejuyjyj.github.io/posts/f651be.html</id>
    <published>2022-12-02T20:14:41.000Z</published>
    <updated>2022-12-02T20:44:03.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="递归求1-100的和"><a href="#递归求1-100的和" class="headerlink" title="递归求1~100的和"></a>递归求1~100的和</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fn1</span><span class="params">(a <span class="type">int</span>)</span></span> <span class="type">int</span>&#123;</span><br><span class="line"><span class="keyword">if</span> a&gt;<span class="number">1</span>&#123; </span><br><span class="line">     <span class="keyword">return</span> a+fn1(a<span class="number">-1</span>)</span><br><span class="line">   &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">     <span class="keyword">return</span> <span class="number">1</span>  </span><br><span class="line">   &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="函数闭包"><a href="#函数闭包" class="headerlink" title="函数闭包"></a>函数闭包</h3><p>全局变量特点：</p><ul><li>1.常驻内存</li><li>2.污染内存</li></ul><p>局部变量特点：</p><ul><li>1.不常驻内存</li><li>2.不污染内存</li></ul><p>闭包：</p><ul><li>1.可以让一个变量常驻内存</li><li>2.可以让一个变量不污染全局</li></ul><p>闭包是指有权访问另一个函数作用域中的变量的函数，创建闭包的常见的方式就是在一个函数里创建另一个函数，通过另一个函数去访问<br>闭包过多影响程序性能</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fn2</span><span class="params">()</span></span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> <span class="type">int</span>&#123;</span><br><span class="line"><span class="keyword">var</span> a=<span class="number">10</span></span><br><span class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">func</span> <span class="title">fn2_1</span><span class="params">()</span></span> <span class="type">int</span>&#123;</span><br><span class="line">    a=a+<span class="number">1</span></span><br><span class="line">     <span class="keyword">return</span> a</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们在主函数内调用</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">a:=fn2()</span><br><span class="line">fmt.Println(a())</span><br><span class="line">fmt.Println(a())</span><br><span class="line">fmt.Println(a())</span><br></pre></td></tr></table></figure><p>第一个打印结果便是11，那后面两个呢？结合闭包所说可以让一个便变量常驻内存便可以猜到结果是12，13</p><h3 id="defer延后执行"><a href="#defer延后执行" class="headerlink" title="defer延后执行"></a>defer延后执行</h3><p>这个便是今天学的最难理解的知识，首先还是先看看几个简单的列子先</p><h4 id="ex1"><a href="#ex1" class="headerlink" title="ex1"></a>ex1</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">defer</span> fmt.Println(<span class="string">&quot;开始&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> fmt.Println(<span class="string">&quot;结束&quot;</span>)</span><br></pre></td></tr></table></figure><p>结果是 结束，开始<br>这里很简单，理解为先defer的后执行，后defer的先执行</p><h4 id="ex2"><a href="#ex2" class="headerlink" title="ex2"></a>ex2</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">defer</span> fmt.Println(<span class="string">&quot;开始&quot;</span>)</span><br><span class="line">fmt.Println(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">fmt.Println(<span class="string">&quot;2&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> fmt.Println(<span class="string">&quot;3&quot;</span>)</span><br><span class="line"><span class="keyword">defer</span> fmt.Println(<span class="string">&quot;结束&quot;</span>)</span><br></pre></td></tr></table></figure><p>结合上面所说结果便是<br>1，2，结束，3，开始</p><h4 id="ex3"><a href="#ex3" class="headerlink" title="ex3"></a>ex3</h4><p>这里开始难度就有点上升了<br>比如我在主函数数定义了一个</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test1</span><span class="params">()</span></span> <span class="type">int</span>&#123;</span><br><span class="line">  a:=<span class="number">5</span></span><br><span class="line">  <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span>&#123;</span><br><span class="line">   a=a+<span class="number">1</span></span><br><span class="line">  &#125;()</span><br><span class="line">  <span class="keyword">return</span> a</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里的返回值便是5<br>理解我我们先将a赋值给返回值，再执行defer a&#x3D;a+1,a的值虽然变了，但我们已经返回值赋过值了，然后return 返回值<br>return——defer:1.返回值&#x3D;x，运行defer，ret指令</p><h4 id="ex4"><a href="#ex4" class="headerlink" title="ex4"></a>ex4</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test2</span><span class="params">()</span></span>&#123;</span><br><span class="line"> fmt.Println(<span class="string">&quot;开始&quot;</span>)</span><br><span class="line"> <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span>&#123;</span><br><span class="line">  fmt.Println(<span class="string">&quot;111&quot;</span>)</span><br><span class="line"> &#125;()</span><br><span class="line"> fmt.Println(<span class="string">&quot;结束&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>结果很明显是开始，结束，111</p><h4 id="ex5"><a href="#ex5" class="headerlink" title="ex5"></a>ex5</h4><p>我们将ex3稍微改造一下</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test1</span><span class="params">()</span></span> (a <span class="type">int</span>)&#123;</span><br><span class="line">  a:=<span class="number">5</span></span><br><span class="line">  <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span>&#123;</span><br><span class="line">   a=a+<span class="number">1</span></span><br><span class="line">  &#125;()</span><br><span class="line">  <span class="keyword">return</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这里我指定了返回值为a，那么结果会发生变化吗？答案是肯定要变化的，正如上面所说我们先将给返回值赋值，但此时返回值就是a，<br>a&#x3D;a+1，那么最后返回的值就是6</p><h4 id="ex6"><a href="#ex6" class="headerlink" title="ex6"></a>ex6</h4><p>我们再改造以下ex6</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test1</span><span class="params">()</span></span> (a <span class="type">int</span>)&#123;</span><br><span class="line">  a:=<span class="number">5</span></span><br><span class="line">  <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">(a <span class="type">int</span>)</span></span>&#123;</span><br><span class="line">   a=a+<span class="number">1</span></span><br><span class="line">  &#125;()</span><br><span class="line">  <span class="keyword">return</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里返回的是5，ex6与ex5的区别在于我在自治函数里指定了参数a，这样就有了两个a，我理解的是他们的地址不同我们最终需要的是第一个a</p><h4 id="ex7"><a href="#ex7" class="headerlink" title="ex7"></a>ex7</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">hello</span><span class="params">(i *<span class="type">int</span>)</span></span> <span class="type">int</span> &#123;</span><br><span class="line">  <span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">   *i = <span class="number">19</span></span><br><span class="line">  &#125;()</span><br><span class="line">  <span class="keyword">return</span> *i</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  i := <span class="number">10</span></span><br><span class="line">  j := hello(&amp;i)</span><br><span class="line">  fmt.Println(i, j)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里的结果是19，10<br>调用hello函数时我们传入了i的地址，由于defer，我们先执行将i地址的变量的值赋值给了j，然后再再讲i所在地址的变量的值改为了19</p><h4 id="ex8"><a href="#ex8" class="headerlink" title="ex8"></a>ex8</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">calc</span><span class="params">(index <span class="type">string</span>, a, b <span class="type">int</span>)</span></span> <span class="type">int</span> &#123;</span><br><span class="line">fmt.Println(index, a, b, a+b)</span><br><span class="line"><span class="keyword">return</span> a + b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">x := <span class="number">1</span></span><br><span class="line">y := <span class="number">2</span></span><br><span class="line"><span class="keyword">defer</span> calc(<span class="string">&quot;AA&quot;</span>, x, calc(<span class="string">&quot;A&quot;</span>, x, y))</span><br><span class="line">x = <span class="number">10</span></span><br><span class="line"><span class="keyword">defer</span> calc(<span class="string">&quot;BB&quot;</span>, x, calc(<span class="string">&quot;B&quot;</span>, x, y))</span><br><span class="line">y = <span class="number">20</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>defer 注册要延迟执行的函数时该函数所有的参数都需要确定其值,有了这句话我们便可以理解该题</p><p>我们首先按顺序执行到第一个defer</p><p>defer calc(“AA”, x, calc(“A”, x, y))</p><p>正如上面所说我们所有的参数要确定其值，所以肯定要执行</p><p>calc(“A”, x, y)</p><p>此时便打印出：A 1 2 3 。然后返回3</p><p>这样就变为了defer calc(“AA”,1,3)</p><p>然后其参数值都确定以后按照先defer的后执行</p><p>然后接着此时x的值变为了10</p><p>我们接着按顺序到了第二个defer</p><p>defer calc(“BB”, x, calc(“B”, x, y))</p><p>同样的我们要先确定其值</p><p>calc(“B”, x, y)</p><p>此时便打印出：A 10 2 12 。然后返回12</p><p>这样就变为了defer calc(“BB”,10,12)</p><p>紧接着y的值虽然变化了，但我们前面的值都已经确定了。</p><p>然后其参数值都确定以后按照先defer的后执行，后defer的先执行</p><p>所以最终的结果是</p><ul><li>A 1 2 3</li><li>B 10 2 12</li><li>BB 10 12 22</li><li>AA 1 3 4</li></ul><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>这里的面试题居多要好好的理解</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;递归求1-100的和&quot;&gt;&lt;a href=&quot;#递归求1-100的和&quot; class=&quot;headerlink&quot; title=&quot;递归求1~100的和&quot;&gt;&lt;/a&gt;递归求1~100的和&lt;/h3&gt;&lt;figure class=&quot;highlight go&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>05路由分组</title>
    <link href="http://riyuejuyjyj.github.io/posts/3dba50d2.html"/>
    <id>http://riyuejuyjyj.github.io/posts/3dba50d2.html</id>
    <published>2022-12-01T15:58:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<p>很明显随着我们后期的开发main函数的路由会变得很多，这时候便有路由分组的办法了<br>根据我们路由的有不同功能，不难想到我们会把同一组的分在一起，比如属于admin的。属于default的，user的<br><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-12-01%20160406.jfif" alt="image"></p><p>如图所示我们在routers下建立三个路由，我们用到的路由分组的方法是</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">defaultRouters:=route.Group(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">   defaultRouter.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">    context.HTML(<span class="number">200</span>,<span class="string">&quot;default/index.html&quot;</span>,<span class="literal">nil</span>)</span><br><span class="line">   &#125;)</span><br><span class="line">   defaultRouter.GET(<span class="string">&quot;/news&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">    context.HTML(<span class="number">200</span>,<span class="string">&quot;default/news.html&quot;</span>,<span class="literal">nil</span>)</span><br><span class="line">   &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>注意Group方法的大括号得换行占一行，这样我们就建立了&#x2F;，&#x2F;news页面</p><p>然后具体到每个路由</p><h3 id="routers-x2F-adminRouters-go"><a href="#routers-x2F-adminRouters-go" class="headerlink" title="routers&#x2F;adminRouters.go"></a>routers&#x2F;adminRouters.go</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> routers</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span>(</span><br><span class="line"> <span class="string">&quot;github.com/gin-gonic/gin&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">AdminRoutersInit</span><span class="params">(route *gin.Engine)</span></span>&#123;</span><br><span class="line">   adminRouters:=route.Group(<span class="string">&quot;/admin&quot;</span>)</span><br><span class="line">   &#123;</span><br><span class="line">     adminRouters.GET(<span class="string">&quot;/&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是admin&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">adminRouters.GET(<span class="string">&quot;/user&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是admin/user&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">adminRouters.GET(<span class="string">&quot;/user/add&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是admin/user/add&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">adminRouters.GET(<span class="string">&quot;/user/edit&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是admin/user/edit&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">   </span><br><span class="line">   &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>为了让我们的方法被访问，得将方法名首字母大写</p><h3 id="routers-x2F-defaultRouters-go"><a href="#routers-x2F-defaultRouters-go" class="headerlink" title="routers&#x2F;defaultRouters.go"></a>routers&#x2F;defaultRouters.go</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> router</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span>(</span><br><span class="line"> <span class="string">&quot;github.com/gin-gonic/gin&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">DefaultRoutersInit</span><span class="params">(route *gin.Engine)</span></span> &#123;</span><br><span class="line">defaultRouters := route.Group(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">defaultRouters.GET(<span class="string">&quot;/&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.HTML(<span class="number">200</span>, <span class="string">&quot;default/index.html&quot;</span>, <span class="literal">nil</span>)</span><br><span class="line">&#125;)</span><br><span class="line">defaultRouters.GET(<span class="string">&quot;/news&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是news&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="routers-x2F-apiRouters-go"><a href="#routers-x2F-apiRouters-go" class="headerlink" title="routers&#x2F;apiRouters.go"></a>routers&#x2F;apiRouters.go</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> routers</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;github.com/gin-gonic/gin&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">ApiRoutersInit</span><span class="params">(route *gin.Engine)</span></span> &#123;</span><br><span class="line">apiRouters := route.Group(<span class="string">&quot;/api&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">apiRouters.GET(<span class="string">&quot;/&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是api&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">apiRouters.GET(<span class="string">&quot;/userlist&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是api userlist&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">apiRouters.GET(<span class="string">&quot;/plist&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是api plist&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">apiRouters.GET(<span class="string">&quot;/cart&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.String(<span class="number">200</span>, <span class="string">&quot;我是api cart&quot;</span>)</span><br><span class="line">&#125;)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="在main-go中使用"><a href="#在main-go中使用" class="headerlink" title="在main.go中使用"></a>在main.go中使用</h3><p>一定要引入，比如我的项目是gin-all&#x2F;gin04&#x2F;router</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span>(</span><br><span class="line"> <span class="string">&quot;gin-all/gin04/routers&quot;</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-12-01%20162310.jfif" alt="images"><br>在main.go中</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">routers.DefaultRoutersInit(route)</span><br><span class="line">routers.ApitRoutersInit(route)</span><br><span class="line">routers.AdminRoutersInit(route)</span><br></pre></td></tr></table></figure><p>最后fresh就行了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;很明显随着我们后期的开发main函数的路由会变得很多，这时候便有路由分组的办法了&lt;br&gt;根据我们路由的有不同功能，不难想到我们会把同一组的分在一起，比如属于admin的。属于default的，user的&lt;br&gt;&lt;img src=&quot;https://gitee.com/in-t</summary>
      
    
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/categories/gin/"/>
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/tags/gin/"/>
    
  </entry>
  
  <entry>
    <title>04 get，post接受前台的值</title>
    <link href="http://riyuejuyjyj.github.io/posts/1c7dce2.html"/>
    <id>http://riyuejuyjyj.github.io/posts/1c7dce2.html</id>
    <published>2022-11-30T20:23:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h3 id="接受get请求的传值"><a href="#接受get请求的传值" class="headerlink" title="接受get请求的传值"></a>接受get请求的传值</h3><p>例如<a href="http://localhost:8080/?username=xxx&amp;age=xxx">http://localhost:8080?username=xxx&amp;age=xxx</a></p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line"><span class="keyword">var</span> useinfo=<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>&#123;</span><br><span class="line">     <span class="string">&quot;username&quot;</span>:context.Query(<span class="string">&quot;username&quot;</span>),</span><br><span class="line">         <span class="string">&quot;age&quot;</span>:context.Query(<span class="string">&quot;age&quot;</span>),</span><br><span class="line">         <span class="string">&quot;name&quot;</span>:context.Query(<span class="string">&quot;name&quot;</span>),</span><br><span class="line">     <span class="string">&quot;page&quot;</span>:context.DefaultQuery(<span class="string">&quot;query&quot;</span>,<span class="string">&quot;1&quot;</span>),</span><br><span class="line">    &#125;</span><br><span class="line">    context.JSON(<span class="number">200</span>,userinfo)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>这里我们很明显定义了一个map来接收数据，DefaultQuery表示如果没有查询到该值，则在这里1便是它的默认值</p><h3 id="接受post的请求的传值"><a href="#接受post的请求的传值" class="headerlink" title="接受post的请求的传值"></a>接受post的请求的传值</h3><p>很简单的例子就是创建一个html表单进行传值,这个html只做展示不一定和go对得上</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">action</span>=<span class="string">&quot;/doAddUser&quot;</span> <span class="attr">method</span>=<span class="string">&quot;post&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">label</span>&gt;</span></span><br><span class="line">   username:<span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;text&quot;</span> <span class="attr">name</span>=<span class="string">&quot;username&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">label</span>&gt;</span></span><br><span class="line">    password:<span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;password&quot;</span> <span class="attr">name</span>=<span class="string">&quot;password&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;submit&quot;</span> <span class="attr">value</span>=<span class="string">&quot;提交&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后我们在后端接受，但当然我们得先渲染一下刚定义的form.html</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.GET(<span class="string">&quot;/user&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line"> context.HTML(<span class="number">200</span>,<span class="string">&quot;default/user.html&quot;</span>,gin.H&#123;&#125;)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">route.POST(<span class="string">&quot;/doAddUser&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">     <span class="keyword">var</span> userinfo=<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>&#123;</span><br><span class="line">     <span class="string">&quot;username&quot;</span>:context.PostForm(<span class="string">&quot;username&quot;</span>),</span><br><span class="line">         <span class="string">&quot;age&quot;</span>:context.PostForm(<span class="string">&quot;age&quot;</span>),</span><br><span class="line">         <span class="string">&quot;sex&quot;</span>:context.PostForm(<span class="string">&quot;username&quot;</span>),</span><br><span class="line">         <span class="string">&quot;page&quot;</span>:context.DefaultPostForm(<span class="string">&quot;page&quot;</span>,<span class="string">&quot;1&quot;</span>),</span><br><span class="line">  &#125;</span><br><span class="line">  context.JSON(<span class="number">200</span>,userinfo)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>get和post只是我们调用的函数不一样罢了<br>在此提醒加载html文件时，以templates&#x2F;default&#x2F;index.html为例</p><ul><li>在文件最顶部加上define “default&#x2F;index.html<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;define &quot;default/index.html&#125;&#125;</span><br></pre></td></tr></table></figure></li><li>尾部加上<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure></li><li>然后再创建route后，加上<figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.LoadHTMLGlob(<span class="string">&quot;templates/**/*&quot;</span>)</span><br></pre></td></tr></table></figure><blockquote><p>前两条的“ ”是不用加的，但用于渲染器的毛病不加要报错</p></blockquote></li></ul><h3 id="进阶版"><a href="#进阶版" class="headerlink" title="进阶版"></a>进阶版</h3><p>我们发现上面的方法都要一个一个的赋值很麻烦，然后就有新的方法context.ShouldBind()可以将值与结构体绑定，当然值得对应上</p><p>首先我们在主函数外创建一个结构体</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">type</span> User <span class="keyword">struct</span>&#123;</span><br><span class="line">Username <span class="type">string</span> <span class="string">`form:&quot;username&quot; json:&quot;username&quot;`</span></span><br><span class="line">Passwoed <span class="type">string</span> <span class="string">`form:&quot;password&quot; json:&quot;password&quot;`</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="get版"><a href="#get版" class="headerlink" title="get版"></a>get版</h4><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span> <span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">  user:=&amp;User&#123;&#125;</span><br><span class="line">  _:=context.ShouldBind(&amp;user)</span><br><span class="line">  context.json(<span class="number">200</span>,user)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>结果如下<br><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-11-30%20205515.jfif" alt="image"></p><h4 id="post版"><a href="#post版" class="headerlink" title="post版"></a>post版</h4><p>两者几乎一样，只不过post版得建一个form表单而已</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.GET(<span class="string">&quot;/user1&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">context.HTML(http.StatusOK, <span class="string">&quot;default/user1.html&quot;</span>, gin.H&#123;&#125;)</span><br><span class="line">&#125;)</span><br><span class="line">route.POST(<span class="string">&quot;/doAddUser1&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span> &#123;</span><br><span class="line">user := &amp;UserInfo&#123;&#125;</span><br><span class="line">err := context.ShouldBind(&amp;user)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line">context.JSON(<span class="number">200</span>, user)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>结果也与上面相同</p><h3 id="拓展发送xml请求"><a href="#拓展发送xml请求" class="headerlink" title="拓展发送xml请求"></a>拓展发送xml请求</h3><p>在这里我们尝试用postman发送请求,结果也在图上<br><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/04gin.jfif" alt="image"></p><p>定义了一个articile的结构体</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">type</span> Article <span class="keyword">struct</span> &#123;</span><br><span class="line">Title   <span class="type">string</span> <span class="string">`xml:&quot;title&quot; json:&quot;title&quot;`</span></span><br><span class="line">Content <span class="type">string</span> <span class="string">`xml:&quot;content&quot; json:&quot;content&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>xml的代码</p><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span> ?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">article</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">content</span> <span class="attr">type</span>=<span class="string">&quot;string&quot;</span>&gt;</span>我是张三<span class="tag">&lt;/<span class="name">content</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span> <span class="attr">type</span>=<span class="string">&quot;string&quot;</span>&gt;</span>张三<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">article</span>&gt;</span></span><br></pre></td></tr></table></figure><p>xml的解析就比上面复杂一点</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">route.POST(<span class="string">&quot;/xml&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">   data,_:=context.GetRawData()<span class="comment">//byte类型</span></span><br><span class="line">   article=&amp;Article&#123;&#125;</span><br><span class="line">   _=xml.Unmarshal(data,&amp;article)</span><br><span class="line">   context.JSON(<span class="number">200</span>, article)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>结果在上图的下面</p><p>&#96;</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;接受get请求的传值&quot;&gt;&lt;a href=&quot;#接受get请求的传值&quot; class=&quot;headerlink&quot; title=&quot;接受get请求的传值&quot;&gt;&lt;/a&gt;接受get请求的传值&lt;/h3&gt;&lt;p&gt;例如&lt;a href=&quot;http://localhost:8080/?user</summary>
      
    
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/categories/gin/"/>
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/tags/gin/"/>
    
  </entry>
  
  <entry>
    <title>day3_test_webgis_map controls</title>
    <link href="http://riyuejuyjyj.github.io/posts/9dfb5df1.html"/>
    <id>http://riyuejuyjyj.github.io/posts/9dfb5df1.html</id>
    <published>2022-11-30T20:12:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<p><strong>详情效果请查看</strong><a href="https://myblog.buluoxu.club//HTML/webgis/03%E5%9C%B0%E5%9B%BE%E6%8E%A7%E4%BB%B6.html">https://myblog.buluoxu.club//HTML/webgis/03地图控件.html</a><br>代码里的注释还是比较好懂的</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#container</span>&#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">60%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">70%</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">body</span>,<span class="selector-tag">html</span>&#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;add_traffic()&quot;</span>&gt;</span>显示实时路况<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;hide_traffic()&quot;</span>&gt;</span>隐藏实时路况<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">window</span>.<span class="property">_AMapSecurityConfig</span>=&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">securityJsCode</span>: <span class="string">&#x27;5457423e5abb27ad53e22ca37bd02c5d&#x27;</span></span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://webapi.amap.com/maps?v=2.0&amp;key=2ab6693026920bfdfcc64a96e81df848&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">const</span> map=<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">Map</span>(<span class="string">&quot;container&quot;</span>,&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">center</span>: [<span class="number">104.30</span>,<span class="number">30.4311</span>],<span class="comment">//设置地图中心点经度与纬度</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">zoom</span>: <span class="number">10</span>,<span class="comment">//地图的缩放比例(3~20)</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">viewMode</span>: <span class="string">&#x27;3D&#x27;</span>,<span class="comment">//默认俯视角度</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">pitch</span>: <span class="number">45</span> <span class="comment">//倾斜角度</span></span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="comment">//加载控件</span></span></span><br><span class="line"><span class="language-javascript">    <span class="title class_">AMap</span>.<span class="title function_">plugin</span>([<span class="string">&quot;AMap.ToolBar&quot;</span>,<span class="string">&quot;AMap.Scale&quot;</span>,<span class="string">&quot;AMap.HawkEye&quot;</span>,<span class="string">&quot;AMap.MapType&quot;</span>,<span class="string">&quot;AMap.Geolocation&quot;</span>,<span class="string">&quot;AMap.ControlBar&quot;</span>],<span class="keyword">function</span> (<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="comment">//toolbar（工具体）：集成了缩放，平移，定位</span></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">//scale是比例尺</span></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">//HawkEye：右下角缩略</span></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">//mapytpe:切换图层</span></span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">ToolBar</span>())</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">Scale</span>())</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">HawkEye</span>())</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">MapType</span>())</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">ControlBar</span>())</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">addControl</span>(<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">Geolocation</span>());<span class="comment">// 在图面添加定位控件，用来获取和展示用户主机所在的经纬度位置</span></span></span><br><span class="line"><span class="language-javascript">    &#125;)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">var</span> traffic = <span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="property">TileLayer</span>.<span class="title class_">Traffic</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">autoRefresh</span>: <span class="literal">true</span>, <span class="comment">//自动刷新</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">interval</span>: <span class="number">180</span>,<span class="comment">//刷新间隔</span></span></span><br><span class="line"><span class="language-javascript">    &#125;)<span class="comment">//交通路况图层</span></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">function</span> <span class="title function_">add_traffic</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">add</span>(traffic)</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">function</span> <span class="title function_">hide_traffic</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">remove</span>(traffic)</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;详情效果请查看&lt;/strong&gt;&lt;a href=&quot;https://myblog.buluoxu.club//HTML/webgis/03%E5%9C%B0%E5%9B%BE%E6%8E%A7%E4%BB%B6.html&quot;&gt;https://myblog.bul</summary>
      
    
    
    
    <category term="webgis" scheme="http://riyuejuyjyj.github.io/categories/webgis/"/>
    
    
    <category term="webgis" scheme="http://riyuejuyjyj.github.io/tags/webgis/"/>
    
  </entry>
  
  <entry>
    <title>day2_test_webgis_map</title>
    <link href="http://riyuejuyjyj.github.io/posts/b79b78c9.html"/>
    <id>http://riyuejuyjyj.github.io/posts/b79b78c9.html</id>
    <published>2022-11-30T19:53:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<p>**详情效果请参见<a href="https://myblog.buluoxu.club/HTML/webgis/02%E5%9C%B0%E5%9B%BE%E5%8F%82%E6%95%B0.html">https://myblog.buluoxu.club/HTML/webgis/02%E5%9C%B0%E5%9B%BE%E5%8F%82%E6%95%B0.html</a></p><p>今天主要是关于一些图层的添加，在这里只尝试添加交通图层，更多图层请到高德api官方文档</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#container</span>&#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">900px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">900px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;add_traffic()&quot;</span>&gt;</span>显示实时路况<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;hide_traffic()&quot;</span>&gt;</span>隐藏实时路况<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">window</span>.<span class="property">_AMapSecurityConfig</span>=&#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">securityJsCode</span>: <span class="string">&#x27;5457423e5abb27ad53e22ca37bd02c5d&#x27;</span></span></span><br><span class="line"><span class="language-javascript">&#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://webapi.amap.com/maps?v=2.0&amp;key=2ab6693026920bfdfcc64a96e81df848&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">const</span> map=<span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="title class_">Map</span>(<span class="string">&quot;container&quot;</span>,&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">center</span>: [<span class="number">104</span>,<span class="number">30</span>],<span class="comment">//设置地图中心点经度与纬度</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">zoom</span>: <span class="number">5</span>,<span class="comment">//地图的缩放比例(3~20)</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">viewMode</span>: <span class="string">&#x27;3D&#x27;</span>,<span class="comment">//默认俯视角度</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">pitch</span>: <span class="number">45</span> <span class="comment">//倾斜角度</span></span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">var</span> traffic = <span class="keyword">new</span> <span class="title class_">AMap</span>.<span class="property">TileLayer</span>.<span class="title class_">Traffic</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">autoRefresh</span>: <span class="literal">true</span>, <span class="comment">//自动刷新</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">interval</span>: <span class="number">180</span>,<span class="comment">//刷新间隔</span></span></span><br><span class="line"><span class="language-javascript">    &#125;)<span class="comment">//交通路况图层</span></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">function</span> <span class="title function_">add_traffic</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">add</span>(traffic)</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">function</span> <span class="title function_">hide_traffic</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        map.<span class="title function_">remove</span>(traffic)</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;**详情效果请参见&lt;a href=&quot;https://myblog.buluoxu.club/HTML/webgis/02%E5%9C%B0%E5%9B%BE%E5%8F%82%E6%95%B0.html&quot;&gt;https://myblog.buluoxu.club/HTML/w</summary>
      
    
    
    
    <category term="webgis" scheme="http://riyuejuyjyj.github.io/categories/webgis/"/>
    
    
    <category term="webgis" scheme="http://riyuejuyjyj.github.io/tags/webgis/"/>
    
  </entry>
  
  <entry>
    <title>5.函数相关</title>
    <link href="http://riyuejuyjyj.github.io/posts/826f8a5f.html"/>
    <id>http://riyuejuyjyj.github.io/posts/826f8a5f.html</id>
    <published>2022-11-29T10:28:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="5-函数相关"><a href="#5-函数相关" class="headerlink" title="5.函数相关"></a>5.函数相关</h1><h2 id="函数的定义"><a href="#函数的定义" class="headerlink" title="函数的定义"></a>函数的定义</h2><p>func 函数名(参数1 参数1类型，参数2 参数2类型) （返回类型1，返回类型 2） {</p><p>}</p><h3 id="1-正常定义"><a href="#1-正常定义" class="headerlink" title="1.正常定义"></a>1.正常定义</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sumFn1</span><span class="params">(a <span class="type">int</span>,b <span class="type">int</span>)</span></span> <span class="type">int</span>&#123;</span><br><span class="line">  <span class="keyword">return</span> a+b</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  <span class="keyword">var</span> sum=sumFn1(<span class="number">1</span>,<span class="number">2</span>) <span class="comment">//调用函数</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>当然当返回值为空时，参数后面不写类型即可</p></blockquote><h3 id="2-接受多个未知参数"><a href="#2-接受多个未知参数" class="headerlink" title="2.接受多个未知参数"></a>2.接受多个未知参数</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sumFn2</span>（<span class="title">a</span> ...<span class="title">int</span>）<span class="title">int</span></span>&#123;</span><br><span class="line">sum:=<span class="number">0</span></span><br><span class="line">   <span class="keyword">for</span> _,v:=<span class="keyword">range</span> a&#123;</span><br><span class="line">     sum+=v</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="keyword">return</span> v</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  <span class="keyword">var</span> sum=sumFn2(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">4</span>,<span class="number">8</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>简单的理解就是1，2，3，…这些数据构成了一个切片a,但如果时这样的情况<br><strong>func sumFn2(a int,b …int)</strong>,那么a的值就是1，其余的值归为切片sliceb</p><h3 id="3-指定返回的变量"><a href="#3-指定返回的变量" class="headerlink" title="3.指定返回的变量"></a>3.指定返回的变量</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">calc1</span><span class="params">(a <span class="type">int</span>,b <span class="type">int</span>)</span></span> (sum <span class="type">int</span>,sub <span class="type">int</span>)&#123;</span><br><span class="line">  sum=a+b</span><br><span class="line">  sub=a-b</span><br><span class="line">  <span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  <span class="keyword">var</span> sum,sub=sumFn1(<span class="number">1</span>,<span class="number">2</span>) <span class="comment">//调用函数</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>从代码中也是很好理解的我们指定了返回变量sum，sub，计算出他们的值后，我们直接return就行</p><h3 id="4-参数类型为切片"><a href="#4-参数类型为切片" class="headerlink" title="4.参数类型为切片"></a>4.参数类型为切片</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">calc2</span><span class="params">(slice_a []<span class="type">int</span>)</span></span> []<span class="type">int</span>&#123;</span><br><span class="line">    sort.Ints(slice_a) <span class="comment">//对slice_a排序</span></span><br><span class="line">    <span class="keyword">return</span> slice_a</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  slice_a:=[]<span class="type">int</span>&#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">5</span>,<span class="number">89</span>,<span class="number">4</span>,<span class="number">56</span>&#125;</span><br><span class="line">  slice_a=calc1(slice_a)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个也没啥好说的注意以下咋写的就行</p><h3 id="5-参数类型为map"><a href="#5-参数类型为map" class="headerlink" title="5.参数类型为map"></a>5.参数类型为map</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">calc3</span><span class="params">(map1 <span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>)</span></span> &#123;</span><br><span class="line">  <span class="comment">//记录map的key值</span></span><br><span class="line">  slice_key:=[]<span class="type">string</span>&#123;&#125;</span><br><span class="line">  <span class="keyword">for</span> k,_:= <span class="keyword">range</span> map1&#123;</span><br><span class="line">    slice_key=<span class="built_in">append</span>(slice_key,k)</span><br><span class="line">  &#125;</span><br><span class="line">  sort.Strings(slice_key)<span class="comment">//对key值进行排序</span></span><br><span class="line">  <span class="keyword">for</span> _,v:=<span class="keyword">range</span> slice_key&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;%v:%v &quot;</span>,slice_key,map1[slice_key])</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">  map1:=<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>&#123;</span><br><span class="line">   <span class="string">&quot;username&quot;</span>: <span class="string">&quot;张三&quot;</span>,</span><br><span class="line"><span class="string">&quot;password&quot;</span>: <span class="string">&quot;1234&quot;</span>,</span><br><span class="line"><span class="string">&quot;age&quot;</span>:     <span class="string">&quot;30&quot;</span>,</span><br><span class="line"><span class="string">&quot;height&quot;</span>:   <span class="string">&quot;180&quot;</span>,</span><br><span class="line"><span class="string">&quot;weight&quot;</span>:   <span class="string">&quot;50&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line">  calc3(map1)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//输出结果：age:30 height:180 password:1234 username:张三 weight:50 </span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;5-函数相关&quot;&gt;&lt;a href=&quot;#5-函数相关&quot; class=&quot;headerlink&quot; title=&quot;5.函数相关&quot;&gt;&lt;/a&gt;5.函数相关&lt;/h1&gt;&lt;h2 id=&quot;函数的定义&quot;&gt;&lt;a href=&quot;#函数的定义&quot; class=&quot;headerlink&quot; title=</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>4.map</title>
    <link href="http://riyuejuyjyj.github.io/posts/be8242ff.html"/>
    <id>http://riyuejuyjyj.github.io/posts/be8242ff.html</id>
    <published>2022-11-26T16:20:30.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="04-map"><a href="#04-map" class="headerlink" title="04 map"></a>04 map</h1><p>map其实就像是一种映射，c里面的map，python的字典感觉</p><h2 id="map一些简单的操作"><a href="#map一些简单的操作" class="headerlink" title="map一些简单的操作"></a>map一些简单的操作</h2><p><strong>通过make函数定义</strong></p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> userinfo=<span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>) </span><br></pre></td></tr></table></figure><p>中括号里的是键，外面的是值</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="comment">//添加键值对</span></span><br><span class="line">userinfo[<span class="string">&quot;username&quot;</span>]=<span class="string">&quot;张三&quot;</span></span><br><span class="line">userinfo[<span class="string">&quot;age&quot;</span>]=<span class="string">&quot;20&quot;</span></span><br></pre></td></tr></table></figure><p>当然也可以这样定义</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> userinfo2=<span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>)&#123;</span><br><span class="line">    <span class="string">&quot;username&quot;</span>:<span class="string">&quot;zhangsan&quot;</span>,</span><br><span class="line">    <span class="string">&quot;age&quot;</span>:<span class="string">&quot;20&quot;</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>map也是引用类型数据</strong></p><p>判断某个键是否存在</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">v,ok:=userinfo[<span class="string">&quot;password&quot;</span>] <span class="comment">//v是值，ok是bool类型</span></span><br></pre></td></tr></table></figure><p>删除某个键</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="built_in">delete</span>(userinfo,<span class="string">&quot;username&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="map类型的切片"><a href="#map类型的切片" class="headerlink" title="map类型的切片"></a>map类型的切片</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> userList=<span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>][<span class="type">string</span>],<span class="number">3</span>,<span class="number">3</span>)<span class="comment">//可以理解为userList里有三个map类型</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> userList[<span class="number">0</span>]!=<span class="literal">nil</span>&#123;</span><br><span class="line">    userList[<span class="number">0</span>][<span class="string">&quot;username&quot;</span>]=<span class="string">&quot;张三&quot;</span>,</span><br><span class="line">    userList[<span class="number">0</span>][<span class="string">&quot;age&quot;</span>]=<span class="string">&quot;20&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> userList[<span class="number">1</span>]!=<span class="literal">nil</span>&#123;</span><br><span class="line">    userList[<span class="number">0</span>][<span class="string">&quot;username&quot;</span>]=<span class="string">&quot;李四&quot;</span>,</span><br><span class="line">    userList[<span class="number">0</span>][<span class="string">&quot;age&quot;</span>]=<span class="string">&quot;19&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-11-26%20160218.jfif" alt="image"></p><h3 id="for-range-遍历"><a href="#for-range-遍历" class="headerlink" title="for range 遍历"></a>for range 遍历</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">for</span> _,v:=<span class="keyword">range</span> userList&#123;</span><br><span class="line">    <span class="keyword">for</span> k,v1:=<span class="keyword">range</span> v&#123;</span><br><span class="line">        fmt.Printf(<span class="string">&quot;%v:%v&quot;</span>,k,v1)</span><br><span class="line">    &#125;</span><br><span class="line">    fmt.Println()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="切片类型的map"><a href="#切片类型的map" class="headerlink" title="切片类型的map"></a>切片类型的map</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> user1=<span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>][]<span class="type">string</span>)</span><br><span class="line">user1[<span class="string">&quot;name&quot;</span>]=[]<span class="type">string</span>&#123;</span><br><span class="line">    <span class="string">&quot;张三&quot;</span>，</span><br><span class="line">    <span class="string">&quot;李四&quot;</span>，</span><br><span class="line">&#125;</span><br><span class="line">user1[<span class="string">&quot;hobby&quot;</span>]=[]<span class="type">string</span>&#123;</span><br><span class="line">     <span class="string">&quot;sleep&quot;</span>,</span><br><span class="line">     <span class="string">&quot;code&quot;</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="forrange-遍历"><a href="#forrange-遍历" class="headerlink" title="forrange 遍历"></a>forrange 遍历</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">for</span> k,v:=<span class="keyword">range</span> user1&#123;</span><br><span class="line">    fmt.Printf(<span class="string">&quot;%v:&quot;</span>,k)</span><br><span class="line">    <span class="keyword">for</span> _,v1:=<span class="keyword">range</span> v&#123;</span><br><span class="line">        fmt.Printf(<span class="string">&quot;%v &quot;</span>,v1)</span><br><span class="line">    &#125;</span><br><span class="line">    fmt.Println()</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//hobby:sleep code </span></span><br><span class="line"><span class="comment">//name:张三 李四 </span></span><br></pre></td></tr></table></figure><h2 id="统计一个句子单词出现的次数"><a href="#统计一个句子单词出现的次数" class="headerlink" title="统计一个句子单词出现的次数"></a>统计一个句子单词出现的次数</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> str=<span class="string">&quot;how do you want to do something&quot;</span></span><br><span class="line">str1:=strings.split(str,<span class="string">&quot; &quot;</span>)</span><br><span class="line"><span class="keyword">var</span> map1=<span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">int</span>)</span><br><span class="line"><span class="keyword">for</span> _,v:=<span class="keyword">range</span> str&#123;</span><br><span class="line">    map1[v]++;</span><br><span class="line">&#125;</span><br><span class="line">fmt.Print(map1)</span><br><span class="line"><span class="comment">//map[do:2 how:1 something:1 to:1 want:1 you:1]</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;04-map&quot;&gt;&lt;a href=&quot;#04-map&quot; class=&quot;headerlink&quot; title=&quot;04 map&quot;&gt;&lt;/a&gt;04 map&lt;/h1&gt;&lt;p&gt;map其实就像是一种映射，c里面的map，python的字典感觉&lt;/p&gt;
&lt;h2 id=&quot;map一些简单的操</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>3.简单排序</title>
    <link href="http://riyuejuyjyj.github.io/posts/267e357a.html"/>
    <id>http://riyuejuyjyj.github.io/posts/267e357a.html</id>
    <published>2022-11-26T15:40:30.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="03-选择排序，冒泡排序，sort包排序"><a href="#03-选择排序，冒泡排序，sort包排序" class="headerlink" title="03 选择排序，冒泡排序，sort包排序"></a>03 选择排序，冒泡排序，sort包排序</h1><h2 id="选择排序"><a href="#选择排序" class="headerlink" title="选择排序"></a>选择排序</h2><p>很经典的算法，在此不再赘述原理</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> numSlice=[]<span class="type">int</span>&#123;<span class="number">9</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">15</span>, <span class="number">5</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="keyword">for</span> i:=<span class="number">0</span>;i&lt;<span class="built_in">len</span>(numSlice);i++&#123;</span><br><span class="line">    <span class="keyword">for</span> j:=i+<span class="number">1</span>;j&lt;<span class="built_in">len</span>(numSlice);j++&#123;</span><br><span class="line">        <span class="keyword">if</span> (numSlice[i]&gt;numSlice[j])&#123;</span><br><span class="line">            numSlice[i],numSlice[j]=numSlice[j],numSlice[i]</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="冒泡排序"><a href="#冒泡排序" class="headerlink" title="冒泡排序"></a>冒泡排序</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">for</span> i:=<span class="number">0</span>;i&lt;<span class="built_in">len</span>(numSlice);i++&#123;</span><br><span class="line">    <span class="keyword">for</span> j:=<span class="number">0</span>;j&lt;<span class="built_in">len</span>(numSlice)<span class="number">-1</span>;j++&#123;</span><br><span class="line">        <span class="keyword">if</span> (numSlice[j]&gt;numSlice[j+<span class="number">1</span>])&#123;</span><br><span class="line">            numSlice[j],numSlice[j+<span class="number">1</span>]=numSlice[j+<span class="number">1</span>],numSlice[j]</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="sort-包排序"><a href="#sort-包排序" class="headerlink" title="sort 包排序"></a>sort 包排序</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">intlist:=[]<span class="type">int</span>&#123;<span class="number">9</span>, <span class="number">8</span>, <span class="number">12</span>, <span class="number">3</span>, <span class="number">6</span>, <span class="number">8</span>, <span class="number">4</span>&#125;</span><br><span class="line">floatlist:=[]<span class="type">float64</span>&#123;<span class="number">5.1</span>, <span class="number">502</span>, <span class="number">5.3</span>, <span class="number">6.3</span>, <span class="number">7.8</span>&#125;</span><br><span class="line">stringlist:=[]<span class="type">string</span>&#123;<span class="string">&quot;a&quot;</span>, <span class="string">&quot;b&quot;</span>, <span class="string">&quot;c&quot;</span>, <span class="string">&quot;4&quot;</span>, <span class="string">&quot;5&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">sort.Ints(intlist)</span><br><span class="line">sort.Float64s(floatlist)</span><br><span class="line">sort.Strings(stringlist)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">fmt.Println(intlist)</span><br><span class="line">fmt.Println(floatlist)</span><br><span class="line">fmt.Println(stringlist)</span><br><span class="line">sort.Sort(sort.Reverse(sort.IntSlice(intlist))) <span class="comment">//降序排列</span></span><br><span class="line">fmt.Println(intlist)</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-26%20153359.jfif" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;03-选择排序，冒泡排序，sort包排序&quot;&gt;&lt;a href=&quot;#03-选择排序，冒泡排序，sort包排序&quot; class=&quot;headerlink&quot; title=&quot;03 选择排序，冒泡排序，sort包排序&quot;&gt;&lt;/a&gt;03 选择排序，冒泡排序，sort包排序&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>03gin模板语法（下）</title>
    <link href="http://riyuejuyjyj.github.io/posts/afea9a7e.html"/>
    <id>http://riyuejuyjyj.github.io/posts/afea9a7e.html</id>
    <published>2022-11-26T04:50:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="gin03模板语法下"><a href="#gin03模板语法下" class="headerlink" title="gin03模板语法下"></a>gin03模板语法下</h1><h2 id="自定义模板函数"><a href="#自定义模板函数" class="headerlink" title="自定义模板函数"></a>自定义模板函数</h2><p>首先我们自定义一个函数,根据时间戳返回时间的函数</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">UnixToTime</span><span class="params">(timestamp <span class="type">int64</span>)</span></span> <span class="type">string</span>&#123;</span><br><span class="line">    t:=timestamp.Unix(timestamp,<span class="number">0</span>)</span><br><span class="line">    <span class="keyword">return</span> t.Format(<span class="string">&quot;2006-01-02 15:04:05&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们将函数与路由绑定</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.SetFuncMap(template.FuncMap&#123;</span><br><span class="line">    <span class="string">&quot;UnixToTime&quot;</span>:UnixToTime,</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>然后后台传入数据date</p><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/2022-11-26%20162957.jfif" alt="image"></p><p>然后在html页面中调用</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;UnixToTime .date&#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="定义模板文件以及加载静态资源"><a href="#定义模板文件以及加载静态资源" class="headerlink" title="定义模板文件以及加载静态资源"></a>定义模板文件以及加载静态资源</h2><p>一个大型的网页肯定会有很多html页面，而且我们也不可能每个html页面都单独写一下</p><p>定义一个模板头部</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123; define &quot;public/page_header.html&quot; &#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>我是头部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">&#123;&#123; end &#125;&#125;</span><br></pre></td></tr></table></figure><p>定义一个模板尾部</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;define &quot;public/page_footer.html&quot;&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>我是尾部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure><p>使用模板</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;template &quot;public/page_header.html&quot; . &#125;&#125;</span><br></pre></td></tr></table></figure><p>**注意上面的  点. **</p><p>加载静态资源如css,js,image</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.Static(<span class="string">&quot;/static&quot;</span>,<span class="string">&quot;./static&quot;</span>)<span class="comment">//将我们当前目录下static绑定到static路由上</span></span><br></pre></td></tr></table></figure><p>static&#x2F;css&#x2F;base.css</p><figure class="highlight css"><table><tr><td class="code"><pre><span class="line"><span class="selector-tag">h1</span>&#123;</span><br><span class="line">    backgroud:<span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">color</span>:white;</span><br><span class="line">    <span class="attribute">text-align</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后引入该css</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/static/css/base.css&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这样就行了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;gin03模板语法下&quot;&gt;&lt;a href=&quot;#gin03模板语法下&quot; class=&quot;headerlink&quot; title=&quot;gin03模板语法下&quot;&gt;&lt;/a&gt;gin03模板语法下&lt;/h1&gt;&lt;h2 id=&quot;自定义模板函数&quot;&gt;&lt;a href=&quot;#自定义模板函数&quot; class</summary>
      
    
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/categories/gin/"/>
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/tags/gin/"/>
    
  </entry>
  
  <entry>
    <title>2.go切片slice</title>
    <link href="http://riyuejuyjyj.github.io/posts/516d1297.html"/>
    <id>http://riyuejuyjyj.github.io/posts/516d1297.html</id>
    <published>2022-11-24T09:15:30.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="02-切片slice"><a href="#02-切片slice" class="headerlink" title="02 切片slice"></a>02 切片slice</h1><h2 id="切片的定义"><a href="#切片的定义" class="headerlink" title="切片的定义"></a>切片的定义</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="comment">//0.数组的定义</span></span><br><span class="line"><span class="keyword">var</span> array = [...]<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">5</span>&#125;</span><br><span class="line">fmt.Println(array)</span><br><span class="line"><span class="comment">//1.切片的定义,与数组的定义的区别在于 []里面为空,初始时长度为0</span></span><br><span class="line"><span class="keyword">var</span> name1 []<span class="type">int</span></span><br><span class="line">fmt.Printf(<span class="string">&quot;%T-长度:%v\n&quot;</span>, name1, <span class="built_in">len</span>(name1))</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> name2 = []<span class="type">string</span>&#123;<span class="string">&quot;zhangsan&quot;</span>, <span class="string">&quot;lisi&quot;</span>, <span class="string">&quot;wangwu&quot;</span>&#125;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%T-长度:%v\n&quot;</span>, name2, <span class="built_in">len</span>(name2))</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> name3 = []<span class="type">string</span>&#123;<span class="number">1</span>: <span class="string">&quot;zhangsan&quot;</span>, <span class="number">2</span>: <span class="string">&quot;lisi&quot;</span>, <span class="number">5</span>: <span class="string">&quot;wangwu&quot;</span>&#125;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%T-%v-长度:%v\n&quot;</span>, name3, name3, <span class="built_in">len</span>(name3))</span><br></pre></td></tr></table></figure><blockquote><p>切片定义是若没初始化，则默认为nil</p></blockquote><h2 id="循环遍历"><a href="#循环遍历" class="headerlink" title="循环遍历"></a>循环遍历</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> strSlice = []<span class="type">string</span>&#123;<span class="string">&quot;php&quot;</span>, <span class="string">&quot;python&quot;</span>, <span class="string">&quot;java&quot;</span>, <span class="string">&quot;golang&quot;</span>&#125;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="built_in">len</span>(strSlice); i++ &#123;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v &quot;</span>, strSlice[i])</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println()</span><br><span class="line"><span class="keyword">for</span> _, v := <span class="keyword">range</span> strSlice &#123;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v &quot;</span>, v)</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println()</span><br></pre></td></tr></table></figure><h2 id="基于数组定义切片"><a href="#基于数组定义切片" class="headerlink" title="基于数组定义切片"></a>基于数组定义切片</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">arr1 := [<span class="number">5</span>]<span class="type">int</span>&#123;<span class="number">55</span>, <span class="number">65</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">59</span>&#125;</span><br><span class="line">arr2 := arr1[:]</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v---%T\n&quot;</span>, arr2, arr2)</span><br><span class="line"></span><br><span class="line">c := arr1[<span class="number">2</span>:<span class="number">4</span>]</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v---%T\n&quot;</span>, c, c)</span><br></pre></td></tr></table></figure><h2 id="切片的长度和容量"><a href="#切片的长度和容量" class="headerlink" title="切片的长度和容量"></a>切片的长度和容量</h2><p><strong>容量是指从他的第一个元素开始，到其底层数组元素末尾的个数</strong></p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">fmt.Printf(<span class="string">&quot;arr2长度：%v---容量：%v\n&quot;</span>, <span class="built_in">len</span>(arr2), <span class="built_in">cap</span>(arr2))</span><br><span class="line"><span class="comment">//容量可以理解为arr2[1:3]其底层数组是arr2[1:],那容量很明显就是4</span></span><br><span class="line">fmt.Printf(<span class="string">&quot;arr2[1:3]长度：%v---容量：%v\n&quot;</span>, <span class="built_in">len</span>(arr2[<span class="number">1</span>:<span class="number">3</span>]), <span class="built_in">cap</span>(arr2[<span class="number">1</span>:<span class="number">3</span>]))</span><br></pre></td></tr></table></figure><h2 id="添加数据append"><a href="#添加数据append" class="headerlink" title="添加数据append"></a>添加数据append</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">arr2 = <span class="built_in">append</span>(arr2, <span class="number">58</span>)</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v---%T\n&quot;</span>, arr2, arr2)</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-24%20091157.jfif" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;02-切片slice&quot;&gt;&lt;a href=&quot;#02-切片slice&quot; class=&quot;headerlink&quot; title=&quot;02 切片slice&quot;&gt;&lt;/a&gt;02 切片slice&lt;/h1&gt;&lt;h2 id=&quot;切片的定义&quot;&gt;&lt;a href=&quot;#切片的定义&quot; class=&quot;he</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>02gin模板语法（上）</title>
    <link href="http://riyuejuyjyj.github.io/posts/b2dd6d15.html"/>
    <id>http://riyuejuyjyj.github.io/posts/b2dd6d15.html</id>
    <published>2022-11-24T08:32:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="gin-day02-gin模板语法（上）"><a href="#gin-day02-gin模板语法（上）" class="headerlink" title="gin day02 gin模板语法（上）"></a>gin day02 gin模板语法（上）</h1><h2 id="模板定义"><a href="#模板定义" class="headerlink" title="模板定义"></a>模板定义</h2><p>随着项目的开发我们的html文件肯定也越来越多，必然不可能直接把所有html全部放在templates目录下，那么必然会在模板目录下再新建文件夹进行分类，所以之前的模板的设置方式就不在使用了</p><p>现改为</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.LoadHTMLGlob(<span class="string">&#x27;./templates/**/*&#x27;</span>)</span><br></pre></td></tr></table></figure><p>然后我们必须在html文件前定义其名字</p><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-24%20073044.jfif" alt="image"></p><p>我们可以看到在default目录下的index.html我们将其定义为如下</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;define &quot;default/index.html&quot;&#125;&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>woshi admin news<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="模板变量的定义"><a href="#模板变量的定义" class="headerlink" title="模板变量的定义"></a>模板变量的定义</h2><p>在go语言中我们定义变量通常用var a int&#x3D;30</p><p>而在模板中我们通常用$ a:&#x3D;80</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;$a:=80&#125;&#125; <span class="comment">&lt;!--定义变量a--&gt;</span></span><br><span class="line">&#123;&#123;$a:=.title&#125;&#125;<span class="comment">&lt;!--title是后台传过来的值--&gt;</span></span><br><span class="line">&#123;&#123;$a&#125;&#125; <span class="comment">&lt;!--输出变量a--&gt;</span></span><br></pre></td></tr></table></figure><h2 id="变量之间的比较"><a href="#变量之间的比较" class="headerlink" title="变量之间的比较"></a>变量之间的比较</h2><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;.score&#125;&#125; <span class="comment">&lt;!--后端传过来的score--&gt;</span></span><br><span class="line">&#123;&#123; if ge .score 60 &#125;&#125; <span class="comment">&lt;!--ge 表示&gt;=--&gt;</span></span><br><span class="line"></span><br><span class="line">&#123;&#123;else&#125;&#125;</span><br><span class="line"></span><br><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure><ul><li>ge表示&gt;&#x3D;</li><li>gt表示&gt;</li><li>eq表示&#x3D;&#x3D;</li><li>lt表示&lt;</li><li>le表示&lt;&#x3D;</li><li>ne表示!&#x3D;</li></ul><h2 id="if-语句"><a href="#if-语句" class="headerlink" title="if 语句"></a>if 语句</h2><p><strong>上面代码以提到在此不赘述</strong></p><h2 id="for循环遍历"><a href="#for循环遍历" class="headerlink" title="for循环遍历"></a>for循环遍历</h2><h3 id="遍历数组"><a href="#遍历数组" class="headerlink" title="遍历数组"></a>遍历数组</h3><p>假设后端传过来一个string1</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">    context.HTML(<span class="number">200</span>,<span class="string">&quot;default/index.html&quot;</span>,gin.H&#123;</span><br><span class="line">        <span class="string">&quot;string1&quot;</span>:[<span class="number">5</span>]<span class="type">string</span>&#123;<span class="string">&quot;zhangsan&quot;</span>,<span class="string">&quot;lisi&quot;</span>,<span class="string">&quot;wangwu&quot;</span>&#125;,</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>html代码如下</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;range $_,$v= .string1&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>&#123;&#123;$v&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">&#123;&#123;else&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>数组中没有数据<span class="tag">&lt;/<span class="name">li</span>&gt;</span>li&gt;</span><br><span class="line">&#123;&#123;&#125;&#125;</span><br></pre></td></tr></table></figure><h3 id="遍历切片"><a href="#遍历切片" class="headerlink" title="遍历切片"></a>遍历切片</h3><p>和数组几乎一样</p><p>假设后端传过来一个slice1</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">    context.HTML(<span class="number">200</span>,<span class="string">&quot;default/index.html&quot;</span>,gin.H&#123;</span><br><span class="line">        <span class="string">&quot;slice1&quot;</span>:[]<span class="type">string</span>&#123;<span class="string">&quot;zhangsan&quot;</span>,<span class="string">&quot;lisi&quot;</span>,<span class="string">&quot;wangwu&quot;</span>&#125;,</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>html代码如下</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123;range $_,$v= .slice1&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>&#123;&#123;$v&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">&#123;&#123;else&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>数组中没有数据<span class="tag">&lt;/<span class="name">li</span>&gt;</span>li&gt;</span><br><span class="line">&#123;&#123;&#125;&#125;</span><br></pre></td></tr></table></figure><h3 id="遍历结构体"><a href="#遍历结构体" class="headerlink" title="遍历结构体"></a>遍历结构体</h3><p>定义一个结构体,并将其传入</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">type</span> Article <span class="keyword">struct</span>&#123;</span><br><span class="line">    Title <span class="type">string</span></span><br><span class="line">    Content <span class="type">string</span></span><br><span class="line">&#125;</span><br><span class="line">r.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>&#123;</span><br><span class="line">    context.HTML(<span class="number">200</span>,<span class="string">&quot;default/news.html&quot;</span>,gin.H&#123;</span><br><span class="line">        <span class="string">&quot;articles&quot;</span>:[]<span class="keyword">interface</span>&#123;&#125;&#123;</span><br><span class="line">            &amp;Article&#123;</span><br><span class="line">                <span class="string">&quot;Title&quot;</span>:<span class="string">&quot;title11&quot;</span>,</span><br><span class="line">                <span class="string">&quot;Content&quot;</span>:<span class="string">&quot;content11&quot;</span>,</span><br><span class="line">            &#125;,</span><br><span class="line">            &amp;Article&#123;</span><br><span class="line">                <span class="string">&quot;Title&quot;</span>:<span class="string">&quot;title22&quot;</span>,</span><br><span class="line">                <span class="string">&quot;Content&quot;</span>:<span class="string">&quot;content22&quot;</span>,</span><br><span class="line">            &#125;,</span><br><span class="line">        &#125;,</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p><strong>这里要注意 ，</strong></p><p>以下是html中的代码</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123; range $_,$v:=.articels &#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>&#123;&#123;$v.Title&#125;&#125;--&#123;&#123;$v.Content&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">&#123;&#123;else&#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>结构体没数据<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-24%20082116.jfif" alt="image"></p><h2 id="with解析结构体"><a href="#with解析结构体" class="headerlink" title="with解析结构体"></a>with解析结构体</h2><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;&#123; with .new_articel &#125;&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;.Title&#125;&#125;--&#123;&#123;.Content&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">&#123;&#123;end&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-24%20082554.jfif" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;gin-day02-gin模板语法（上）&quot;&gt;&lt;a href=&quot;#gin-day02-gin模板语法（上）&quot; class=&quot;headerlink&quot; title=&quot;gin day02 gin模板语法（上）&quot;&gt;&lt;/a&gt;gin day02 gin模板语法（上）&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/categories/gin/"/>
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/tags/gin/"/>
    
  </entry>
  
  <entry>
    <title>01.路由的创建与数据的响应</title>
    <link href="http://riyuejuyjyj.github.io/posts/c02163f6.html"/>
    <id>http://riyuejuyjyj.github.io/posts/c02163f6.html</id>
    <published>2022-11-21T17:40:00.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="gin-day1路由创建以及多种响应方式"><a href="#gin-day1路由创建以及多种响应方式" class="headerlink" title="gin_day1路由创建以及多种响应方式"></a>gin_day1路由创建以及多种响应方式</h1><h2 id="1-路由的创建"><a href="#1-路由的创建" class="headerlink" title="1.路由的创建"></a>1.路由的创建</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r=gin.Default()</span><br></pre></td></tr></table></figure><blockquote><p>需要导入”github.com&#x2F;gin-gonic&#x2F;gin”</p></blockquote><h2 id="2-创建模板文件夹"><a href="#2-创建模板文件夹" class="headerlink" title="2.创建模板文件夹"></a>2.创建模板文件夹</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.LoadHTMLGlob(<span class="string">&quot;./templates/*&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="3-创建首页get响应，返回string数据"><a href="#3-创建首页get响应，返回string数据" class="headerlink" title="3.创建首页get响应，返回string数据"></a>3.创建首页get响应，返回string数据</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    context.<span class="type">string</span>(<span class="number">200</span>,<span class="string">&quot;值:%v&quot;</span>,<span class="string">&quot;hello world&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20174622.jfif" alt="image-20221025224539446"><br>200 为状态码,中间是格式,后面是值</p><h2 id="4-返回json数据"><a href="#4-返回json数据" class="headerlink" title="4.返回json数据"></a>4.返回json数据</h2><h3 id="1-空接口类型json"><a href="#1-空接口类型json" class="headerlink" title="1.空接口类型json"></a>1.空接口类型json</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/json1&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    context.json(<span class="number">200</span>,<span class="keyword">map</span>[<span class="type">string</span>]<span class="keyword">interface</span>&#123;&#125;&#123;</span><br><span class="line">        <span class="string">&quot;success&quot;</span>:<span class="number">200</span></span><br><span class="line">        <span class="string">&quot;sb&quot;</span>:你</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20174946.jfif" alt="image"></p><h3 id="2-返回结构体json"><a href="#2-返回结构体json" class="headerlink" title="2.返回结构体json"></a>2.返回结构体json</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">type</span> Article <span class="keyword">struct</span>&#123;</span><br><span class="line">    Title <span class="type">string</span> <span class="string">`json:&quot;title&quot;`</span></span><br><span class="line">    Desc <span class="type">string</span>  <span class="string">`json:&quot;desc&quot;`</span></span><br><span class="line">    Content <span class="type">string</span> <span class="string">`json:&quot;content&quot;`</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175006.jfif" alt="image"><br><strong>后面是指以json数据时，返回title而不是Title</strong></p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/json2&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    a:=Article&#123;</span><br><span class="line">        Title:<span class="string">&quot;woshibiaoti&quot;</span>,</span><br><span class="line">        Desc:<span class="string">&quot;woshidesc&quot;</span>,</span><br><span class="line">        Content:<span class="string">&quot;woshineirong&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">   context.json(<span class="number">200</span>,a)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-返回jsonp数据"><a href="#5-返回jsonp数据" class="headerlink" title="5.返回jsonp数据"></a>5.返回jsonp数据</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/jsonp&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    a:=Article&#123;</span><br><span class="line">        Title:<span class="string">&quot;woshibiaoti&quot;</span>,</span><br><span class="line">        Desc:<span class="string">&quot;woshidesc&quot;</span>,</span><br><span class="line">        Content:<span class="string">&quot;woshineirong&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">   context.jsonp(<span class="number">200</span>,a)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175039.jfif" alt="image"><br>jsonp与json的区别在于jsonp可以加上回调函数 &#x2F;josnp?callback&#x3D;&#x3D;xxxx</p><h2 id="6-返回xml数据"><a href="#6-返回xml数据" class="headerlink" title="6.返回xml数据"></a>6.返回xml数据</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/xml&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    context.XML(<span class="number">200</span>,gin.H&#123;</span><br><span class="line">        <span class="string">&quot;successs&quot;</span>:<span class="number">200</span></span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175101.jfif" alt="image"></p><h2 id="7-返回html页面"><a href="#7-返回html页面" class="headerlink" title="7.返回html页面"></a>7.返回html页面</h2><p>要返回html页面一定要设置模板文件夹</p><figure class="highlight go"><table><tr><td class="code"><pre><span class="line">r.GET(<span class="string">&quot;/news&quot;</span>,<span class="function"><span class="keyword">func</span><span class="params">(context *gin.Context)</span></span>)&#123;</span><br><span class="line">    context.HTML(http.StatusOK,<span class="string">&quot;news.html&quot;</span>,gin.H&#123;</span><br><span class="line">        <span class="string">&quot;title&quot;</span>:<span class="string">&quot;woshibiaoti&quot;</span><span class="comment">//给模板html传值</span></span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;&#123;.title&#125;&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175133.jfif" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;gin-day1路由创建以及多种响应方式&quot;&gt;&lt;a href=&quot;#gin-day1路由创建以及多种响应方式&quot; class=&quot;headerlink&quot; title=&quot;gin_day1路由创建以及多种响应方式&quot;&gt;&lt;/a&gt;gin_day1路由创建以及多种响应方式&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/categories/gin/"/>
    
    
    <category term="gin" scheme="http://riyuejuyjyj.github.io/tags/gin/"/>
    
  </entry>
  
  <entry>
    <title>1.go的一些基本知识</title>
    <link href="http://riyuejuyjyj.github.io/posts/ae1af740.html"/>
    <id>http://riyuejuyjyj.github.io/posts/ae1af740.html</id>
    <published>2022-11-16T17:28:30.000Z</published>
    <updated>2023-01-02T13:01:41.769Z</updated>
    
    <content type="html"><![CDATA[<h2 id="变量定义"><a href="#变量定义" class="headerlink" title="变量定义"></a>变量定义</h2><div class="tip "><p>变量定义感觉很像js和c的结合</p></div><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> name <span class="type">string</span> = <span class="string">&quot;周桐&quot;</span></span><br><span class="line"><span class="keyword">var</span> age <span class="type">int</span> = <span class="number">20</span></span><br><span class="line"><span class="built_in">print</span>(name)</span><br><span class="line">fmt.Println(name, age)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="变量的初始化"><a href="#变量的初始化" class="headerlink" title="变量的初始化"></a>变量的初始化</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> (</span><br><span class="line">name <span class="type">string</span></span><br><span class="line">age  <span class="type">int</span></span><br><span class="line">addr <span class="type">string</span></span><br><span class="line">)</span><br><span class="line">name = <span class="string">&quot;zhoutong&quot;</span></span><br><span class="line">age = <span class="number">20</span></span><br><span class="line">addr = <span class="string">&quot;huaikou&quot;</span></span><br><span class="line"><span class="comment">//string默认值为空，int为0</span></span><br><span class="line"><span class="comment">//在go语言中如果有未使用的变量，会报错</span></span><br><span class="line"><span class="comment">//var 定义变量，如果没有赋值，就会有其默认值</span></span><br><span class="line">fmt.Println(name, age, addr)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="理解变量"><a href="#理解变量" class="headerlink" title="理解变量"></a>理解变量</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">   <span class="keyword">var</span> num <span class="type">int</span> = <span class="number">20</span></span><br><span class="line">   fmt.Printf(<span class="string">&quot;num:%d,内存地址为:%p&quot;</span>, num, &amp;num)</span><br><span class="line">   num=<span class="number">30</span></span><br><span class="line">   fmt.Printf(<span class="string">&quot;num:%d,内存地址为:%p&quot;</span>, num, &amp;num)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/image-20221025224539446.jfif" alt="image-20221025224539446"></p><h2 id="变量的交换"><a href="#变量的交换" class="headerlink" title="变量的交换"></a>变量的交换</h2><blockquote><p>这里就有点像python，可以不用中间量</p></blockquote><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">   <span class="keyword">var</span> a <span class="type">int</span> = <span class="number">100</span></span><br><span class="line">   <span class="keyword">var</span> b <span class="type">int</span> = <span class="number">200</span></span><br><span class="line">   fmt.Println(a, b)</span><br><span class="line">   b, a = a, b</span><br><span class="line">   fmt.Println(a, b)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="匿名变量"><a href="#匿名变量" class="headerlink" title="匿名变量"></a>匿名变量</h2><blockquote><p>通过匿名变量接受不需要的参数，比较重要的知识点</p></blockquote><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test</span><span class="params">()</span></span> (<span class="type">int</span>, <span class="type">int</span>) &#123;</span><br><span class="line">   <span class="keyword">return</span> <span class="number">100</span>, <span class="number">200</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">   <span class="keyword">var</span> a, b <span class="type">int</span> = test()</span><br><span class="line">   fmt.Println(a, b)</span><br><span class="line">   <span class="keyword">var</span> c, _ <span class="type">int</span> = test()</span><br><span class="line">   fmt.Println(c)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/image-20221025224925574.jfif" alt="image-20221025224925574"></p><h2 id="常量通过const定义"><a href="#常量通过const定义" class="headerlink" title="常量通过const定义"></a>常量通过const定义</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">const</span> name <span class="type">string</span> = <span class="string">&quot;aaa&quot;</span></span><br><span class="line">    <span class="keyword">const</span> (</span><br><span class="line">n1=<span class="number">100</span></span><br><span class="line">        n2</span><br><span class="line">        n3</span><br><span class="line">    )</span><br><span class="line">    fmt.Println(n1,n2,n3)</span><br><span class="line">fmt.Println(name)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iota的用法"><a href="#iota的用法" class="headerlink" title="iota的用法"></a>iota的用法</h2><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">   <span class="keyword">const</span> url <span class="type">string</span> = <span class="string">&quot;www.baidu.com&quot;</span></span><br><span class="line">   <span class="keyword">const</span> url1 = <span class="string">&quot;www.4399.com&quot;</span></span><br><span class="line">   <span class="keyword">const</span> (</span><br><span class="line">      a = <span class="literal">iota</span></span><br><span class="line">      b = <span class="literal">iota</span></span><br><span class="line">      c = <span class="literal">iota</span></span><br><span class="line">   )</span><br><span class="line">   <span class="keyword">const</span> (</span><br><span class="line">      d = <span class="literal">iota</span>   <span class="comment">//iota=0</span></span><br><span class="line">      e          <span class="comment">//iota=1</span></span><br><span class="line">      f          <span class="comment">//iota=2</span></span><br><span class="line">      g = <span class="string">&quot;haha&quot;</span> <span class="comment">//iota=3</span></span><br><span class="line">      h          <span class="comment">//iota=4</span></span><br><span class="line">      i          <span class="comment">//iota=5</span></span><br><span class="line">      j = <span class="literal">iota</span>   <span class="comment">//iota=6</span></span><br><span class="line">      k          <span class="comment">//iota=7</span></span><br><span class="line">   )</span><br><span class="line">   fmt.Println(a, b, c)</span><br><span class="line">   fmt.Println(d, e, f, g, h, i, j, k)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/image-20221027212558094.jfif" alt="image-20221027212558094"></p><blockquote><p>iota上下才递增，左右不递增</p></blockquote><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span>(</span><br><span class="line">    n1,n2=<span class="literal">iota</span>+<span class="number">1</span>,<span class="literal">iota</span>+<span class="number">2</span> <span class="comment">//1,2</span></span><br><span class="line">    n3,n4 <span class="comment">//2,3</span></span><br><span class="line">    n5,n6 <span class="comment">//,</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h2 id="数组的及其相关知识"><a href="#数组的及其相关知识" class="headerlink" title="数组的及其相关知识"></a>数组的及其相关知识</h2><h3 id="一维数组"><a href="#一维数组" class="headerlink" title="一维数组"></a>一维数组</h3><p>由于比较简单直接上结果与代码</p><ul><li>数组的长度不可变</li><li>var arr3 &#x3D; […]int{12, 223, 5, 8, 9, 4} &#x2F;&#x2F;动态推导长度，但其长度还是不可改变</li><li>常用forrange遍历数组</li></ul><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> arr1 [<span class="number">3</span>]<span class="type">int</span></span><br><span class="line"><span class="keyword">var</span> arr2 [<span class="number">4</span>]<span class="type">int</span></span><br><span class="line"><span class="keyword">var</span> strArr [<span class="number">3</span>]<span class="type">string</span></span><br><span class="line">fmt.Printf(<span class="string">&quot;arr1:%T arr2:%T strArr:%T\n&quot;</span>, arr1, arr2, strArr)</span><br><span class="line"></span><br><span class="line">strArr[<span class="number">0</span>] = <span class="string">&quot;c&quot;</span></span><br><span class="line">strArr[<span class="number">1</span>] = <span class="string">&quot;python&quot;</span></span><br><span class="line">strArr[<span class="number">2</span>] = <span class="string">&quot;java&quot;</span></span><br><span class="line">fmt.Println(strArr) <span class="comment">//数组的长度不可改变</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> num_arr = [<span class="number">3</span>]<span class="type">int</span>&#123;<span class="number">23</span>, <span class="number">4</span>, <span class="number">5</span>&#125;</span><br><span class="line">fmt.Println(num_arr)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> arr3 = [...]<span class="type">int</span>&#123;<span class="number">12</span>, <span class="number">223</span>, <span class="number">5</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">4</span>&#125; <span class="comment">//动态推导长度，但其长度还是不可改变</span></span><br><span class="line">fmt.Println(<span class="built_in">len</span>(arr3))</span><br><span class="line"></span><br><span class="line">arr4 := [...]<span class="type">int</span>&#123;<span class="number">1</span>: <span class="number">5</span>, <span class="number">3</span>: <span class="number">5</span>&#125;</span><br><span class="line">fmt.Println(arr4) <span class="comment">//长度是以最大的key</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="built_in">len</span>(arr3); i++ &#123;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%d &quot;</span>, arr3[i])</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println()</span><br><span class="line"><span class="keyword">for</span> _, v := <span class="keyword">range</span> arr3 &#123;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%d &quot;</span>, v)</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println()</span><br><span class="line"><span class="keyword">var</span> max = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> _, v := <span class="keyword">range</span> arr3 &#123;</span><br><span class="line"><span class="keyword">if</span> v &gt;= max &#123;</span><br><span class="line">max = v</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">fmt.Printf(<span class="string">&quot;arr3的最大值为:%d&quot;</span>, max)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175702.jfif" alt="image-20221027212558094"></p><h3 id="二维数组"><a href="#二维数组" class="headerlink" title="二维数组"></a>二维数组</h3><figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="comment">//值类型 引用类型</span></span><br><span class="line"><span class="comment">//基本数组类型和数组都是值类型</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> a = <span class="number">10</span></span><br><span class="line">b := a</span><br><span class="line">a = <span class="number">20</span></span><br><span class="line">fmt.Println(a, b)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> arr1 = [...]<span class="type">int</span>&#123;<span class="number">12</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>&#125;</span><br><span class="line"><span class="keyword">var</span> arr2 = arr1</span><br><span class="line">arr1[<span class="number">0</span>] = <span class="number">11</span></span><br><span class="line">fmt.Println(arr2)</span><br><span class="line">fmt.Println(arr1)</span><br><span class="line"></span><br><span class="line"><span class="comment">//切片</span></span><br><span class="line"><span class="keyword">var</span> arr3 = []<span class="type">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="keyword">var</span> arr4 = arr3 <span class="comment">//将地址赋给arr4g</span></span><br><span class="line">arr3[<span class="number">0</span>] = <span class="number">5</span></span><br><span class="line">fmt.Println(arr3)</span><br><span class="line">fmt.Println(arr4)</span><br><span class="line"></span><br><span class="line">arr := [<span class="number">2</span>][<span class="number">2</span>]<span class="type">string</span>&#123;</span><br><span class="line">&#123;<span class="string">&quot;beijing&quot;</span>, <span class="string">&quot;shanghai&quot;</span>&#125;,</span><br><span class="line">&#123;<span class="string">&quot;chengdu&quot;</span>, <span class="string">&quot;shengzheng&quot;</span>&#125;,</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println(arr)</span><br><span class="line"><span class="keyword">for</span> _, v1 := <span class="keyword">range</span> arr &#123;</span><br><span class="line"><span class="keyword">for</span> _, v := <span class="keyword">range</span> v1 &#123;</span><br><span class="line">fmt.Printf(<span class="string">&quot;%v&quot;</span>, v)</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println()</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/in-the-knife/pic_bed/raw/master/2022-11--16/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-11-22%20175827.jfif" alt="image-20221027212558094"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;变量定义&quot;&gt;&lt;a href=&quot;#变量定义&quot; class=&quot;headerlink&quot; title=&quot;变量定义&quot;&gt;&lt;/a&gt;变量定义&lt;/h2&gt;&lt;div class=&quot;tip &quot;&gt;&lt;p&gt;变量定义感觉很像js和c的结合&lt;/p&gt;
&lt;/div&gt;
&lt;figure class=&quot;hi</summary>
      
    
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/categories/go/"/>
    
    
    <category term="go" scheme="http://riyuejuyjyj.github.io/tags/go/"/>
    
  </entry>
  
</feed>
