<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>东辰行迹</title><link>https://blog.dongchenxuan.com/</link><description>一个充满文艺气息的博客、致力于分享计算机编程经验和学习笔记</description><item><title>使用frp搭建免费的内网穿透</title><link>https://blog.dongchenxuan.com/?id=79</link><description>&lt;h1&gt;frp介绍&lt;/h1&gt;&lt;p&gt;frp 是一个专注于内网穿透的高性能的反向代理应用，支持 TCP、UDP、HTTP、HTTPS 等多种协议，且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。&lt;/p&gt;&lt;p&gt;Github地址：&lt;a href=&quot;https://github.com/fatedier/frp/&quot;&gt;fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. (github.com)&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;配置教程&lt;/h1&gt;&lt;p&gt;配置frp穿透，首先必须要有一台具有外网ip的服务器(即：可以外网访问)。如果没有，接下来的教程就不用看了。配置教程主要分为两个部分，一是服务器端(外网服务器)的配置；二是客户端(内网服务器)配置。&lt;/p&gt;&lt;h2&gt;下载frp&lt;/h2&gt;&lt;p&gt;选择和系统一致的包进行下载。下载的文件包中有服务器端和客户端，需要在Windows部署客户端需要额外下载windows版本的包。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;Linux_amd64：&amp;nbsp;
Linux_arm：&amp;nbsp;
Windows_amd64：&lt;/pre&gt;&lt;h2&gt;安装frps&lt;/h2&gt;&lt;p&gt;服务端的安装以Linux为例，默认监听7500端口。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#下载包
wget&amp;nbsp;https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz&amp;nbsp;

#解压
tar&amp;nbsp;-zxvf&amp;nbsp;frp_0.52.3_linux_amd64.tar.gz&amp;nbsp;

#拷贝文件到指定目录
cd&amp;nbsp;frp_0.52.3_linux_amd64
cp&amp;nbsp;frps&amp;nbsp;/usr/frp/frps
cp&amp;nbsp;frps.toml&amp;nbsp;/usr/frp/frps.toml

#编辑frps.toml
vim&amp;nbsp;/usr/frp/frps.toml

#begin
[common]
#请按自己需求更改
#frp监听的端口，默认是7000
bind_port&amp;nbsp;=&amp;nbsp;7876&amp;nbsp;#frps服务端与客户端通信端口&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;

#frp管理后台配置
dashboard_port&amp;nbsp;=&amp;nbsp;7451
dashboard_user&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;#用户名
dashboard_pwd&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;&amp;nbsp;#口令
enable_prometheus&amp;nbsp;=&amp;nbsp;true

vhost_http_port&amp;nbsp;=&amp;nbsp;9721&amp;nbsp;&amp;nbsp;#http服务需要用到的端口
vhost_https_port&amp;nbsp;=&amp;nbsp;9722&amp;nbsp;#https服务需要用到的端口
max_pool_count&amp;nbsp;=&amp;nbsp;50

#推荐使用，只有共享密钥(secretKey)与服务器端一致的用户才能访问该服务
sk&amp;nbsp;=&amp;nbsp;&amp;quot;blog.xuanzhe.club&amp;quot;&amp;nbsp;

#日志相关
log_file&amp;nbsp;=&amp;nbsp;./frps.log
log_level&amp;nbsp;=&amp;nbsp;info
log_max_days&amp;nbsp;=&amp;nbsp;3
#end

#编辑frps.service
vim&amp;nbsp;/etc/systemd/system/frps.service

#begin
[Unit]
#&amp;nbsp;服务名称，可自定义
Description&amp;nbsp;=&amp;nbsp;frp&amp;nbsp;server
After&amp;nbsp;=&amp;nbsp;network.target&amp;nbsp;syslog.target
Wants&amp;nbsp;=&amp;nbsp;network.target

[Service]
Type&amp;nbsp;=&amp;nbsp;simple
#&amp;nbsp;启动frps的命令，需修改为您的frps的安装路径
ExecStart&amp;nbsp;=&amp;nbsp;/usr/frp/frps&amp;nbsp;-c&amp;nbsp;/usr/frp/frps.toml

[Install]
WantedBy&amp;nbsp;=&amp;nbsp;multi-user.target
#end

#启动frps
systemctl&amp;nbsp;start&amp;nbsp;frps
#自启frps
systemctl&amp;nbsp;enable&amp;nbsp;frps
#停止frps
systemctl&amp;nbsp;stop&amp;nbsp;frps
#重启frps
systemctl&amp;nbsp;restart&amp;nbsp;frps
#查看frps状态
systemctl&amp;nbsp;status&amp;nbsp;frps

#添加监听端口
#frps与客户端通信端口
sudo&amp;nbsp;firewall-cmd&amp;nbsp;--permanent&amp;nbsp;--add-port=7876/tcp
#frp管理后台端口
sudo&amp;nbsp;firewall-cmd&amp;nbsp;--permanent&amp;nbsp;--add-port=7451/tcp
#远程代理端口号
sudo&amp;nbsp;firewall-cmd&amp;nbsp;--permanent&amp;nbsp;--add-port=4526/tcp
sudo&amp;nbsp;firewall-cmd&amp;nbsp;--reload&lt;/pre&gt;&lt;h2&gt;安装frpc&lt;/h2&gt;&lt;p&gt;客户端以Windows为例&lt;/p&gt;&lt;p&gt;解压下载的包，编辑frpc.toml文件&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-basic&quot;&gt;#部署的外网IP
serverAddr&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
#外网服务绑定的端口
serverPort&amp;nbsp;=&amp;nbsp;7876

[[proxies]]
name&amp;nbsp;=&amp;nbsp;&amp;quot;2550720300&amp;quot;
type&amp;nbsp;=&amp;nbsp;&amp;quot;tcp&amp;quot;
sk&amp;nbsp;=&amp;nbsp;&amp;quot;blog.xuanzhe.club&amp;quot;
localIP&amp;nbsp;=&amp;nbsp;&amp;quot;127.0.0.1&amp;quot;
localPort&amp;nbsp;=&amp;nbsp;3389
remotePort&amp;nbsp;=&amp;nbsp;4526&lt;/pre&gt;&lt;p&gt;添加frpc到服务&lt;/p&gt;&lt;p&gt;如果choco无法启动&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;win+x&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;选择打开powershell（管理员）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;执行以下命令&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;Set-ExecutionPolicy&amp;nbsp;Bypass&amp;nbsp;-Scope&amp;nbsp;Process&amp;nbsp;-Force;&amp;nbsp;[System.Net.ServicePointManager]::SecurityProtocol&amp;nbsp;=&amp;nbsp;[System.Net.ServicePointManager]::SecurityProtocol&amp;nbsp;-bor&amp;nbsp;3072;&amp;nbsp;iex&amp;nbsp;((New-Object&amp;nbsp;System.Net.WebClient).DownloadString(&amp;#39;https://chocolatey.org/install.ps1&amp;#39;))&lt;/pre&gt;&lt;p&gt;安装完成后，cmd执行以下命令：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#安装命令
choco&amp;nbsp;install&amp;nbsp;dart-sdk
#更新命令
choco&amp;nbsp;upgrade&amp;nbsp;dart-sdk
#安装nssm
choco&amp;nbsp;install&amp;nbsp;&amp;nbsp;nssm
#安装服务
nssm&amp;nbsp;install&amp;nbsp;frpc&lt;/pre&gt;&lt;p&gt;打开NSSM的服务安装程序，填写如下的信息后，点击安装服务。&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2023/10/202310301698662995482615.png&quot; title=&quot;使用NSSM安装服务.png&quot; alt=&quot;使用NSSM安装服务.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;注：remotePort与每个客户端绑定，不可重复使用。如需绑定不同网段的内网设备，需要使用不一样的端口。&lt;/p&gt;&lt;p&gt;参考文章：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://gofrp.org/zh-cn/docs/&quot;&gt;文档 | frp (gofrp.org)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://gofrp.org/zh-cn/docs/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blog.csdn.net/h309849232/article/details/109203658&quot;&gt;如何升级dart sdk以及choco不是内部或外部命令_choco&amp;#39; 不是内部或外部命令-CSDN博客&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Mon, 30 Oct 2023 19:00:00 +0800</pubDate></item><item><title>计算机组成和体系结构 知识点 题型</title><link>https://blog.dongchenxuan.com/?id=73</link><description>&lt;h2&gt;可靠性&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;某计算机系统由下图所示的部件构成，假定每个部件的千小时可靠度都为R，则该系统的千小时可靠度为（&amp;nbsp; ）。&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2023/10/202310111697013763137104.gif&quot; title=&quot;116_690910.gif&quot; alt=&quot;116_690910.gif&quot;/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;由于系统构成串联系统时，其中任何一个子系统失效就足以使系统失效，其可靠度等于各子系统可靠度的乘积。&lt;/p&gt;&lt;p&gt;构成并联系统时，只要有一个子系统正常工作，系统就能正常工作。设每个子系统的可靠性分别以R&lt;sub&gt;1&lt;/sub&gt;，R&lt;sub&gt;2&amp;nbsp;&lt;/sub&gt;&amp;nbsp;... R&lt;sub&gt;N&lt;/sub&gt;表示，则并联系统的可靠度为：&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; R=1-（1-R&lt;sub&gt;1&lt;/sub&gt;)&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;（1-R&lt;sub&gt;2&lt;/sub&gt;&lt;/span&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;)（&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;1-R&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); white-space: normal; background-color: rgb(223, 240, 216);&quot;&gt;3&lt;/sub&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;）...（1-R）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;因此，本系统的可靠度为R（1-（1-R）&lt;sup&gt;2&lt;/sup&gt;）&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;alert alert-info&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;系统类型&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;可靠性&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;失效率&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;串联系统&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;R=R&lt;sub&gt;1&lt;/sub&gt;×R&lt;sub&gt;2&lt;/sub&gt;×...×R&lt;sub&gt;n&lt;/sub&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;λ=λ&lt;sub&gt;1&lt;/sub&gt;+λ&lt;sub&gt;2+&lt;/sub&gt;...+λ&lt;sub&gt;n&lt;/sub&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;并联系统&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;R=1-(1-R&lt;sub&gt;1&lt;/sub&gt;)×(1-R&lt;sub&gt;2&lt;/sub&gt;)×...×(1-R&lt;sub&gt;n&lt;/sub&gt;)&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&amp;nbsp;&lt;img src=&quot;https://images0.cnblogs.com/blog2015/652582/201504/270850408968756.png&quot; alt=&quot;&quot; width=&quot;74&quot; height=&quot;59&quot; style=&quot;border: 0px; max-width: 100%; height: auto;&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;模冗余系统&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&amp;nbsp;&lt;img src=&quot;https://images0.cnblogs.com/blog2015/652582/201504/270845180529853.png&quot; alt=&quot;&quot; width=&quot;116&quot; height=&quot;37&quot; class=&quot;medium-zoom-image&quot; style=&quot;border: 0px; max-width: 100%; height: auto; cursor: zoom-in; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) 0s !important;&quot;/&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月11日 17:46:32&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;总线系统&lt;br/&gt;&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;在计算机系统中采用总线结构，便于实现系统的积木化构造，同时可以（&amp;nbsp; ）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;提供数据传输速度&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;提高数据传输量&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;减少信息传输线的数量&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;减少指令系统的复杂性&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;总线是在计算机中连接两个或多个功能部件的一组共享的信息传输线，它的主要特征就是多个部件共享传输介质。它是构成计算机系统的骨架，是各个功能部件之间进行信息传输的公共通道，借助总线的连接，计算机各个部件之间可以传送地址、数据和各种控制信息。在计算机系统中采用总线结构，便于实现系统的积木化构造，同时可以有效减少信息传输线的数量。&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月12日 22:35:26&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;流水线的计算&lt;br/&gt;&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;若指令流水线把一条指令分为取值、分析和执行三部分，且三部分的时间分别是取值2ns、分析2ns、执行1ns。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;流水线周期是多少？&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;100条指令全部执行完备需要多少时间？&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;流水线的吞吐率是多少？&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;流水线的周期为花费时间最长的阶段所花费的时间，所以流水线的周期就是2ns。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;根据理论公式，T=（2+2+1）+（100-1）*2=5+99*2=203ns&lt;/p&gt;&lt;p&gt;根据实践公式，T=（3+100-1）*2=204ns&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;理论&lt;/span&gt;吞吐率：TP=100/203&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;实际&lt;/span&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;吞吐率：&lt;/span&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;TP=100/204&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; background-color: #DFF0D8;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;alert alert-info&quot;&gt;&lt;p&gt;①关于流水线的周期，我们需要知道的是，流水线周期（△t）为指令执行阶段中执行时间最长的一段。&lt;/p&gt;&lt;p&gt;②流水线的计算公式为：&lt;/p&gt;&lt;p&gt;　　完成一条指令所需的时间+（指令条数-1）*流水线周期，在这个公式中，又存在理论公式和实践公式。&lt;/p&gt;&lt;p&gt;　　理论公式：（ t&lt;sub&gt;1&amp;nbsp;&lt;/sub&gt;+ t&lt;sub&gt;2&amp;nbsp;&lt;/sub&gt;+ ... + t&lt;sub&gt;n&lt;/sub&gt;）+（n-1）×&amp;nbsp;&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;△t&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;　　实践公式：（ k + n - 1）&lt;span style=&quot;color: #31708F; background-color: #D9EDF7;&quot;&gt;×&amp;nbsp;&lt;/span&gt;△t&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;k为一条指令所包含的部分的多少&lt;/p&gt;&lt;p&gt;③吞吐率的计算公式为：&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TP=n/T&lt;sub&gt;k&lt;/sub&gt;=n/（kΔt+(n−1)Δt）&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月13日 17:25:49&lt;br/&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;存储系统&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;计算机系统的主存主要是由&lt;span style=&quot;text-decoration-line: underline;&quot;&gt;（&lt;/span&gt;&lt;span style=&quot;text-indent: 28px; font-size: 14px; text-decoration-line: underline;&quot;&gt;&lt;span style=&quot;;line-height:150%;font-family:宋体&quot;&gt;5）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-indent: 28px; font-size: 14px; line-height: 150%; font-family: 宋体;&quot;&gt;构成的。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p style=&quot;line-height:150%&quot;&gt;&lt;span style=&quot;;line-height:150%;font-family:宋体&quot;&gt;DRAM&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height:150%&quot;&gt;&lt;span style=&quot;;line-height:150%;font-family:宋体&quot;&gt;SRAM&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height:150%&quot;&gt;&lt;span style=&quot;;line-height:150%;font-family:宋体&quot;&gt;Cache&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height:150%&quot;&gt;&lt;span style=&quot;;line-height:150%;font-family:宋体&quot;&gt;EEPROM&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;主存主要采用动态随机存储器DRAM&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;Cache采用静态随机存储器SRAM&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;EEPROM是电擦除可编程的只读存储器&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月18日 17:47:58&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;高速缓存Cache&lt;br/&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;（2017年下半年上午试题6）以下关于Cache（高速缓冲存储器）的叙述中，不正确的是（ A ）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;Cache的设置扩大了主存的容量&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cache的内容是主存部分内容的拷贝&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cache的命中率并不随其容量增大线性地提高&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cache位于主存与CPU之间&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;更新时间：&lt;/p&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;（2016年下半年上午试题6）一下关于Cache与主存间地址映射的叙述中，正确的是（ D ）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;操作系统负责管理Cache与主存之间的地址映射&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;程序员需要通过编程来处理Cache与主存之间的地址映射&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;应用软件对Cache与主存的地址映射进行调度&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;有硬件自动完成Cache与主存之间的地址映射&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;更新时间：&lt;/p&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;主存与Cache的地址映射方式中，（&amp;nbsp; &amp;nbsp;）方式可以实现主存的任意一块装入Cache中任意位置，只有装满才需要替换。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;全相联&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;直接映射&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;组相联&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;串并联&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;全相联映射：各主存块可以映射到cache的任意数据块。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;直接相连映射：各主存块只能映射到cache中的固定块。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;组相连映射：各主存块只能映射到cache固定组中的任意块。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月18日 13:40:30&lt;/p&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;某内存64块，cache有4块，一个块为4个字节，按字节编址。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot;custom_num list-paddingleft-1&quot; style=&quot;list-style-type: num;&quot;&gt;&lt;li class=&quot;list-num-1-1 list-num-paddingleft-1&quot;&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;采用全相联映射方式，写出cache和主存地址格式。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;list-num-1-2 list-num-paddingleft-1&quot;&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;采用直接映射方式，写出cache和主存地址格式。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;全相联映射方式中主存的主存块标记是全部块标记，&lt;/p&gt;&lt;p&gt;根据主存和cache的对应关系，一个块为4个字节，能得出主存和cache的块内地址的位数都是2位，根据cache的块数是4，得出cache块的位数是2。&lt;/p&gt;&lt;p&gt;因为主存的块数为64块，得出主存块标记的位数是6位。&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2023/10/202310181697621102691609.png&quot; title=&quot;QQ截图20231018172426.png&quot; alt=&quot;QQ截图20231018172426.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;cache：4块=4*4字节=2的4次方字节，cache的总位数是4。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;主存：64块=64*4字节=2的8次方字节，主存的总位数是8&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;由题意得：一个块4个字节，就是2的2次方，可以得出cache的块内地址为2位，又因为cache的总位数是4，所以得出cache块有（4-2）位&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2023/10/202310181697621115750198.png&quot; title=&quot;QQ截图20231018172439.png&quot; alt=&quot;QQ截图20231018172439.png&quot;/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;更新时间：2023年10月18日 17:26:47&lt;br/&gt;&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;主存的编址&lt;br/&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;内存地址从AC000H到C7FFFH，共有（&amp;nbsp; &amp;nbsp;）K个地址单元，如果该内存地址按字（16bit）编址，由28片存储器芯片构成。已知构成此内存的芯片每片有16K个存储单元，则该芯片每个存储单元存储（&amp;nbsp; &amp;nbsp;）位。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot;custom_num2 list-paddingleft-1&quot; style=&quot;list-style-type: num2;&quot;&gt;&lt;li class=&quot;list-num-3-1 list-num2-paddingleft-1&quot;&gt;&lt;p&gt;A. 96&amp;nbsp; &amp;nbsp; &amp;nbsp;B. 112&amp;nbsp; &amp;nbsp; C. 132&amp;nbsp; &amp;nbsp; &amp;nbsp;D. 156&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;list-num-3-2 list-num2-paddingleft-1&quot;&gt;&lt;p&gt;A. 4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;B. 8&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C. 16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;D. 24&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;地址单元数量：&lt;/p&gt;&lt;p&gt;十六进制计算：C7FFF - AC000 + 1 = C8000 -AC000 = 1C000&lt;br/&gt;&lt;/p&gt;&lt;p&gt;十进制：（&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;1C000）&lt;sub&gt;16&lt;/sub&gt; = （ 1 × 16&lt;sup&gt;4&lt;/sup&gt; + 12 × 16&lt;sup&gt;3&lt;/sup&gt; ）÷ 1024 =&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;（ 1 × 16&lt;/span&gt;&lt;sup style=&quot;color: rgb(60, 118, 61); text-wrap: wrap;&quot;&gt;4&lt;/sup&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;&amp;nbsp;+ 12 × 16&lt;/span&gt;&lt;sup style=&quot;color: rgb(60, 118, 61); text-wrap: wrap;&quot;&gt;3&lt;/sup&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;&amp;nbsp;）÷ （ 4 × 16&lt;sup&gt;2&amp;nbsp;&lt;/sup&gt;）&amp;nbsp;&lt;/span&gt;= 16&lt;span style=&quot;font-size: 11.6667px;&quot;&gt;&amp;nbsp;× &lt;/span&gt;4 + 3 × 16 =&amp;nbsp; 112&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;单元存储数量：&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;112 × 16 ÷ 28 × 16 = 4&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月18日 13:11:21&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;存储管理&lt;/h2&gt;&lt;h3&gt;分页存储管理&lt;br/&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;进程P有6个页面，页号为0~5，页面大小为4K，页面变换表如下所示。表中状态位等于1和0分别表示页面存在内存和不存在内存。假设系统给进程P分配了4个存储块，进程P要访问的逻辑地址为十六进制5A29H，那么该地址经过变换后，其物理地址应为十六进制&lt;span style=&quot;text-decoration: underline;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;（1）；如果进程P要访问的页面4不在内存，那么应该淘汰页号为&lt;span style=&quot;text-decoration: underline;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;（2）的页面。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;页号&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;页帧号&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;状态位&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;访问位&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;修改位&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;3&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;5&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;3&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;-&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;4&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;-&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td width=&quot;260&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;5&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;6&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;（1）A. 1A29H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B. 3A29H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C. 5A29H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;D. 6A29H&lt;/p&gt;&lt;p&gt;（2）A. 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B. 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C. 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; D. 5&lt;/p&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;（1）查表可知：页号5对应的物理块号为6，十六进制为：6H，把原来的5A29H中的5换成6即可（因为其页内地址不变），即最终物理地址为：6A29H&lt;/p&gt;&lt;p&gt;（2）&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;查表可知：在内存的页有0、1、2、5，被访问过的页有1、2、5，被淘汰的页首先必须在内存中，淘汰的页号是最近没有被访问的页号，最后是没有修改的页号，即应该淘汰的页号为：1&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月18日 18:12:22&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;页面置换算法&lt;br/&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;假设系统为某进程分配了三个内存块，并考虑到有以下页面号引用串（会依次访问这些页面）：7，0，1，2，0，3，0，4，2，3，0，3，2，1，2，0，1，7，0，1&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;最佳置换算法（OPT，optimal）：每次选择淘汰的是以后永不使用，或者在最长时间内不再被访问的页面，这样可以保证最低的缺页率。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;56&quot;&gt;访问页面&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;7&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;4&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;7&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;56&quot;&gt;内存块1&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;7&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;7&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;56&quot;&gt;内存块2&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;4&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;0&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;56&quot;&gt;内存块3&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;3&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all;&quot; height=&quot;19&quot; width=&quot;56&quot;&gt;是否缺页&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;√&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;√&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;√&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;√&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; height=&quot;19&quot; width=&quot;8&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;更新时间：2023年10月18日 18:37:21&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;输入输出技术&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;计算机系统中常用的输入/输出控制方式有无条件传送、中断、程序查询和DMA方式等。当采用（&amp;nbsp; &amp;nbsp;）方式时，不需要CPU执行程序指令来传送数据。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;中断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;程序查询&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;无条件传送&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;DMA&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;程序控制输入输出方法主要有四种：&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;中断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;程序查询：利用查询方式进行输入/输出，就是通过CPU执行程序来查询外设的状态，判断外设是否准备好接收数据或准备好向CPU输入数据。根据这种状态，CPU有针对地为外设的输入/输出服务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;无条件传送：可以无条件地随时接收CPU发来的输出数据，也能够无条件地随时向CPU提供需要的输入数据。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;DMA（直接内存存取）：是指数据在内存与I/O设备间的直接成块传送，即在内存与I/O设备间传送一个数据块的过程，不需要CPU的任何干涉，是一种完全由DMA硬件完成I/O操作的方式。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月20日 10:49:55&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;校验码&lt;br/&gt;&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;width: 1336.64px; text-wrap: wrap;&quot;&gt;&lt;li&gt;&lt;p&gt;以下关于检验码的叙述中，正确的是（ A ）。（2009下半年）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;海明码利用多组数位的奇偶性来检错和纠错&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;海明码的码距必须大于等于1&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;循环冗余校验码具有很强的检错和纠错能力&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;循环冗余校验码的码距必定为1&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;海明码的码距必须大于1，等于2可以检错，大于等于3可能纠错&lt;/p&gt;&lt;p&gt;循环冗余校验码的码距等于2，只能检错，不能纠错&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月20日 11:10:49&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;奇偶校验码&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;以下关于采用奇偶校验方法的叙述中，正确的是（ C ）。（2018年下半年）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;若所有奇数位出错，则可以检测出错误但无法纠正错误&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;若所有偶数位出错，则可以检测出错误并加以纠正&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;若有奇数个数据位出错，则可以检测出该错误但无法纠正错误&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;若有偶数个数据位出错，则可以检测出该错误并加以纠正&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;奇偶校验码的码距为2 ，所以可以检出1位错或奇数位错，无纠错能力&amp;nbsp;。&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月20日 13:14:12&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;海明码&lt;br/&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;以下关于海明码的叙述中，正确的是（ A ）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;海明码利用奇偶性进行检错和纠错&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;海明码的码距为1&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;海明码可以检错不能纠错&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;海明码中数据位的长度必须与校验位相同&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;已知数据信息为16位，最少应附加（&amp;nbsp; &amp;nbsp;）位校验位，已实现海明码纠错。（2016年下半年）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;3&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;4&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;5&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;6&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;2&lt;sup&gt;k&lt;/sup&gt; -4 ≥ 16 +k&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2&lt;sup&gt;k&lt;/sup&gt; - k ≥ 20&lt;/p&gt;&lt;p&gt;k ≥ 5&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;alert alert-info&quot;&gt;&lt;p&gt;海明码（Hamming Code）是由贝尔实验室的Richard Hamming设计的，是一种利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据之间的特定位置上插入k个校验位，通过扩大码距来实现检错和纠错。&lt;/p&gt;&lt;p&gt;设数据位为 n 位，校验位是 k 位，则 n 和 k 必须满足以下关系：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img class=&quot;kfformula&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK0AAAAuCAYAAABai5k1AAAAAXNSR0IArs4c6QAABrRJREFUeF7tm3eIJUUQh79TMUcMCAbMIiiKYlYUFUXEhDnnnLOCioJZUTGfOWJW9A8T5oCimMUA5qyIWcGE8h3V3nPY3Xszb2feG183LHfHzkxX+HXVr6r6JpBXtkDLLDChZfJmcbMFyKDNIGidBTJoW+eyLHAGbcZA6yyQQds6l2WBM2gzBlpngQza1rksC5xBmzHQOgtk0LbOZVngDNqMgdZZYJBBOz+wM3AQcCJwReusmwWuxQKDDFoV3hA4H9gbeKIWC+SPts4Cgw7ao4Atga2Bj1pn3SxwLRYYZNBOC0wEZgD2An6qxQL5o62zwCCDdj7g9qAFx7XOsv9PgdcGTgMWBuYF9gMua1rVpkE7NbAtsD7wO7Ai8AxwIfB2QfnVgWuBk4EHgUOA2YBZojhrIvLOChwOzA0c0LRzBnQ/MSNQN4pC+dGm5WwStO51DPBVgPHvAMPZwMpBAZ7uMMC+wJHAgcC6wK3AYcD08ey3NRlrTuBQYAlAirI8cF9ElZG2nBm4Mg6URePDwF81yTYInzXC3hyCbAd82bRQTYJ2rTidx0eUTbouBdwEfA/sCHwOk+75XgRsADwFXAo837RxgAWAO4EXxwCtYk0XBaPZ4A/gEuAO4Lc+yFz3lmbA64EngX0Kvqx770nfbxK0ciEBeH9BswRQOwT2Zf39XMCNwIzAF0EdzgJ+acQqkzfpFrTpDenPehGpFwKuip/vGpZ7rO2sFcwM9r5fqCCXGdAgIm06r8L7Pb/SFGjlodcAK4VD7ypIbmtLUB4NSBeWDdA6ULg3otZ18feZgDd71ry7D5QFbfqqdlUH6cwaUVBeDHzS3ba1PqVOVwdony25Uwowm/aLzzYZaeWGRtotgCOAImiPBU7vqEaNuoLXyPtrpCNpxeLAS8BDJY1d9fGqoO3cb5Eo4rYCHovo9Cogpx9tebj3DNphf1rbmJY3jqxjAStvtkj9tKRyvYA28VkzYOqdzxH6KY/+sUirlco1FWnHsmvqx64TIHXyZepaLf4tLzQNTRVU4ZQGacJ4gDbprnP3iJ/3gHOCLhWLNjPJudGjlmKYYR6I7OLB1x5LArdE0WeWKrN6Ae2qwA0ht3x2niiu5fDLhE73RHenjEylnh0E0FqdW4iZquz7DVLxMp6gTY4RlGYQOeG7Ucx83OE1gbFD/H734I/aR5AkTp/k+gzYFfihhNd7Aa1ye4ikcfL1k+JPM4fBRLntEN1WQp7Sj/YbtFbdknrTym7hxNJK1PjCeIPWyGTaV9d3gDMB23ydVMHfTxNp1v71Jh0ZKKmaKnjbaxZGY1GNonl6Aa3y2Gc3uEhhrDc625Q1umLyp/sJWveW324O7A94WgdtjRdo7fkeHACU10oNXp+CsqmD4sEu9kNTBV9lIlUVtEmepYE3Iso+1w+H9RO028SJtbfZK2AtUORaTszKLotAI95IqxfQatsVYkBi4eRIukwHwXds+z1eiKapBlgT2CloVVF2r3VaB8iJi8u2nHrZShyJikk15MkvF15M8nwQU0yLaqPsGRWKwbI++s/z/QKtgwbBKjeS1w3qqgLa1Ks1iywY9Md2348llUz8sRhNUxH2YQU+qwhVI20nn7Wzk4ZCth87+XZJNcs/3g/Q2rf0YreEXcOnJa819dxdXo3a3igDWgss20CCbDymYgJDWiBYOuf7iRqknrb//jMGBt0YoipolceiLw2AzGreDXFYYdS1B+3YXZ79SjeCVH2madAuFhHWdFzsL+pw7xU4IhyU1Q1oTdcWTx7EsVpZZXRK/NELO/Z37RK4EjVYJSp1izmHMvZGp8SR0/5VQJvksW2X+rMJtLPH4fLg2Eu3i/BNGWXLPtskaAWsBYhR4+uCoKbUzSKVNn5raAyjdQtar+wZad4q64BRnneaZpvLMWvnfN+mviNYo/ou0cteLoYP3XYQqoA2yfNaHFAHPh4gObqANgJ7T2TRkGWczDDyZ5oCrcY2Glg4jLa8lOL/UuikDLUqP8rHldVuhs6Vt9k3/TnSnjfLHolWT52yeatNe5mSLy9s5NDlBMDK3cHEBSX5chXQepXUw3JqDD2SSILZqZzXSm3TOfyo6/bdv2ZoCrR1Ojh/u5wFqoC23A41P51BW7OBB/DzDjhsUzkqtt/aupVB27vLvATu/2XbvsKnTPGOPt+v8O7QvpJBO7Sub6/iGbTt9d3QSp5BO7Sub6/iGbTt9d3QSp5BO7Sub6/iGbTt9d3QSp5BO7Sub6/iGbTt9d3QSp5BO7Sub6/iGbTt9d3QSp5BO7Sub6/i/wBX/FY+YxAnzQAAAABJRU5ErkJggg==&quot; data-latex=&quot;{2}^{k}-1≥n+k&quot;/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月20日 11:01:35&lt;/p&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;海明码利用奇偶性检错和纠错，通过在n个数据位之间插入k个校验位，扩大数据编码的码距。若 n=48，则 k 应该（&lt;span style=&quot;color: #FF0000;&quot;&gt;至少&lt;/span&gt;）为（ 6 ）。（2014年上半年）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;已知数据信息为16位，至少应附加（ 5 ）位校验位，以实现海明纠错码。（2016年下半年）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;以10位数据为例，其海明码表示为D&lt;sub&gt;9&lt;/sub&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;8&lt;/sub&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;7&lt;/sub&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;6&lt;/sub&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;5&lt;/sub&gt;D&lt;sub&gt;4&lt;/sub&gt;P&lt;sub&gt;4&lt;/sub&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;3&lt;/sub&gt;D&lt;sub&gt;2&lt;/sub&gt;D&lt;sub&gt;1&lt;/sub&gt;P&lt;sub&gt;3&lt;/sub&gt;D&lt;sub&gt;0&lt;/sub&gt;P&lt;sub&gt;2&lt;/sub&gt;P&lt;sub&gt;1&lt;/sub&gt;中，其中D&lt;sub&gt;i&lt;/sub&gt;（0 ≤ i ≤ 9）表示数据位，P&lt;sub&gt;j&lt;/sub&gt;（1 ≤ j ≤ 4）表示检验位，数据位D&lt;sub&gt;9&lt;/sub&gt;由P&lt;sub&gt;4&lt;/sub&gt;、P&lt;sub&gt;3&lt;/sub&gt;和P&lt;sub&gt;2&lt;/sub&gt;进行校验（从右至左D&lt;sub&gt;9&lt;/sub&gt;的位序为14，即等8+4+2，因此用第8位的P&lt;sub&gt;4&lt;/sub&gt;、第4位的P&lt;sub&gt;3&lt;/sub&gt;和第2位的P&lt;sub&gt;2&lt;/sub&gt;校验），数据位D&lt;sub&gt;5&lt;/sub&gt;由（ B ）进行校验。（2018年上半年）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: upper-alpha;&quot;&gt;&lt;li&gt;&lt;p&gt;P&lt;sub&gt;4&lt;/sub&gt;P&lt;sub&gt;1&lt;/sub&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;P&lt;sub&gt;4&lt;/sub&gt;P&lt;sub&gt;2&lt;/sub&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;P&lt;sub&gt;4&lt;/sub&gt;P&lt;sub&gt;3&lt;/sub&gt;P&lt;sub&gt;1&lt;/sub&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;P&lt;sub&gt;3&lt;/sub&gt;P&lt;sub&gt;2&lt;/sub&gt;P&lt;sub&gt;1&lt;/sub&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;9&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;8&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;7&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;6&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;5&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;4&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;P&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;4&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;3&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;2&lt;/sub&gt;&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;1&lt;/sub&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;P&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;3&lt;/sub&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;0&lt;/sub&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;P&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;2&lt;/sub&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;P&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;1&lt;/sub&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;14&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;13&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;12&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;11&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;10&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;9&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;8&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;7&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;6&lt;/td&gt;&lt;td width=&quot;75&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;5&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;4&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;3&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;75&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;D&lt;/span&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;5&lt;/sub&gt;&lt;sub style=&quot;text-wrap: wrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/sub&gt;&amp;nbsp;&lt;span style=&quot;color: #3C763D; text-wrap: wrap; background-color: #DFF0D8;&quot;&gt;P&lt;/span&gt;&lt;sub style=&quot;color: rgb(60, 118, 61); text-wrap: wrap; background-color: rgb(223, 240, 216);&quot;&gt;4&lt;/sub&gt;&amp;nbsp; &amp;nbsp;P&lt;sub&gt;2&lt;/sub&gt;&lt;/p&gt;&lt;p&gt;10 = 8&amp;nbsp; + 2&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月21日 15:40:58&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;RISC与CISC&lt;/h3&gt;&lt;div class=&quot;alert alert-info&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;RISC（精简指令计算机）&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;CISC（复杂指令计算机）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;指令种类&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;少、精简&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;多、丰富&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;指令复杂度&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;简单&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;复杂&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;指令长度&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;固定&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;寻址方式&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;少&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;复杂多样&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;（译码）实现方式&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;硬布线控制逻辑（组合逻辑控制器）&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;微程序控制技术&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;通用寄存器数量&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;多、大量&lt;/td&gt;&lt;td width=&quot;651&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;一般&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;流水线技术&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;适合&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;不适合&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 20 Oct 2023 11:01:55 +0800</pubDate></item><item><title>系统开发基础 知识点 题型</title><link>https://blog.dongchenxuan.com/?id=72</link><description>&lt;h2&gt;软件容错技术&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;冗余技术通常分为4类，其中（&amp;nbsp; ）按照工作方法可以分为静态、动态和混合冗余。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;冗余技术一般包括时间冗余、信息冗余、结构冗余和冗余附加技术，其中结构冗余按照工作方法可以分为静态、动态和混合冗余。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月11日 16:38:49&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 11 Oct 2023 16:12:26 +0800</pubDate></item><item><title>操作系统 知识点 题型</title><link>https://blog.dongchenxuan.com/?id=71</link><description>&lt;h2&gt;死锁资源数计算&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;某系统中仅有5个并发进程竞争某类资源，且都需要3个该类资源，那么至少有（&amp;nbsp; ）个该类资源，才能保证系统不会发生死锁。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;题目告诉我们有5个并发进程，且都需要3个资源，那么最坏的情况就是，每个进程都获得了比需要少一个的资源，即5个进程都分配了2个资源，如果这个时候，系统还有多的一个资源，那么无论分给那个进程，都不会死锁，这个时候是11个资源。因此系统只要有11个资源，那么无论怎么分配资源都不会死锁。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月11日 16:38:35&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 11 Oct 2023 16:06:59 +0800</pubDate></item><item><title>计算机网络 知识点 题型</title><link>https://blog.dongchenxuan.com/?id=70</link><description>&lt;h2&gt;子网划分与路由汇聚&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;分配给某公司的网络地址是210.115.192.0/20，该网络可以被划分为（&amp;nbsp; &amp;nbsp;）个C类子网，该公司的子网地址是（&amp;nbsp; &amp;nbsp;）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p&gt;IP：210.115.192.1&lt;/p&gt;&lt;p&gt;IP：11010010.01110011.11000000.00000000&lt;/p&gt;&lt;p&gt;子网掩码：&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;255.255.255.0/24&lt;/span&gt;&lt;/p&gt;&lt;p&gt;子网掩码：&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;11111111.11111111.11111111.00000000&lt;/span&gt;&lt;/p&gt;&lt;p&gt;子网掩码：&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;255.255.240.0/20&lt;/span&gt;&lt;/p&gt;&lt;p&gt;子网掩码：&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;11111111.11111111.11110000.00000000/20&lt;/span&gt;&lt;/p&gt;&lt;p&gt;子网数=2&lt;sup&gt;24-20&lt;/sup&gt;=16&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;子网范围：192~192+2&lt;sup&gt;0&lt;/sup&gt;+2&lt;sup&gt;1&lt;/sup&gt;+2&lt;sup&gt;2&lt;/sup&gt;=192~207&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;由于分配给公司网络的地址块是210.115.192.0/20，C类子网网络号24位，留给子网掩码的比特数只有4位，所以只能划分为2&lt;sup&gt;4&lt;/sup&gt;=16个C类子网。&lt;/p&gt;&lt;p&gt;分析IP地址块：210.115.192.0/20，网络号有20位。前2段220.115.共有16位二进制，一定在网络号范围，主要分析的是第三段192，转换为二进制结果即为1100 0000。可以将该IP写作210.115.1100 0000.0000 0000，前20位是网络号，后12位是主机号。注意：此处有2个0是网络号部分，不是主机号部分。&lt;/p&gt;&lt;p&gt;接着将这个地址块划分为C类地址，网络号需要24位，扩展了4位子网号，子网号是从主机号分出来的，新的IP地址结构为：原网络号+子网号+主机号，即210.115.1100 0000.0000 0000，只有中间的4个0才是子网号变化的范围，取值为0000-1111，综合其他数值也就是210.115.1100 0000.0000 0000 -210.115.1100 1111.0000 0000，也就是210.115.192.0-210.115.207.0范围。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;220.17.192.0/20需要划分成标准的C类子网，其子网掩码长度应该扩长到24位，增加了4比特的网络位，可以产生2^4=16个标准C类子网。对于220.17.192.0/20网络，前两段八位组是网络位，第三段8位组中有4位是网络位，我们把第IP八位组第三段用二进制展开是192=1100&amp;nbsp; 0000，后四位可以变化的值是0000~1111，亦即子网位变化值，与前四位合并后是1100 0000~1100 1111，转换成十进制为192~207，所以220.17.192.0/20得出的划分成16个标准C类子网是：&lt;/p&gt;&lt;p&gt;220.17.192.0/24，220.17.193.0/24，220.17.194.0/24，220.17.195.0/24，220.17.196.0/24，220.17.197.0/24，220.17.198.0/24，220.17.199.0/24，220.17.200.0/24，220.17.201.0/24，220.17.202.0/24，220.17.203.0/24，220.17.204.0/24，220.17.205.0/24，220.17.206.0/24，220.17.207.0/24。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;alert alert-info&quot;&gt;&lt;p&gt;IP地址根据网络号和主机号来分，分为A、B、C三类及特殊地址D、E。&amp;nbsp; &amp;nbsp; 全0和全1的都保留不用。&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;A类：(1.0.0.0-126.0.0.0)（默认子网掩码：255.0.0.0或 0xFF000000）第一个字节为网络号，后三个字节为主机号。该类IP地址的最前面为“0”，所以地址的网络号取值于1~126之间。一般用于大型网络。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;B类：(128.0.0.0-191.255.0.0)（默认子网掩码：255.255.0.0或0xFFFF0000）前两个字节为网络号，后两个字节为主机号。该类IP地址的最前面为“10”，所以地址的网络号取值于128~191之间。一般用于中等规模网络。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;C类：(192.0.0.0-223.255.255.0)（子网掩码：255.255.255.0或 0xFFFFFF00）前三个字节为网络号，最后一个字节为主机号。该类IP地址的最前面为“110”，所以地址的网络号取值于192~223之间。一般用于小型网络。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;D类：是多播地址。该类IP地址的最前面为“1110”，所以地址的网络号取值于224~239之间。一般用于多路广播用户[1]&amp;nbsp; 。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;E类：是保留地址。该类IP地址的最前面为“1111”，所以地址的网络号取值于240~255之间。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;在IP地址3种主要类型里，各保留了3个区域作为私有地址，其地址范围如下：&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;A类地址：10.0.0.0～10.255.255.255&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;B类地址：172.16.0.0～172.31.255.255&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;C类地址：192.168.0.0～192.168.255.255&lt;/p&gt;&lt;/div&gt;&lt;p&gt;更新时间：2023年10月11日 15:44:34&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 11 Oct 2023 13:09:47 +0800</pubDate></item><item><title>Go实战（篇三）使用接口封装SQL操作</title><link>https://blog.dongchenxuan.com/?id=69</link><description>&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;图片待插入&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;引言&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;在C++中，通过使用关键字&lt;/span&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;public、protected和pri&lt;/span&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;vate实现对类的封装和继承。其中public和private实现了类的封装，protected&lt;/span&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;实现了类的继承。在Java中，类的修饰添加了两个个关键字default和friendly。其中default同一包中的类可以访问，声明时没有加修饰符，认为是friendly。比较内容见表1。&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun; text-indent: 28px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;table data-sort=&quot;sortDisabled&quot;&gt;&lt;caption style=&quot;border-color: rgb(84, 141, 212);&quot;&gt;表1 关键字比较&lt;br/&gt;&lt;/caption&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;&lt;br/&gt;&lt;/th&gt;&lt;th style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;263&quot;&gt;C++&lt;br/&gt;&lt;/th&gt;&lt;th style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;Java&lt;/th&gt;&lt;th style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;C#&lt;/th&gt;&lt;th style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;Go&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;public&lt;/th&gt;&lt;td valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(84, 141, 212);&quot; width=&quot;267&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;可以被该类中的函数、子类的函数、友元函数访问，也可以由该类的对象访问&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;具有最大的访问权限，可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况，也就是对象或类对外的一种接口的形式。&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;公有访问，不受任何限制。&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go的关键字中没有public&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;private&lt;/th&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;267&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;可以被该类中的函数、子类的函数、友元函数访问，但不可以由该类的对象访问&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;访问权限仅限于类的内部，是一种封装的体现，例如，大多数成员变量都是修饰符为private的，它们不希望被其他任何外部的类访问。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;私有访问，只限于本类成员访问，子类、实例都不能访问。&lt;/p&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go的关键字中没有private&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;protected&lt;/th&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;267&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;可以被该类中的函数、友元函数访问，但不可以由子类的函数、该类的对象、访问&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员，其他的不可以，它相当于传递给子类的一种继承的东西&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;保护访问，只限于本类和子类访问，实例不能访问。&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go的关键字中没有protected&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;internal&lt;/th&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;267&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;C++的关键字中没有interface&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;用于声明仅包含抽象方法的特殊类型的类&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;内部访问，只限于本项目内访问，其他不能访问。&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go的关键字中没有internal&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th valign=&quot;null&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;90&quot;&gt;default&lt;/th&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;267&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;通过default关键字恢复构造函数&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;517&quot;&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;有时候也称为friendly，它是针对本包访问而设计的，任何处于本包下的类、接口、异常等，都可以相互访问，即使是父类没有用protected修饰的成员也可以。&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;271&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;C#的关键字中没有default，这里不讨论switch语句。&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border-color: rgb(84, 141, 212);&quot; width=&quot;205&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go的关键字中没有default&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;为什么要进行封装&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;提到封装的好处，我们想从函数说起。在我们学习计算机编程语言时，是不是习惯将一系列操作全部写在main函数中。在学到函数章节时，才会开始尝试并习惯将不同的操作写在不同的函数中。函数的使用，可以提高编码效率，较少定位错误的时间。在面对对象编程中，一个对象涉及多个变量和方法，在对象内部函数不受限制。对对象进行封装，使用者就不必关注方法是如何实现的。封装的好处如下：&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;提高了数据的安全性：调用者不能够通过变量名、属性名的方式来修改某个私有的成员属性&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;操作简单：封装后，调用者在使用的时候，只需调用方法即可，调用者不需要再进行判断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;隐藏了实现：实现过程对调用者是不可见的，调用者只需调用方法即可，不知道具体实现过程&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;代码实现&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数据库表结构如表2所示。&lt;/p&gt;&lt;table&gt;&lt;caption style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;表2 user_login_info表&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;名字&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;类型&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;排序规则&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;属性&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;空&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;默认&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;额外&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userID&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;int(10)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;UNSIGNED&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;否&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;无&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;color: #444444; background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;AUTO_INCREMENT&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userNum&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;em style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; white-space: normal;&quot;&gt;(主键)&lt;/em&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;varchar(20)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;uft8mb4_general_ci&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;否&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;无&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userPhone&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;varchar(11)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;uft8mb4_general_ci&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;是&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;NULL&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userMail&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;varchar(50)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;uft8mb4_general_ci&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;是&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;NULL&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userPwd&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;varchar(32)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;uft8mb4_general_ci&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;否&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;无&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userRole&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;varchar(7)&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;uft8mb4_general_ci&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;是&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;NULL&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;userLockTime&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;time&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;是&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;NULL&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;created&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;timestamp&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;否&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;CURRENT_TIMESTAMP&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;updated&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;timestamp&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;87&quot; valign=&quot;top&quot; style=&quot;border-color: rgb(221, 221, 221);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;113&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;否&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;264&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;CURRENT_TIMESTAMP&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;280&quot; valign=&quot;top&quot; style=&quot;word-break: break-all; border-color: rgb(221, 221, 221);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;ON UPDATE CURRENT_TIMESTAMP&lt;span style=&quot;white-space: pre; font-family: &amp;quot;times new roman&amp;quot;; font-size: 14px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;sqlhelper的代码如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;toolkit

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;database/sql&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fmt&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;_&amp;nbsp;&amp;quot;github.com/go-sql-driver/mysql&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;log&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;time&amp;quot;
)

const&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;USERNAME&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;PASSWORD&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;NETWORK&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;tcp&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;SERVER&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;127.0.0.1&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;PORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;3306
&amp;nbsp;&amp;nbsp;&amp;nbsp;DATABASE&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
)

type&amp;nbsp;Search&amp;nbsp;interface&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserLogin(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserRegister(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserUpdate(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserCancel(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool
}

type&amp;nbsp;User&amp;nbsp;struct&amp;nbsp;{
}

func&amp;nbsp;(user&amp;nbsp;User)&amp;nbsp;UserInfo()&amp;nbsp;{

}

func&amp;nbsp;(user&amp;nbsp;User)&amp;nbsp;UserLogin(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;db&amp;nbsp;:=&amp;nbsp;open()
&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;db.Close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;sql&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;actype&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;userNum,userPwd&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userNum&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;and&amp;nbsp;userPwd&amp;nbsp;=&amp;nbsp;&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account,&amp;nbsp;password)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;userNum,userPwd&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userPhone&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;and&amp;nbsp;userPwd&amp;nbsp;=&amp;nbsp;&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account,&amp;nbsp;password)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;userNum,userPwd&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userMail&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;and&amp;nbsp;userPwd&amp;nbsp;=&amp;nbsp;&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account,&amp;nbsp;password)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;rows,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(sql)
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;query&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;rows.Next()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;userNum,&amp;nbsp;userPasswd&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;rows.Scan(&amp;amp;userNum,&amp;nbsp;&amp;amp;userPasswd)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//err&amp;nbsp;=&amp;nbsp;rows.Scan(&amp;amp;infos.fileID,&amp;nbsp;&amp;amp;infos.fileName,&amp;nbsp;&amp;amp;infos.fileSize,&amp;nbsp;&amp;amp;infos.fileSource,&amp;nbsp;&amp;amp;infos.filePayment,&amp;nbsp;&amp;amp;infos.fileDownloads,&amp;nbsp;&amp;amp;infos.userID,&amp;nbsp;&amp;amp;infos.created,&amp;nbsp;&amp;amp;infos.updated)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;scan&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;userNum&amp;nbsp;==&amp;nbsp;account&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;userPasswd&amp;nbsp;==&amp;nbsp;password&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
}

func&amp;nbsp;(user&amp;nbsp;User)&amp;nbsp;UserRegister(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;db&amp;nbsp;:=&amp;nbsp;open()
&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;db.Close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;sql&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;actype&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;1&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userNum&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;limit&amp;nbsp;1;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;1&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userPhone&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;limit&amp;nbsp;1;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;select&amp;nbsp;1&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userMail&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;limit&amp;nbsp;1;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;rows,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(sql)
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;query&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;:=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;rows.Next()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;rows.Scan(&amp;amp;num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;scan&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;operation&amp;nbsp;Operation
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;num&amp;nbsp;==&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation&amp;nbsp;=&amp;nbsp;new(Record)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation.Writer(fmt.Sprintf(&amp;quot;user&amp;nbsp;%s&amp;nbsp;register&amp;nbsp;fault&amp;nbsp;at&amp;nbsp;%s,&amp;nbsp;because&amp;nbsp;it&amp;nbsp;exist&amp;quot;,&amp;nbsp;account,&amp;nbsp;time.Now().Format(&amp;quot;20060102&amp;quot;)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;:=&amp;nbsp;fmt.Sprintf(&amp;quot;insert&amp;nbsp;into&amp;nbsp;user_login_info&amp;nbsp;(userNum,userPwd)&amp;nbsp;values&amp;nbsp;(&amp;#39;%s&amp;#39;,&amp;#39;%s&amp;#39;)&amp;quot;,&amp;nbsp;account,&amp;nbsp;password)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation&amp;nbsp;=&amp;nbsp;new(SQL_ERROE_SAVEPATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation.Writer(err.Error()&amp;nbsp;+&amp;nbsp;&amp;quot;,&amp;quot;&amp;nbsp;+&amp;nbsp;time.Now().Format(&amp;quot;20060102&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation&amp;nbsp;=&amp;nbsp;new(Record)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operation.Writer(fmt.Sprintf(&amp;quot;user&amp;nbsp;%s&amp;nbsp;register&amp;nbsp;successful&amp;nbsp;at&amp;nbsp;%s&amp;quot;,&amp;nbsp;account,&amp;nbsp;time.Now().Format(&amp;quot;20060102&amp;quot;)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
}

func&amp;nbsp;(user&amp;nbsp;User)&amp;nbsp;UserUpdate(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;db&amp;nbsp;:=&amp;nbsp;open()
&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;db.Close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;user.UserLogin(account,&amp;nbsp;password,&amp;nbsp;actype)&amp;nbsp;==&amp;nbsp;true&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;sql&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;actype&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;update&amp;nbsp;user_login_info&amp;nbsp;set&amp;nbsp;userPwd&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;where&amp;nbsp;userNum&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;password,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;update&amp;nbsp;user_login_info&amp;nbsp;set&amp;nbsp;userPwd&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;where&amp;nbsp;userPhone&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;password,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;update&amp;nbsp;user_login_info&amp;nbsp;set&amp;nbsp;userPwd&amp;nbsp;=&amp;#39;%s&amp;#39;&amp;nbsp;where&amp;nbsp;userMail&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;password,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;update&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;idAff,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;result.RowsAffected()
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.Println(&amp;quot;RowsAffected&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;idAff&amp;nbsp;==&amp;nbsp;0&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true
}

func&amp;nbsp;(user&amp;nbsp;User)&amp;nbsp;UserCancel(account&amp;nbsp;string,&amp;nbsp;password&amp;nbsp;string,&amp;nbsp;actype&amp;nbsp;int)&amp;nbsp;bool&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;db&amp;nbsp;:=&amp;nbsp;open()
&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;db.Close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;user.UserLogin(account,&amp;nbsp;password,&amp;nbsp;actype)&amp;nbsp;==&amp;nbsp;false&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;sql&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;actype&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;delete&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userNum&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;delete&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userPhone&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;fmt.Sprintf(&amp;quot;delete&amp;nbsp;from&amp;nbsp;user_login_info&amp;nbsp;where&amp;nbsp;userMail&amp;nbsp;=&amp;#39;%s&amp;#39;;&amp;quot;,&amp;nbsp;account)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;delete&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;idAff,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;result.RowsAffected()
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.Println(&amp;quot;RowsAffected&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;idAff&amp;nbsp;==&amp;nbsp;0&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true
}

func&amp;nbsp;open()&amp;nbsp;*sql.DB&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;:=&amp;nbsp;fmt.Sprintf(&amp;quot;%s:%s@%s(%s:%d)/%s&amp;quot;,&amp;nbsp;USERNAME,&amp;nbsp;PASSWORD,&amp;nbsp;NETWORK,&amp;nbsp;SERVER,&amp;nbsp;PORT,&amp;nbsp;DATABASE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;//fmt.Println(&amp;quot;conn:&amp;quot;,&amp;nbsp;conn)

&amp;nbsp;&amp;nbsp;&amp;nbsp;db,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;sql.Open(&amp;quot;mysql&amp;quot;,&amp;nbsp;conn)

&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;connection&amp;nbsp;to&amp;nbsp;mysql&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;db
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;db.SetConnMaxLifetime(100&amp;nbsp;*&amp;nbsp;time.Second)
&amp;nbsp;&amp;nbsp;&amp;nbsp;db.SetMaxOpenConns(100)
&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;db

}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;以登陆为例，代码如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;account&amp;nbsp;:=&amp;nbsp;&amp;quot;account&amp;quot;
password&amp;nbsp;:=&amp;nbsp;&amp;quot;password&amp;quot;
actype&amp;nbsp;:=&amp;nbsp;&amp;quot;actype&amp;quot;
var&amp;nbsp;search&amp;nbsp;Search
search&amp;nbsp;=&amp;nbsp;new(User)
loginsuc&amp;nbsp;:=&amp;nbsp;search.UserLogin(account,&amp;nbsp;password,&amp;nbsp;actypeInt)
fmt.Println(loginsuc)&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;white-space: normal; text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;写在最后的话&lt;/span&gt;&lt;/h2&gt;&lt;div class=&quot;alert alert-info&quot; style=&quot;white-space: normal;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p data-id=&quot;p838747a-aIIBrmSM&quot;&gt;以上就是接口封装SQL操作的介绍了，暂时先写这么多，后面也会进行完善。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;你知道的越多，你不知道的越多，人才们的 【三连】 就是我创作的最大动力，我们下期见！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;注：如果本篇博客有任何错误和建议，欢迎人才们留言，你快说句话啊！&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Wed, 10 Aug 2022 14:14:04 +0800</pubDate></item><item><title>Go实战（篇二）使用接口构建对象</title><link>https://blog.dongchenxuan.com/?id=67</link><description>&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;什么是接口？&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 28px; font-family: 宋体, SimSun;&quot;&gt;面向对象编程(OOP)中三个基本特征分别是封装，继承，多态。在 Go 语言中封装和继承是通过 struct 来实现的，而多态则是通过接口(interface)来实现的。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;接口是一种重要的实现运行时多态的方式，也&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;是一种协议。它规范了传入的对象所必须具备的某些特征，从而保证在调用时既不会发生错误又不需要提前检查。虽然继承也能起到相同的效果，但是很多场景下使用继承会导致逻辑关系混乱，不利于抽象。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;table width=&quot;1433&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;174&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; height=&quot;18&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;高级语言&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;396&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; height=&quot;18&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;C#&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;174&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;定义&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;396&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;接口定义协定。 实现该协定的任何 class 或 struct 必须提供接口中定义的成员的实现。 从 C# 8.0 开始，接口可为成员定义默认实现。 它还可以定义 static 成员，以便提供常见功能的单个实现。 从 C# 11 开始，接口可以定义 static abstract 或 static virtual 成员来声明实现类型必须提供声明的成员。 通常，static virtual 方法声明实现必须定义一组重载运算符&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;170&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;接口示例&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;396&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;interface ISampleInterface&lt;br/&gt;{&lt;br/&gt; &amp;nbsp; &amp;nbsp;void SampleMethod();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;class ImplementationClass : ISampleInterface&lt;br/&gt;{&lt;br/&gt; &amp;nbsp; &amp;nbsp;// Explicit interface member implementation:&lt;br/&gt; &amp;nbsp; &amp;nbsp;void ISampleInterface.SampleMethod()&lt;br/&gt; &amp;nbsp; &amp;nbsp;{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Method implementation.&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;static void Main()&lt;br/&gt; &amp;nbsp; &amp;nbsp;{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Declare an interface instance.&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ISampleInterface obj = new ImplementationClass();&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Call the member.&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;obj.SampleMethod();&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table width=&quot;578&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;174&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; height=&quot;18&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;高级语言&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;407&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; height=&quot;18&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;C++&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;174&quot; valign=&quot;middle&quot; style=&quot;word-break: break-all;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;定义&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;407&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;所谓的接口，即将内部实现细节封装起来，外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。C++中，通过类实现面向对象的编程，而在基类中只给出纯虚函数的声明，然后在派生类中实现纯虚函数的具体定义的方式实现接口，不同派生类实现接口的方式也不尽相同，从而实现多态。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;170&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;接口示例&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;405&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;br/&gt;using namespace std;&lt;br/&gt;&lt;br/&gt;class Shape &lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt; &amp;nbsp; // 提供接口框架的纯虚函数&lt;br/&gt; &amp;nbsp; virtual int getArea() = 0;&lt;br/&gt; &amp;nbsp; void setWidth(int w)&lt;br/&gt;{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = w;&lt;br/&gt; &amp;nbsp; }&lt;br/&gt; &amp;nbsp; void setHeight(int h)&lt;br/&gt;{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = h;&lt;br/&gt; &amp;nbsp; }&lt;br/&gt;protected:&lt;br/&gt; &amp;nbsp; int width;&lt;br/&gt; &amp;nbsp; int height;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;// 派生类&lt;br/&gt;class Rectangle: public Shape&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt; &amp;nbsp; int getArea()&lt;br/&gt;{ &lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (width * height); &lt;br/&gt; &amp;nbsp; }&lt;br/&gt;};&lt;br/&gt;class Triangle: public Shape&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt; &amp;nbsp; int getArea()&lt;br/&gt;{ &lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (width * height)/2; &lt;br/&gt; &amp;nbsp; }&lt;br/&gt;};&lt;br/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;如何使用接口？&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;在&lt;span style=&quot;text-indent: 28px; font-family: 宋体, SimSun;&quot;&gt;面向对象编程(OOP)中，我们用不同类型的变量描述一个对象，使用关键字“new”创建对象，随后使用该变量引用该对象的公开方法。&lt;/span&gt;&lt;span style=&quot;font-family: 宋体, SimSun; text-indent: 28px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;span style=&quot;text-indent: 28px; font-family: 宋体, SimSun;&quot;&gt;在Go语言中，也有类似的方法可以用接口实现。声明一个human结构体，并构造Human接口实现Get、Set和Say方法，代码如下：&lt;/span&gt;&lt;span style=&quot;font-family: 宋体, SimSun; text-indent: 28px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;package main&lt;br/&gt;&lt;br/&gt;import (&lt;br/&gt; &amp;nbsp; &amp;quot;fmt&amp;quot;&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;//创建Human接口&lt;br/&gt;//这里实现的接口类似OOP中的“public”关键字&lt;br/&gt;type Human interface {&lt;br/&gt; &amp;nbsp; //这里用类进行描述&lt;br/&gt; &amp;nbsp; //Set一个human类，并返回该类型。如果没有返回，这个类的属性全部为空&lt;br/&gt; &amp;nbsp; Set(name string, sex string, age int) human&lt;br/&gt; &amp;nbsp; //Get方法，获取name属性&lt;br/&gt; &amp;nbsp; Name() string&lt;br/&gt; &amp;nbsp; //Get方法，获取sex属性&lt;br/&gt; &amp;nbsp; Sex() string&lt;br/&gt; &amp;nbsp; //Get方法，获取age属性&lt;br/&gt; &amp;nbsp; Age() int&lt;br/&gt; &amp;nbsp; //Say方法，输出对象的值&lt;br/&gt; &amp;nbsp; Say(h human)&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;type human struct {&lt;br/&gt; &amp;nbsp; name string&lt;br/&gt; &amp;nbsp; sex &amp;nbsp;string&lt;br/&gt; &amp;nbsp; age &amp;nbsp;int&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func (h human) Set(name string, sex string, age int) human {&lt;br/&gt; &amp;nbsp; h.name = name&lt;br/&gt; &amp;nbsp; h.sex = sex&lt;br/&gt; &amp;nbsp; h.age = age&lt;br/&gt; &amp;nbsp; return h&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func (h human) Name() string {&lt;br/&gt; &amp;nbsp; return h.name&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func (h human) Sex() string {&lt;br/&gt; &amp;nbsp; return h.sex&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func (h human) Age() int {&lt;br/&gt; &amp;nbsp; return h.age&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func (h human) Say(hu human) {&lt;br/&gt; &amp;nbsp; fmt.Printf(&amp;quot;I&amp;#39;m a %d-year-old %s,my name is %s.\n&amp;quot;, hu.age, hu.sex, hu.name)&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func main() {&lt;br/&gt;&lt;br/&gt; &amp;nbsp; //创建接口，可以看成new出一个无参对象&lt;br/&gt; &amp;nbsp; //因为接口中不存在参数，所以这里使用的是一个human类型，而不是对象&lt;br/&gt; &amp;nbsp; method := Human(new(human))&lt;br/&gt; &amp;nbsp; hu := method.Set(&amp;quot;Bob&amp;quot;, &amp;quot;boy&amp;quot;, 25)&lt;br/&gt; &amp;nbsp; fmt.Printf(&amp;quot;I&amp;#39;m a %d-year-old %s,my name is %s.\n&amp;quot;, hu.age, hu.sex, hu.name)&lt;br/&gt; &amp;nbsp; hu.Say(method.Set(&amp;quot;Alice&amp;quot;, &amp;quot;girl&amp;quot;, 24))&lt;br/&gt; &amp;nbsp; fmt.Printf(&amp;quot;I&amp;#39;m a %d-year-old %s,my name is %s.\n&amp;quot;, hu.age, hu.sex, hu.name)&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt;输出的结果为：&lt;br/&gt;I&amp;#39;m a 25-year-old boy,my name is Bob.&lt;br/&gt;I&amp;#39;m a 24-year-old girl,my name is Alice.&lt;br/&gt;I&amp;#39;m a 25-year-old boy,my name is Bob.&lt;br/&gt;&lt;br/&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;h2 style=&quot;white-space: normal; text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;写在最后的话&lt;/span&gt;&lt;/h2&gt;&lt;div class=&quot;alert alert-info&quot; style=&quot;white-space: normal;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p data-id=&quot;p838747a-aIIBrmSM&quot;&gt;以上就是Go语言操接口的介绍了，暂时先写这么多，后面也会进行完善。&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;你知道的越多，你不知道的越多，人才们的 【三连】 就是我创作的最大动力，我们下期见！&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;注：如果本篇博客有任何错误和建议，欢迎人才们留言，你快说句话啊！&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;参考：&lt;/span&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interface&quot; target=&quot;_blank&quot;&gt;接口 - C# 参考&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/zhanghui962623727/article/details/52398150&quot; target=&quot;_blank&quot; style=&quot;text-decoration: underline; font-size: medium; white-space: pre; font-family: 宋体, SimSun;&quot;&gt;&lt;span style=&quot;font-size: medium; white-space: pre; font-family: 宋体, SimSun;&quot;&gt;C++接口的定义与实现_一只特立独行的程序猿的博客-CSDN博客_c++接口开发&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/63219494&quot; target=&quot;_blank&quot; style=&quot;text-decoration: underline; font-size: medium; white-space: pre; font-family: 宋体, SimSun;&quot;&gt;&lt;span style=&quot;font-size: medium; white-space: pre; font-family: 宋体, SimSun;&quot;&gt;如何优雅的使用Go接口? - 知乎&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Tue, 09 Aug 2022 20:30:28 +0800</pubDate></item><item><title>Go实战（篇一）数据库相关操作</title><link>https://blog.dongchenxuan.com/?id=66</link><description>&lt;h1 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;数据库相关操作&lt;/span&gt;&lt;/h1&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;在信息时代，数据库技术成为软件设计与开发必不可少一部分。下面对GO连接数据库做出详细介绍。&lt;/span&gt;&lt;span style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;1 配置环境&lt;/span&gt;&lt;span style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;选择环境如下：&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;操作系统：Ubuntu 22.04LTS x64&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;sdk版本：go version go1.18.4 linux/amd64&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;在官网下载sdk，下载完成后解压到指定目录，在这里不对sdk的安装再做赘述，可参考文章如下文章：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;&lt;a href=&quot;https://blog.dongchenxuan.com/?id=60&quot;&gt;Go学习笔记（篇一）配置Go开发环境_Go_轩哲驿站 (xuanzhe.club)&lt;/a&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;在这里需要额外添加一条环境变量，所有的环境变量如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-basic&quot;&gt;#&amp;nbsp;指定sdk的目录
export&amp;nbsp;GOROOT=/opt/sdk/go
#&amp;nbsp;指定gopath的目录，用来表明你写的go项目的存放路径
export&amp;nbsp;GOPATH=/opt/sdk/go/gopath

export&amp;nbsp;PATH=$PATH:$GOROOT/bin
#&amp;nbsp;设置GOPROXY的代理
export&amp;nbsp;GOPROXY=https://goproxy.cn,direct&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;在/etc/profile文件添加以上内容后，输入命令：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;重载环境变量，让新添加的内容生效
source&amp;nbsp;/etc/profile&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;检查配置是否生效，需要输入go version，显示安装的sdk版本表明系统已成功部署Go语言开发环境；输入go env，相应的变量有对应的值，打印的内容如下：&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-basic&quot;&gt;GO111MODULE=&amp;quot;&amp;quot;
GOARCH=&amp;quot;amd64&amp;quot;
GOBIN=&amp;quot;&amp;quot;
GOCACHE=&amp;quot;/home/userName/.cache/go-build&amp;quot;
GOENV=&amp;quot;/home/userName/.config/go/env&amp;quot;
GOEXE=&amp;quot;&amp;quot;
GOEXPERIMENT=&amp;quot;&amp;quot;
GOFLAGS=&amp;quot;&amp;quot;
GOHOSTARCH=&amp;quot;amd64&amp;quot;
GOHOSTOS=&amp;quot;linux&amp;quot;
GOINSECURE=&amp;quot;&amp;quot;
GOMODCACHE=&amp;quot;/opt/sdk/go/gopath/pkg/mod&amp;quot;
GONOPROXY=&amp;quot;&amp;quot;
GONOSUMDB=&amp;quot;&amp;quot;
GOOS=&amp;quot;linux&amp;quot;
#已载入GOPATH环境变量
GOPATH=&amp;quot;/opt/sdk/go/gopath&amp;quot;
GOPRIVATE=&amp;quot;&amp;quot;
#已载入GOPOXY环境变量
GOPROXY=&amp;quot;&amp;quot;
#已载入GOROOT环境变量
GOROOT=&amp;quot;/opt/sdk/go&amp;quot;
GOSUMDB=&amp;quot;sum.golang.org&amp;quot;
GOTMPDIR=&amp;quot;&amp;quot;
GOTOOLDIR=&amp;quot;/opt/sdk/go/pkg/tool/linux_amd64&amp;quot;
GOVCS=&amp;quot;&amp;quot;
GOVERSION=&amp;quot;go1.18.4&amp;quot;
GCCGO=&amp;quot;gccgo&amp;quot;
GOAMD64=&amp;quot;v1&amp;quot;
AR=&amp;quot;ar&amp;quot;
CC=&amp;quot;gcc&amp;quot;
CXX=&amp;quot;g++&amp;quot;
CGO_ENABLED=&amp;quot;1&amp;quot;
GOMOD=&amp;quot;/dev/null&amp;quot;
GOWORK=&amp;quot;&amp;quot;
CGO_CFLAGS=&amp;quot;-g&amp;nbsp;-O2&amp;quot;
CGO_CPPFLAGS=&amp;quot;&amp;quot;
CGO_CXXFLAGS=&amp;quot;-g&amp;nbsp;-O2&amp;quot;
CGO_FFLAGS=&amp;quot;-g&amp;nbsp;-O2&amp;quot;
CGO_LDFLAGS=&amp;quot;-g&amp;nbsp;-O2&amp;quot;
PKG_CONFIG=&amp;quot;pkg-config&amp;quot;
GOGCCFLAGS=&amp;quot;-fPIC&amp;nbsp;-m64&amp;nbsp;-pthread&amp;nbsp;-fmessage-length=0&amp;nbsp;-fdebug-prefix-map=/tmp/go-build4047345889=/tmp/go-build&amp;nbsp;-gno-record-gcc-switches&amp;quot;&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;2 启动Goland&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;完成环境配置后，启动Goland，在这里不对Goland的安装和激活进行详细介绍，可以通过Ubuntu的软件商城快速安装。（中文可以在File-&amp;gt;Settings-&amp;gt;Plugins-&amp;gt;Marketplace中搜索Chinese，选中搜索结果中的”Chinese(Simplified)Language Pack/中文语言包“进行安装）&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;新建Go项目，确定项目信息后，点击创建。创建的目录结构如下：&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;188&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;├─awesomeProject&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─main&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─toolkit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; │&amp;nbsp; ├─sqlhelper&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─go.mod&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;414&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;├─项目名称&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─main包，一般有且只有一个，放置main.go&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─toolkit包，一般将项目内的文件夹称为包&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; │&amp;nbsp; ├─sqlhelper包，处理sql操作的集合&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;│&amp;nbsp; ├─go.mod&lt;span style=&quot;color: #121212; font-size: medium; background-color: #FFFFFF; font-family: 宋体, SimSun;&quot;&gt;一个Modules，是相关Go包的集合&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;3 添加依赖&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;这里的数据库选择的是MySQL，安装的依赖包是github.com/go-sql-driver/mysql。在终端输入如下命令：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#可以优先切换权限使用su命令，避免创建目录时出现权限不足
#出现“su&amp;nbsp;认证失败”，是因为root用户默认是锁定的，输入“sudo&amp;nbsp;passwd&amp;nbsp;root”修改密码
go&amp;nbsp;get&amp;nbsp;github.com/go-sql-driver/mysql
#&amp;nbsp;可能需要的操作
#&amp;nbsp;生成&amp;nbsp;mod&amp;nbsp;文件（切换到模块根目录）
go&amp;nbsp;mod&amp;nbsp;init&amp;nbsp;modulename
#&amp;nbsp;清理无效依赖，增加缺失依赖
go&amp;nbsp;mod&amp;nbsp;tidy&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun; text-indent: 2em;&quot;&gt;4 编写代码&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun; text-indent: 2em;&quot;&gt;在sqlhelper包创建command.go，用于统一管理sql命令；在main包创建main.go，作为程序的入口。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;以下代码仅作为展示，部分代码没有按照规范进行缩进、命名和重用，数据库也没有做出约束，command.go的代码如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;sqlhelper

import&amp;nbsp;(
	&amp;quot;database/sql&amp;quot;
	&amp;quot;fmt&amp;quot;
	_&amp;nbsp;&amp;quot;github.com/go-sql-driver/mysql&amp;quot;
	&amp;quot;time&amp;quot;
)

const&amp;nbsp;(
	USERNAME&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
	PASSWORD&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
	NETWORK&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;tcp&amp;quot;
	SERVER&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;127.0.0.1&amp;quot;
	PORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;3306
	DATABASE&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
)

type&amp;nbsp;FileInfo&amp;nbsp;struct&amp;nbsp;{
	fileID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int
	fileName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
	fileSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
	fileSource&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
	fileState&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
	filePayment&amp;nbsp;&amp;nbsp;&amp;nbsp;int
	fileDownloads&amp;nbsp;int
	userID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int
	created&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
	updated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
}

func&amp;nbsp;Open()&amp;nbsp;*sql.DB&amp;nbsp;{
	conn&amp;nbsp;:=&amp;nbsp;fmt.Sprintf(&amp;quot;%s:%s@%s(%s:%d)/%s&amp;quot;,&amp;nbsp;USERNAME,&amp;nbsp;PASSWORD,&amp;nbsp;NETWORK,&amp;nbsp;SERVER,&amp;nbsp;PORT,&amp;nbsp;DATABASE)
	fmt.Println(&amp;quot;conn:&amp;quot;,&amp;nbsp;conn)

	db,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;sql.Open(&amp;quot;mysql&amp;quot;,&amp;nbsp;conn)

	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;connection&amp;nbsp;to&amp;nbsp;mysql&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
		return&amp;nbsp;db
	}
	db.SetConnMaxLifetime(100&amp;nbsp;*&amp;nbsp;time.Second)
	db.SetMaxOpenConns(100)
	return&amp;nbsp;db

}

func&amp;nbsp;CreateTable(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}
	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;CREATE&amp;nbsp;TABLE&amp;nbsp;NewTable&amp;nbsp;(&amp;quot;&amp;nbsp;+
		&amp;quot;userNum&amp;nbsp;varchar(10)&amp;nbsp;NULL,&amp;quot;&amp;nbsp;+
		&amp;quot;userPasswd&amp;nbsp;varchar(32)&amp;nbsp;NULL,&amp;quot;&amp;nbsp;+
		&amp;quot;created&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP,&amp;quot;&amp;nbsp;+
		&amp;quot;updated&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;on&amp;nbsp;update&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;)&amp;quot;&amp;nbsp;+
		&amp;quot;ENGINE=InnoDB&amp;nbsp;&amp;quot;&amp;nbsp;+
		&amp;quot;DEFAULT&amp;nbsp;CHARSET=gbk&amp;nbsp;&amp;quot;&amp;nbsp;+
		&amp;quot;COLLATE=gbk_chinese_ci;&amp;quot;
	_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;create&amp;nbsp;table&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
		return
	}
	fmt.Println(&amp;quot;create&amp;nbsp;table&amp;nbsp;successful&amp;nbsp;!&amp;quot;)
}

func&amp;nbsp;DeleteTable(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}
	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;DROP&amp;nbsp;TABLE&amp;nbsp;NewTable;&amp;quot;
	_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;delete&amp;nbsp;table&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
		return
	}
	fmt.Println(&amp;quot;delete&amp;nbsp;table&amp;nbsp;successful&amp;nbsp;!&amp;quot;)
}

func&amp;nbsp;QueryUser(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}
	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;select&amp;nbsp;userNum,userPasswd&amp;nbsp;from&amp;nbsp;NewTable&amp;quot;
	rows,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;query&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
		return
	}
	for&amp;nbsp;rows.Next()&amp;nbsp;{
		var&amp;nbsp;userNum,&amp;nbsp;userPasswd&amp;nbsp;string
		err&amp;nbsp;=&amp;nbsp;rows.Scan(&amp;amp;userNum,&amp;nbsp;&amp;amp;userPasswd)
		//err&amp;nbsp;=&amp;nbsp;rows.Scan(&amp;amp;infos.fileID,&amp;nbsp;&amp;amp;infos.fileName,&amp;nbsp;&amp;amp;infos.fileSize,&amp;nbsp;&amp;amp;infos.fileSource,&amp;nbsp;&amp;amp;infos.filePayment,&amp;nbsp;&amp;amp;infos.fileDownloads,&amp;nbsp;&amp;amp;infos.userID,&amp;nbsp;&amp;amp;infos.created,&amp;nbsp;&amp;amp;infos.updated)
		if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
			fmt.Println(&amp;quot;scan&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
		}

		fmt.Println(userNum,&amp;nbsp;userPasswd)
	}
}

func&amp;nbsp;InsertUser(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}
	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;INSERT&amp;nbsp;INTO&amp;nbsp;NewTable&amp;quot;&amp;nbsp;+
		&amp;quot;(userNum,&amp;nbsp;userPasswd,&amp;nbsp;created,&amp;nbsp;updated)&amp;quot;&amp;nbsp;+
		&amp;quot;VALUES(&amp;#39;0123456789&amp;#39;,&amp;nbsp;&amp;#39;0123456789&amp;#39;,&amp;nbsp;NULL,&amp;nbsp;NULL);&amp;quot;
	_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;insert&amp;nbsp;failed:&amp;quot;,&amp;nbsp;err)
		return
	}
	fmt.Println(&amp;quot;insert&amp;nbsp;a&amp;nbsp;date&amp;nbsp;successful&amp;nbsp;!&amp;quot;)

	data&amp;nbsp;:=&amp;nbsp;[]map[string]string{
		{&amp;quot;userNum&amp;quot;:&amp;nbsp;&amp;quot;test1&amp;quot;,&amp;nbsp;&amp;quot;userPasswd&amp;quot;:&amp;nbsp;&amp;quot;0123456789&amp;quot;},
		{&amp;quot;userNum&amp;quot;:&amp;nbsp;&amp;quot;test2&amp;quot;,&amp;nbsp;&amp;quot;userPasswd&amp;quot;:&amp;nbsp;&amp;quot;0123456789&amp;quot;},
		{&amp;quot;userNum&amp;quot;:&amp;nbsp;&amp;quot;test3&amp;quot;,&amp;nbsp;&amp;quot;userPasswd&amp;quot;:&amp;nbsp;&amp;quot;0123456789&amp;quot;},
		{&amp;quot;userNum&amp;quot;:&amp;nbsp;&amp;quot;test4&amp;quot;,&amp;nbsp;&amp;quot;userPasswd&amp;quot;:&amp;nbsp;&amp;quot;0123456789&amp;quot;},
		{&amp;quot;userNum&amp;quot;:&amp;nbsp;&amp;quot;test5&amp;quot;,&amp;nbsp;&amp;quot;userPasswd&amp;quot;:&amp;nbsp;&amp;quot;0123456789&amp;quot;},
	}

	//insert&amp;nbsp;more&amp;nbsp;data
	var&amp;nbsp;sqls&amp;nbsp;string
	for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;data&amp;nbsp;{
		sqls&amp;nbsp;=&amp;nbsp;&amp;quot;INSERT&amp;nbsp;INTO&amp;nbsp;NewTable&amp;quot;&amp;nbsp;+
			&amp;quot;(userNum,&amp;nbsp;userPasswd,&amp;nbsp;created,&amp;nbsp;updated)&amp;nbsp;VALUES(&amp;quot;&amp;nbsp;+
			&amp;quot;&amp;#39;&amp;quot;&amp;nbsp;+&amp;nbsp;data[i][&amp;quot;userNum&amp;quot;]&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;#39;,&amp;nbsp;&amp;quot;&amp;nbsp;+
			&amp;quot;&amp;#39;&amp;quot;&amp;nbsp;+&amp;nbsp;data[i][&amp;quot;userPasswd&amp;quot;]&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;#39;,&amp;nbsp;&amp;quot;&amp;nbsp;+
			&amp;quot;NULL,&amp;nbsp;NULL);&amp;quot;
		//fmt.Println(data[i][&amp;quot;userNum&amp;quot;],&amp;nbsp;data[i][&amp;quot;userPasswd&amp;quot;])
		_,&amp;nbsp;err&amp;nbsp;=&amp;nbsp;db.Exec(sqls)
		if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
			fmt.Println(&amp;quot;insert&amp;nbsp;data&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
			return
		}
	}

	fmt.Println(&amp;quot;insert&amp;nbsp;data&amp;nbsp;successful&amp;nbsp;!&amp;quot;)
}

func&amp;nbsp;UpdateUser(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}

	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;UPDATE&amp;nbsp;NewTable&amp;nbsp;set&amp;nbsp;userNum=&amp;#39;newName&amp;#39;&amp;nbsp;where&amp;nbsp;userNum=&amp;#39;test4&amp;#39;;&amp;quot;

	_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;update&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
		return
	}
	fmt.Println(&amp;quot;update&amp;nbsp;date&amp;nbsp;successful&amp;nbsp;!&amp;quot;)
}

func&amp;nbsp;DeleteUser(db&amp;nbsp;*sql.DB)&amp;nbsp;{
	if&amp;nbsp;db&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;db&amp;nbsp;is&amp;nbsp;not&amp;nbsp;init&amp;nbsp;or&amp;nbsp;open&amp;quot;)
		return
	}
	sql&amp;nbsp;:=&amp;nbsp;&amp;quot;DELETE&amp;nbsp;FROM&amp;nbsp;NewTable&amp;nbsp;where&amp;nbsp;userNum=&amp;#39;0123456789&amp;#39;;&amp;quot;

	_,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Exec(sql)
	if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
		fmt.Println(&amp;quot;delete&amp;nbsp;fault:&amp;quot;,&amp;nbsp;err)
		return
	}
	fmt.Println(&amp;quot;delete&amp;nbsp;date&amp;nbsp;successful&amp;nbsp;!&amp;quot;)

}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;在main函数中进行调用，代码如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;(
	&amp;quot;database/sql&amp;quot;
	&amp;quot;fmt&amp;quot;
	&amp;quot;awesomeProject/toolkit/sqlhelper&amp;quot;
)

func&amp;nbsp;main()&amp;nbsp;{
	fmt.Println(&amp;quot;open&amp;nbsp;sql&amp;nbsp;connection&amp;quot;)
	var&amp;nbsp;DB&amp;nbsp;*sql.DB
	DB&amp;nbsp;=&amp;nbsp;sqlhelper.Open()

	sqlhelper.CreateTable(DB)

	sqlhelper.InsertUser(DB)

	sqlhelper.QueryUser(DB)

	sqlhelper.UpdateUser(DB)

	sqlhelper.DeleteUser(DB)

	sqlhelper.DeleteTable(DB)

	defer&amp;nbsp;DB.Close()
}&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;5 可能会遇到的问题&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;&lt;span style=&quot;text-indent: 2em;&quot;&gt;1)数据库连接信息正确，出现&lt;/span&gt;&lt;/span&gt;Connection refused&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;检查mysqld服务是否正常启动&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;检查mysqld服务状态
service&amp;nbsp;mysqld&amp;nbsp;status
#&amp;nbsp;启动mysqld服务
service&amp;nbsp;mysqld&amp;nbsp;start
#&amp;nbsp;关闭mysqld服务
service&amp;nbsp;mysqld&amp;nbsp;stop&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em; font-family: 宋体, SimSun;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;white-space: normal; text-indent: 2em;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;写在最后&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;alert alert-info&quot; style=&quot;color: rgb(0, 0, 0); white-space: normal;&quot;&gt;&lt;p style=&quot;margin-bottom: 5px;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;以上就是Go语言操作MySQL的介绍了，暂时先写这么多，后面也会进行完善。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 5px;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;你知道的越多，你不知道的就越多，人才们的 【三连】 就是我创作的最大动力，我们下期见！&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 5px;&quot;&gt;&lt;span style=&quot;font-family: 宋体, SimSun;&quot;&gt;注：如果本篇博客有任何错误和建议，欢迎人才们留言，你快说句话啊！&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 28 Jul 2022 10:31:27 +0800</pubDate></item><item><title>Go学习笔记（篇四）流程控制</title><link>https://blog.dongchenxuan.com/?id=65</link><description>&lt;h1 style=&quot;text-indent: 2em;&quot;&gt;流程控制&lt;br/&gt;&lt;/h1&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;1 条件语句&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;GO编程语言中if的语法如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;if&amp;nbsp;布尔表达式&amp;nbsp;{
&amp;nbsp;&amp;nbsp;/*在布尔表达式为true时执行*/
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;if 在布尔表达式为 true 时，其后紧跟的语句块执行，如果为 false 则不执行。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;实例如下，用if比较两个数的大小：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;int

&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Scanf(&amp;quot;%d&amp;nbsp;%d&amp;quot;,&amp;nbsp;&amp;amp;a,&amp;nbsp;&amp;amp;b)

&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;a&amp;nbsp;&amp;gt;&amp;nbsp;b&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;%d&amp;gt;%d\n&amp;quot;,&amp;nbsp;a,&amp;nbsp;b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;a&amp;nbsp;==&amp;nbsp;b&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;%d=%d\n&amp;quot;,&amp;nbsp;a,&amp;nbsp;b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;%d&amp;lt;%d\n&amp;quot;,&amp;nbsp;a,&amp;nbsp;b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;关于条件语句，需要注意以下几点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left; text-indent: 0em;&quot;&gt;布尔表达式不需要使用括号将条件包含起来；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left; text-indent: 0em;&quot;&gt;不论语句体内有几条语句，花括号{ }都是必须存在的；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left; text-indent: 0em;&quot;&gt;左花括号 { 必须与if或者else处于同一行；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left; text-indent: 0em;&quot;&gt;在if之后，布尔表达式之前，可以添加变量初始化语句，使用 ; 间隔；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left; text-indent: 0em;&quot;&gt;在具有返回值的函数中，不允许return语句出现在if……else……结构中；&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;2 选择语句&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;根据传入条件的不同，选择语句会执行不同的语句。&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;实例如下，判断变量中储存的数据类型：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;valueType(value&amp;nbsp;interface{})&amp;nbsp;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;value.(type)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;nil:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是&amp;quot;,&amp;nbsp;i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;int:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是int型&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;float64:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是float64型&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;func(int)&amp;nbsp;float64:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是func(int)型&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;bool:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是bool型&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;string:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;变量的类型是string型&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;未知&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;:=&amp;nbsp;32
&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;:=&amp;nbsp;32.2
&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;:=&amp;nbsp;&amp;quot;32&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;:=&amp;nbsp;false
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;e&amp;nbsp;interface{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;valueType(a)
&amp;nbsp;&amp;nbsp;&amp;nbsp;valueType(b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;valueType(c)
&amp;nbsp;&amp;nbsp;&amp;nbsp;valueType(d)
&amp;nbsp;&amp;nbsp;&amp;nbsp;valueType(e)
}

/*
打印结果如下：
变量的类型是int型
变量的类型是float64型
变量的类型是string型
变量的类型是bool型
变量的类型是&amp;nbsp;&amp;lt;nil&amp;gt;
*/&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;关于条件语句，需要注意以下几点：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;左花括号 { 必须与switch处于同一行；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;条件表达式不限制为常量或者整数；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;单个case中，可以出现多个结果选项；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;不需要break来明确退出一个case；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;只有在case中明确添加fallthrough关键字，才会继续执行下一个case；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;不设定switch之后的条件表达式，这个switch结构与多个if……else……的逻辑作用等同。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;3 循环语句&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在GO语言编程中，循环语句只支持for关键字，不支持while和do-while结构。关键字for的基本使用方法与C/C++中非常接近，&lt;span style=&quot;text-indent: 2em;&quot;&gt;代码如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;sum&amp;nbsp;:=&amp;nbsp;0
for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;10;&amp;nbsp;i++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Print(sum+i,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;)
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在循环体中，如果条件语句永远不为false则会进行无限循环（俗称死循环）。&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;实例如下，数字累加至100后退出循环：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fmt&amp;quot;
)

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;:=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;true&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum++
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;sum&amp;nbsp;==&amp;nbsp;100&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;关于循环语句，需要注意以下几点：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;左花括号 { 必须与for处于同一行&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go语言不支持以逗号为间隔的多个赋值语句，必须使用平行赋值的方法来初始化多个变量；&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;span style=&quot;text-indent: 28px;&quot;&gt;Go语言的for循环支持continue和break来控制循环，额外提供了更高级的break，可以选择中断哪一个循环。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;实例如下，在一组二维整形数组中查找某个数：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fmt&amp;quot;
)

func&amp;nbsp;main()&amp;nbsp;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;:=&amp;nbsp;[4][7]int{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{58,&amp;nbsp;15,&amp;nbsp;26,&amp;nbsp;35,&amp;nbsp;48,&amp;nbsp;95,&amp;nbsp;41},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{55,&amp;nbsp;32,&amp;nbsp;15,&amp;nbsp;25,&amp;nbsp;12,&amp;nbsp;9,&amp;nbsp;253},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{96,&amp;nbsp;21,&amp;nbsp;6,&amp;nbsp;25,&amp;nbsp;84,&amp;nbsp;25,&amp;nbsp;100},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{8,&amp;nbsp;106,&amp;nbsp;56,&amp;nbsp;85,&amp;nbsp;37,&amp;nbsp;66,&amp;nbsp;59}}
JLoop:
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;4;&amp;nbsp;i++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;:=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;7;&amp;nbsp;j++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Print(sum[i][j],&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;sum[i][j]&amp;nbsp;==&amp;nbsp;12&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&amp;nbsp;JLoop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
/*
打印结果如下：
58&amp;nbsp;15&amp;nbsp;26&amp;nbsp;35&amp;nbsp;48&amp;nbsp;95&amp;nbsp;41&amp;nbsp;55&amp;nbsp;32&amp;nbsp;15&amp;nbsp;25&amp;nbsp;12&amp;nbsp;
*/&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;4 跳转语句&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在C语言中有goto跳转语句，一般在编写小游戏时经常使用，有来处理一些条件判断。在Go语言中也有goto关键字，虽然不主张使用goto，但在一些场合下被证明是最合适的。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;goto语句的语义非常简单，就是跳转到本函数内的某个标签，在这里就不进行举例了。&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;参考：&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;a href=&quot;https://www.runoob.com/go/go-decision-making.html&quot;&gt;Go 语言条件语句 | 菜鸟教程 (runoob.com)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Tue, 26 Jul 2022 10:06:38 +0800</pubDate></item><item><title>Go学习笔记（篇三）数据类型</title><link>https://blog.dongchenxuan.com/?id=62</link><description>&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2021/12/202112031638508299117888.png&quot; title=&quot;Golang.png&quot; alt=&quot;Golang.png&quot;/&gt;&lt;/p&gt;&lt;h1 style=&quot;text-indent: 2em;&quot;&gt;数据类型&lt;br/&gt;&lt;/h1&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Go语言内置以下这些类型：&lt;br/&gt;&lt;/p&gt;&lt;table width=&quot;-516&quot;&gt;&lt;caption&gt;表3-1 Go语言支持的数据类型&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;基础类型&lt;/td&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;关键字&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;复合类型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;布尔类型&lt;/td&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;bool&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;指针（pointer）&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;整形&lt;/td&gt;&lt;td width=&quot;495&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;int8、byte、int16、unit、uintptr&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;数组（array）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;浮点类型&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;float32、float64&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;切片（slice）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;复数类型&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;complex64、complex128&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;字典（map）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;字符串&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;string&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;通道（chan）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;字符类型&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;rune&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;结构体（struct）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;错误类型&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;495&quot;&gt;error&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;495&quot; style=&quot;word-break: break-all;&quot;&gt;接口（interface）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;1 布尔类型&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;布尔类型不能接受其他类型的赋值，不支持自动或强制的类型转换。以下是bool类型的用法示例：&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-2 bool类型的使用示例&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;1012&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;正确用法&lt;/td&gt;&lt;td width=&quot;1012&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;错误用法&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;1012&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;b&amp;nbsp;bool
b&amp;nbsp;=&amp;nbsp;(1!=0)
fmt.Println(&amp;quot;Result:&amp;quot;,b)&amp;nbsp;&amp;nbsp;&amp;nbsp;//打印结果为Result:true&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;1012&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;b&amp;nbsp;bool
b&amp;nbsp;=&amp;nbsp;1&amp;nbsp;&amp;nbsp;//错误编译
b&amp;nbsp;=&amp;nbsp;bool(1)&amp;nbsp;&amp;nbsp;&amp;nbsp;//错误编译&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;2 整形&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;整形是所有编程语言里最基础的数据类型。Go语言支持的整形类型如下表所示：&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-3 Go语言支持的整形类型&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;类型&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;长度（字节）&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;值范围&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;int8&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;-128 ~ 127&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;uint8（即byte）&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;1&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;0 ~ 225&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;int16&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;-32 768 ~ 32 767&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;uint16&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;2&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;0 ~ 65 535&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;int32&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;4&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;-2 147 483 648 ~ 2 147 483 647&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;uint32&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;4&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;0 ~ 4 294 967 295&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;int64&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;8&lt;/td&gt;&lt;td width=&quot;668&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;int&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;平台相关&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;平台相关&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;uint&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;平台相关&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;平台相关&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;uintptr&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;同指针&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在32位平台下为4字节，64位平台下为8字节&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;2.1 类型表示&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;int和int32在Go语言里被认为是两种不同的类型，编译器不会自动做类型转换，使用强制类型转换可以解决这个问题，但要注意数据损失和溢出的问题（在这里不做具体分析），样例如下：&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-4 int类型表示用法&amp;nbsp;&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;正确用法&lt;/td&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;错误用法&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;517&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;v1&amp;nbsp;int32
v2&amp;nbsp;:=&amp;nbsp;64
v1&amp;nbsp;=&amp;nbsp;int32(v2)&amp;nbsp;//编译正确&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;517&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;v1&amp;nbsp;int32
v2&amp;nbsp;:=&amp;nbsp;64
v1&amp;nbsp;=&amp;nbsp;v2&amp;nbsp;//编译错误&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;2.2 数值运算&lt;br/&gt;&lt;/h3&gt;&lt;table&gt;&lt;caption&gt;表3-5 Go语言支持的数值运算&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;符号&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;功能&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot;&gt;例子&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;+&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;加法运算&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;word-break: break-all;&quot;&gt;6 + 3&amp;nbsp; =&amp;nbsp; &amp;nbsp;9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;-&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;减法运算&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;word-break: break-all;&quot;&gt;6 - 3&amp;nbsp; =&amp;nbsp; &amp;nbsp;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;*&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;乘法运算&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;word-break: break-all;&quot;&gt;6 * 3&amp;nbsp; = 18&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;/&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;除法运算&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;word-break: break-all;&quot;&gt;6 / 3&amp;nbsp; =&amp;nbsp; &amp;nbsp;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;337&quot;&gt;%&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot; width=&quot;337&quot;&gt;取余运算&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;337&quot; style=&quot;word-break: break-all;&quot;&gt;6 % 3 =&amp;nbsp; &amp;nbsp;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;2.3 比较运算&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Go语言支持以下的几种比较运算符：&amp;gt;、&amp;lt;、==、&amp;gt;=、&amp;lt;=和!=。和大多数其他编程语言相同，在这里就不做具体说明了。（需要注意的是不同类型的整形数不能直接比较，但可以直接与字面常量进行比较）&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;2.4 位运算&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Go语言支持表3-6所示的运算符。&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-6 Go语言支持的运算符&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;运算&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;含义&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;样例&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;x &amp;lt;&amp;lt; y&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;左移&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;124 &amp;lt;&amp;lt; 2&amp;nbsp; &amp;nbsp;//结果为496&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;x &amp;gt;&amp;gt; y&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;右移&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;124 &amp;gt;&amp;gt; 2&amp;nbsp; &amp;nbsp;//结果为31&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;x ^ y&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;异或&lt;/td&gt;&lt;td width=&quot;337&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;124 ^ 2&amp;nbsp; &amp;nbsp; &amp;nbsp;//结果为126&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;x &amp;amp; y&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;与&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;124 &amp;amp; 2&amp;nbsp; &amp;nbsp; //结果为0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;x | y&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;或&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;124 | 2&amp;nbsp; &amp;nbsp; &amp;nbsp; //结果为126&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;^x&lt;/td&gt;&lt;td valign=&quot;top&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;取反&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;^124&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //结果为-125&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;3 浮点型&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;浮点型用于表示包含小数点的数据，比如1.234就是一个浮点型数据。Go语言中的浮点类型采用IEEE-754标准的表达方式。&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;3.1 浮点数表示&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Go语言定义了两个类型float32和float64，分别等价于C语言的float类型和double类型，样例如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;fvalue1&amp;nbsp;float&amp;nbsp;32
fvalue1&amp;nbsp;=&amp;nbsp;12
fvalue2&amp;nbsp;:=&amp;nbsp;12.0&amp;nbsp;//如果不加小数点，fvalue2会被推导为整形
fvalue3&amp;nbsp;:=&amp;nbsp;float32(fvalue2)&amp;nbsp;//必须使用强制类型转换，直接赋值将导致编译错误&lt;/pre&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;3.2 浮点数比较&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;因为浮点数不是一种精确的表达方式，所以直接使用“==”来判断两个浮点数是否相等会导致不稳定的结果。下面是一种推荐的替代方案：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;import&amp;nbsp;&amp;quot;math&amp;quot;&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;4 复数类型&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;复数实际上由两个实数（在计算机中用浮点数表示）构成，一个表示实部（real），一个表示虚部（imag）。样例&lt;span style=&quot;text-indent: 2em;&quot;&gt;如下：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main&amp;nbsp;//必须有一个main包
&amp;nbsp;
import&amp;nbsp;&amp;quot;fmt&amp;quot;
&amp;nbsp;
func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;cvalue1&amp;nbsp;complex128&amp;nbsp;//声明
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvalue1&amp;nbsp;&amp;nbsp;=&amp;nbsp;2.1&amp;nbsp;+&amp;nbsp;3.14i&amp;nbsp;&amp;nbsp;//赋值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;cvalue1&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;,&amp;nbsp;cvalue1&amp;nbsp;)
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//自动推导类型
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvalue2&amp;nbsp;:=&amp;nbsp;3.3&amp;nbsp;+&amp;nbsp;4.4i
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;cvalue2&amp;nbsp;type&amp;nbsp;is&amp;nbsp;%T\n&amp;quot;,&amp;nbsp;cvalue2)
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//通过内建函数，取实部和虚部
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;real(cvalue2)&amp;nbsp;=&amp;nbsp;&amp;quot;,&amp;nbsp;real(cvalue2),&amp;nbsp;&amp;quot;,&amp;nbsp;imag(cvalue2)&amp;nbsp;=&amp;nbsp;&amp;quot;,&amp;nbsp;imag(cvalue2))
&amp;nbsp;
}&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;5 字符串&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在Go语言中，字符串也是一种基本类型。相比之下，C/C++语言并不存在原生的字符串类型，通常使用字符数组来表示，并以字符指针来传递。字符串的声明和使用的样例如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;str&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;Hello&amp;nbsp;world&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(str)
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;字符串的内容可以用类似于数组下标的方式获取，但与数组不同，字符串的内容不能在初始化后被修改。&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;5.1 字符串操作&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;平时常用的字符串操作如表3-7所示。&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-7 字符串操作方法对照表&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;运算&lt;/td&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;含义&lt;/td&gt;&lt;td width=&quot;443&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;样例&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;x + y&lt;/td&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;字符串连接&lt;/td&gt;&lt;td width=&quot;444&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&amp;quot;Hello&amp;quot; + &amp;quot;World&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp;// 结果为HelloWorld&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;p&gt;len(str)&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;字符串长度&lt;/td&gt;&lt;td width=&quot;444&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;len(&amp;quot;&lt;span style=&quot;text-align: -webkit-center;&quot;&gt;HelloWorld&lt;/span&gt;&amp;quot;)&amp;nbsp; &amp;nbsp; // 结果为10&lt;span style=&quot;text-align: -webkit-center;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;s[i]&lt;/td&gt;&lt;td width=&quot;248&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;取字符&lt;/td&gt;&lt;td width=&quot;444&quot; valign=&quot;top&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&amp;quot;&lt;span style=&quot;text-align: -webkit-center;&quot;&gt;HelloWorld&lt;/span&gt;&amp;quot;[1]&amp;nbsp; &lt;span style=&quot;text-align: -webkit-center;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp; // 结果为&amp;#39;e&amp;#39;&lt;span style=&quot;text-align: -webkit-center;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;5.2 字符串遍历&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Go语言支持两种方式遍历字符串，样例如下表所示：&lt;/p&gt;&lt;table&gt;&lt;caption&gt;表3-8 字符串变量方法表&lt;br/&gt;&lt;/caption&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;字节数组遍历&lt;br/&gt;&lt;/td&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;Unicode字节遍历&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;str&amp;nbsp;:=&amp;nbsp;&amp;quot;Hello,世界&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;n&amp;nbsp;:=&amp;nbsp;len(str)
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;n&amp;nbsp;;&amp;nbsp;i++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(i,&amp;nbsp;str[i])
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
/*&amp;nbsp;运行结果
0&amp;nbsp;72
1&amp;nbsp;101
2&amp;nbsp;108
3&amp;nbsp;108
4&amp;nbsp;111
5&amp;nbsp;44
6&amp;nbsp;228
7&amp;nbsp;184
8&amp;nbsp;150
9&amp;nbsp;231
10&amp;nbsp;149
11&amp;nbsp;140
*/&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;str&amp;nbsp;:=&amp;nbsp;&amp;quot;Hello,世界&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;,&amp;nbsp;ch&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;str{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(i,&amp;nbsp;ch)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

/*&amp;nbsp;运行结果
0&amp;nbsp;72
1&amp;nbsp;101
2&amp;nbsp;108
3&amp;nbsp;108
4&amp;nbsp;111
5&amp;nbsp;44
6&amp;nbsp;19990
9&amp;nbsp;30028
*/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;6 字符类型&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;在Go语言中支持两种字符类型，一个是byte（实际上是unit8的别名&lt;span style=&quot;text-indent: 2em;&quot;&gt;），代表UTF-8字符串的单个字节的值；另一个是rune，代表单个Unicode字符。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;text-indent: 2em;&quot;&gt;7 数组&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数组是Go语言编程中最常用的数据结构之一。顾名思义，数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素（element），一个数组包含的元素个数被称为数组的长度。以下为一些常规的数组声明方法：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;var&amp;nbsp;b&amp;nbsp;[32]byte&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//长度为32的数组，每个元素为一个字节
var&amp;nbsp;s&amp;nbsp;[32]&amp;nbsp;struct{x,y&amp;nbsp;int}&amp;nbsp;&amp;nbsp;&amp;nbsp;//复杂类型数组
var&amp;nbsp;f1&amp;nbsp;[32]&amp;nbsp;*float64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//指针数组
var&amp;nbsp;f2&amp;nbsp;[2][4][4]&amp;nbsp;float64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//等同于[2]([2]([2]&amp;nbsp;float64))
var&amp;nbsp;i&amp;nbsp;[4][8]&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//二维数组&lt;/pre&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;8 数组切片&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数组的长度在定义之后无法再次修改；数组是值类型，每次传递都将产生一份副本。这些都是数组的特点，但这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片（slice）这种数据类型来弥补数组的不足。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数字切片就像一个指向数组的指针，数组切片的数据结构可以抽象为以下3个变量：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;一个指向原生数组的指针；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数组切片中的元素个数；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;数组切片已分配的存储空间。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://blog.dongchenxuan.com/zb_users/upload/2022/07/202207251658738135490512.png&quot; title=&quot;QQ图片20220725163350.png&quot; alt=&quot;QQ图片20220725163350.png&quot;/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;8.1 创建数组切片&lt;br/&gt;&lt;/h3&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;创建数组切片的方法如下表所示：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table width=&quot;-612&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;基于数组&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;//定义数组
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;array&amp;nbsp;[10]int&amp;nbsp;=&amp;nbsp;[10]int{0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9}

&amp;nbsp;&amp;nbsp;&amp;nbsp;//基于前五个数组元素创建一个切片
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;slice&amp;nbsp;[]int&amp;nbsp;=&amp;nbsp;array[:5]
&amp;nbsp;&amp;nbsp;&amp;nbsp;//从第五个数组元素创建一个切片&amp;nbsp;&amp;nbsp;&amp;nbsp;array[5:]
&amp;nbsp;&amp;nbsp;&amp;nbsp;//数组转为切片&amp;nbsp;array[:]
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;Array:&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_,&amp;nbsp;v&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;array&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Print(v,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;Slice:&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_,&amp;nbsp;v&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;slice&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Print(v,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
//运行结果为：
//Array:
//0&amp;nbsp;1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5&amp;nbsp;6&amp;nbsp;7&amp;nbsp;8&amp;nbsp;9&amp;nbsp;
//Slice:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
//0&amp;nbsp;1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;background-color: rgb(183, 221, 232); word-break: break-all;&quot; align=&quot;center&quot;&gt;直接创建&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;517&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;//使用make()直接创建数组切片
&amp;nbsp;&amp;nbsp;&amp;nbsp;//创建一个初始元素个数为5的数组切片，元素初始值为0
&amp;nbsp;&amp;nbsp;&amp;nbsp;slice1&amp;nbsp;:=&amp;nbsp;make([]int,&amp;nbsp;5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(len(slice1))
&amp;nbsp;&amp;nbsp;&amp;nbsp;//创建一个初始元素个数为5的数组切片，元素初始值为0，并预留10个元素的存储空间
&amp;nbsp;&amp;nbsp;&amp;nbsp;slice2&amp;nbsp;:=&amp;nbsp;make([]int,&amp;nbsp;5,&amp;nbsp;10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(len(slice2))
&amp;nbsp;&amp;nbsp;&amp;nbsp;//直接创建并初始化包含5个元素的数组切片
&amp;nbsp;&amp;nbsp;&amp;nbsp;slice3&amp;nbsp;:=&amp;nbsp;[]int{0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4}
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(len(slice3))
}
//运行结果为：
//5
//5
//5&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;8.2 切片常用的方法&lt;br/&gt;&lt;/h3&gt;&lt;h4 style=&quot;text-indent: 2em;&quot;&gt;8.2.1 遍历&lt;br/&gt;&lt;/h4&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;操作数组元素的所有方法都适用于数组切片，比如数组切片也可以按下标读写元素，用len()函数获取元素的个数，并支持使用range关键字来快速遍历所有元素。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;传统的元素遍历如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;slice&amp;nbsp;:=&amp;nbsp;[]int{1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5}
for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;len(slice&amp;nbsp;);&amp;nbsp;i++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Print(slice&amp;nbsp;[i],&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;)
}&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;使用range关键字可以让遍历代码显得更整洁。range表达式有两个返回值，第一个是索引，第二个是元素的值，代码如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;slice&amp;nbsp;:=&amp;nbsp;[]int{1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5}
for&amp;nbsp;i,&amp;nbsp;v&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;slice&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;d[&amp;quot;,&amp;nbsp;i,&amp;nbsp;&amp;quot;]=&amp;quot;,&amp;nbsp;v)
}&lt;/pre&gt;&lt;h4 style=&quot;text-indent: 2em;&quot;&gt;8.2.2 增减元素&lt;/h4&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;使用append()操作切片，代码如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;:=&amp;nbsp;[]int{1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5}
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;a&amp;nbsp;=&amp;quot;,&amp;nbsp;a,&amp;nbsp;&amp;quot;len=&amp;quot;,&amp;nbsp;len(a))
&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;:=&amp;nbsp;make([]int,&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;//添加切片a的前2个元素，添加切片a下标从3开始之后的元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;//总结一下：冒号在前是个数；冒号在后是下标，保留的是冒号没有数字的一侧
&amp;nbsp;&amp;nbsp;&amp;nbsp;//只有(int):和:(int)的用法。
&amp;nbsp;&amp;nbsp;&amp;nbsp;//添加一个切片要用...展开运算符
&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;append(a[:2],&amp;nbsp;a[3:]...)
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;d&amp;nbsp;=&amp;quot;,&amp;nbsp;d,&amp;nbsp;&amp;quot;len=&amp;quot;,&amp;nbsp;len(d))
}
//删除切片中的第三个元素
//打印结果如下：
//a&amp;nbsp;=&amp;nbsp;[1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5]&amp;nbsp;len=&amp;nbsp;5
//d&amp;nbsp;=&amp;nbsp;[1&amp;nbsp;2&amp;nbsp;4&amp;nbsp;5]&amp;nbsp;len=&amp;nbsp;4&lt;/pre&gt;&lt;h4 style=&quot;text-indent: 2em;&quot;&gt;8.2.3 扩容&lt;/h4&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;:=&amp;nbsp;make([]int,&amp;nbsp;0)

&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;当前切片的长度:%d,容量:%d\n&amp;quot;,&amp;nbsp;len(a),&amp;nbsp;cap(a))

&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;:=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;10;&amp;nbsp;i++&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;append(a,&amp;nbsp;i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;当前切片的长度:%d,容量:%d\n&amp;quot;,&amp;nbsp;len(a),&amp;nbsp;cap(a))
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
//打印结果如下：
//当前切片的长度:0,容量:0
//当前切片的长度:1,容量:1&amp;nbsp;&amp;nbsp;
//当前切片的长度:2,容量:2&amp;nbsp;&amp;nbsp;
//当前切片的长度:3,容量:4&amp;nbsp;&amp;nbsp;
//当前切片的长度:4,容量:4&amp;nbsp;&amp;nbsp;
//当前切片的长度:5,容量:8&amp;nbsp;&amp;nbsp;
//当前切片的长度:6,容量:8&amp;nbsp;&amp;nbsp;
//当前切片的长度:7,容量:8&amp;nbsp;&amp;nbsp;
//当前切片的长度:8,容量:8&amp;nbsp;&amp;nbsp;
//在添加元素之前判断切片是否有剩余，如果没有剩余且容量小于1024，成倍增加容量
//在没有添加元素之前的容量是8，所以扩容量为8
//当前切片的长度:9,容量:16&amp;nbsp;
//当前切片的长度:10,容量:16&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;如果容量小于1024的时候，是成倍数的添加容量&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;如果容量大于1024的时候，是之前的1/4的来添加容量&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-indent: 2em;&quot;&gt;9 map&lt;br/&gt;&lt;/h2&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据，key 类似于索引，指向数据的值。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;Map 是一种集合，所以我们可以像迭代数组和切片那样迭代它。不过，Map 是无序的，我们无法决定它的返回顺序，这是因为 Map 是使用 hash 表来实现的。&lt;/p&gt;&lt;h3 style=&quot;text-indent: 2em;&quot;&gt;9.1 map的常见用法&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;&amp;quot;fmt&amp;quot;

type&amp;nbsp;StudentInfo&amp;nbsp;struct&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;ClassRoom&amp;nbsp;string
}

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;students&amp;nbsp;map[int]StudentInfo
&amp;nbsp;&amp;nbsp;&amp;nbsp;students&amp;nbsp;=&amp;nbsp;make(map[int]StudentInfo)

&amp;nbsp;&amp;nbsp;&amp;nbsp;//添加元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;students[0]&amp;nbsp;=&amp;nbsp;StudentInfo{&amp;quot;小明&amp;quot;,&amp;nbsp;&amp;quot;三年级（1）班&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;students[1]&amp;nbsp;=&amp;nbsp;StudentInfo{&amp;quot;小红&amp;quot;,&amp;nbsp;&amp;quot;三年级（1）班&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;students[2]&amp;nbsp;=&amp;nbsp;StudentInfo{&amp;quot;小李&amp;quot;,&amp;nbsp;&amp;quot;三年级（2）班&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;students[3]&amp;nbsp;=&amp;nbsp;StudentInfo{&amp;quot;小王&amp;quot;,&amp;nbsp;&amp;quot;三年级（2）班&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;students[4]&amp;nbsp;=&amp;nbsp;StudentInfo{&amp;quot;小赵&amp;quot;,&amp;nbsp;&amp;quot;三年级（3）班&amp;quot;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;//遍历元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;学生信息如下：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_,&amp;nbsp;student&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;students&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(student)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;//查找元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;stua,&amp;nbsp;ok&amp;nbsp;:=&amp;nbsp;students[3]
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;ok&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;下标是3的学生信息：&amp;quot;,&amp;nbsp;stua)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;查找失败!&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;//删除元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;delete(students,&amp;nbsp;1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;新的学生信息如下：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_,&amp;nbsp;student&amp;nbsp;:=&amp;nbsp;range&amp;nbsp;students&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(student)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;//修改元素
&amp;nbsp;&amp;nbsp;&amp;nbsp;stub,&amp;nbsp;ok&amp;nbsp;:=&amp;nbsp;students[2]
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;ok&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stub.ClassRoom&amp;nbsp;=&amp;nbsp;&amp;quot;三年级（3）班&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;查找失败!&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(&amp;quot;修改后的学生信息：&amp;quot;,&amp;nbsp;stub)

}&lt;/pre&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;参考：&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;a href=&quot;https://blog.csdn.net/kuangshp128/article/details/118162439&quot;&gt;总结go语言中切片的使用_水痕01的博客-CSDN博客_go语言切片的三种方法&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;a href=&quot;https://blog.csdn.net/kuangshp128/article/details/118162439&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://learnku.com/articles/38316&quot;&gt;Go 切片详解（理解是关键） | Go 技术论坛 (learnku.com)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-indent: 0em;&quot;&gt;&lt;a href=&quot;https://www.runoob.com/go/go-map.html&quot;&gt;Go 语言Map(集合) | 菜鸟教程 (runoob.com)&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 25 Jul 2022 20:44:54 +0800</pubDate></item></channel></rss>