-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
398 lines (191 loc) · 386 KB
/
search.xml
File metadata and controls
398 lines (191 loc) · 386 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>aPaaS是什么</title>
<link href="/2022/06/02/apaas-shi-shi-me/"/>
<url>/2022/06/02/apaas-shi-shi-me/</url>
<content type="html"><![CDATA[<h2 id="什么是aPaaS?"><a href="#什么是aPaaS?" class="headerlink" title="什么是aPaaS?"></a>什么是aPaaS?</h2><p>根据Gartner的说法,aPaaS是应用程序平台即服务的缩写,它是一种云服务,可为应用程序服务提供开发和部署环境。aPaaS平台提供了以下功能:迭代构建应用程序、即时提供应用软件、按需扩展应用程序以及集成应用程序与其他服务。</p><h2 id="aPaaS-和-PaaS-有什么区别?"><a href="#aPaaS-和-PaaS-有什么区别?" class="headerlink" title="aPaaS 和 PaaS 有什么区别?"></a>aPaaS 和 PaaS 有什么区别?</h2><p>在前云时代,“中间件”一词用于描述在分布式应用程序中的支持数据通信和管理的软件。基础架构和应用程序首先以<a href="https://zhuanlan.zhihu.com/p/272634952">IaaS(基础架构即服务)</a>和<a href="https://zhuanlan.zhihu.com/p/271988787">SaaS(软件即服务)</a>的形式在云计算服务中,如阿里云和钉钉。后来,中间件服务也可以在云中使用,但是中间件包含了很多东西,例如应用程序开发,应用程序部署,集成服务,标识服务和其他平台服务。所有这些服务都集中在<a href="https://zhuanlan.zhihu.com/p/270294635">PaaS(平台即服务)</a>下,如Azure。在这种情况下,那些主要提供应用程序开发和部署的服务就被称为aPaaS(例如白码无代码开发平台),而PaaS则是将整个中间件视为服务产品范围。</p><p><img src="https://s2.loli.net/2022/06/02/Q9bOGN2eofXsCla.jpg" alt="img"></p><h2 id="aPaaS的优势"><a href="#aPaaS的优势" class="headerlink" title="aPaaS的优势"></a>aPaaS的优势</h2><ul><li><strong>轻松构建应用</strong></li></ul><p>像快速应用程序平台这样的应用程序平台为您提供了迭代和快速更改所需要的所有工具,并为您的项目采用正确技术。它们具有非常直观的拖放功能特性,可随时用于开发应用程序。</p><ul><li><strong>在短时间内部署应用程序</strong></li></ul><p>使用aPaaS可以大大减少开发和部署时间。它们能够从旧系统轻松集成新的应用程序功能,这使得更新和改进可以变得很容易。</p><ul><li><strong>应用程序的可扩展性</strong></li></ul><p>许多aPaaS平台都提供水平和垂直的可伸缩性。您可以轻松地升级和添加数据库,并在应用程序中部署新内容。</p><ul><li><strong>与各种其他应用程序集成</strong></li></ul><p>提供额外的软件服务,例如操作系统、数据库、安全性和漏洞管理、API和集成基础结构以及在云上的许多部署选项,这些都有强大的安全支持。</p><h2 id="如何选择合适的aPaaS平台"><a href="#如何选择合适的aPaaS平台" class="headerlink" title="如何选择合适的aPaaS平台"></a>如何选择合适的aPaaS平台</h2><p>一些aPaaS平台简化了应用程序的供应和安装,但它们并不能真正使组织以业务速度交付应用程序。一个好的aPaaS平台应为整个应用程序生命周期带来速度和敏捷性,为无摩擦的企业应用程序交付铺平了道路。您可以根据自己的需要选择具有相应功能的aPaaS平台。</p><ul><li><strong>视觉发展</strong></li></ul><p>拖放式UI创建可加快开发和变更管理</p><ul><li><strong>轻松整合</strong></li></ul><p>连接遗留系统中独立的数据库,API,Web服务和数据</p><ul><li><strong>多设备支持</strong></li></ul><p>创建响应式Web应用程序和混合移动应用程序,以便在所有设备和外形上都可以使用该应用程序</p><ul><li><strong>广泛定制</strong></li></ul><p>能够自定义所有方面的功能,包括HTML,CSS,JavaScript和后端服务</p><ul><li><strong>即时部署</strong></li></ul><p>一键式部署和选项,可在本地以及私有和公共云中运行</p><ul><li><strong>细颗粒度的安全性</strong></li></ul><p>能够提供身份验证程序集成并控制不同级别的授权</p><p><img src="https://s2.loli.net/2022/06/02/2xnsJyFZK3L9a54.jpg" alt="img"></p><h2 id="aPaaS的未来"><a href="#aPaaS的未来" class="headerlink" title="aPaaS的未来"></a>aPaaS的未来</h2><p>aPaaS是软件开发的未来。Adrian Bridgwater表示:“您可以使用aPaaS进行最初设计时最初没有想到的其他事情”。有了aPaaS,完整的Web应用程序生命周期就可以得到现有支持:构建,测试,部署,管理和更新。</p><p>由于底层基础结构已经编写、测试和优化,该平台允许进行低代码开发,而无需开发人员或熟练的IT人员来开发应用程序,因此企业内任何人具有相关的开发知识就可以完成此工作。</p>]]></content>
<tags>
<tag> aPaas </tag>
<tag> Paas </tag>
</tags>
</entry>
<entry>
<title>GIT版本管理一篇入门</title>
<link href="/2022/05/26/git-ban-ben-guan-li-yi-pian-ru-men/"/>
<url>/2022/05/26/git-ban-ben-guan-li-yi-pian-ru-men/</url>
<content type="html"><![CDATA[<h2 id="一、简介"><a href="#一、简介" class="headerlink" title="一、简介"></a>一、简介</h2><p><code>GIT</code>基本上是目前最为先进的分布式版本控制系统,通过<code>GIT</code>能够非常方便的管理文件多个版本,能够实现版本的回滚,比对等功能,并且支持分布式也就是多人协同工作。</p><p><code>GIT</code>也是目前使用作为广泛的版本控制软件,大名鼎鼎的<code>Github</code>网站能直接与<code>GIT</code>对接,使用<code>GIT</code>上传代码到<code>Github</code>之中。</p><hr><h2 id="二、GIT安装配置"><a href="#二、GIT安装配置" class="headerlink" title="二、GIT安装配置"></a>二、GIT安装配置</h2><p>通常来说,<code>Linux</code>系统使用各自版本对应的包管理工具可以非常方便的安装<code>GIT</code>。例如<code>sudo apt-get install git</code>,但安装之后会有一些设置需要配置。</p><h3 id="1-1-中文乱码"><a href="#1-1-中文乱码" class="headerlink" title="1.1.中文乱码"></a>1.1.中文乱码</h3><p>安装<code>GIT</code>之后比较常见的一个问题,就是中文乱码,可以通过在命令行中设置解决:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">git config <span class="token operator">-</span><span class="token operator">-</span><span class="token keyword">global</span> core<span class="token punctuation">.</span>quotepath false<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="1-2-配置身份信息"><a href="#1-2-配置身份信息" class="headerlink" title="1.2.配置身份信息"></a>1.2.配置身份信息</h3><p>由于<code>GIT</code>支持多用户协作,所以在使用<code>GIT</code>之前,还需要配置身份信息。首先需要在<code>GIT</code>中配置你的用户名和邮箱地址:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> config --global user.name <span class="token string">"jason"</span> // 名字<span class="token function">git</span> config --global user.email <span class="token string">"jason@xxx.com"</span> // 邮箱<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><hr><h2 id="三、创建仓库"><a href="#三、创建仓库" class="headerlink" title="三、创建仓库"></a>三、创建仓库</h2><p>在使用<code>GIT</code>之前,得掌握一个<code>仓库</code>的概念,也就是<code>repository</code>。这个<code>repository</code>也就是一个目录,是<code>GIT</code>管理的单位,在一个<code>repository</code>中,所有文件的新建、修改、删除都会被<code>GIT</code>跟踪到,并加以管理,以便在以后进行还原等操作。</p><p>所以,使用<code>GIT</code>,首先要创建一个<code>repository</code>。</p><p>创建一个仓库,主要可以有两种方式。</p><h4 id="【init】"><a href="#【init】" class="headerlink" title="【init】"></a>【init】</h4><p><code>init</code>的创建方式为从零开始创建一个仓库,首先需要有一个目录,使用<code>cd</code>进入到我们想要创建仓库的目录中,然后使用以下命令:</p><pre class="line-numbers language-base" data-language="base"><code class="language-base">git init<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>即可将当前目录转化为一个<code>repository</code>。目录中会出现一个<code>.git</code>目录,里面保存着所有的版本信息。</p><h4 id="【clone】"><a href="#【clone】" class="headerlink" title="【clone】"></a>【clone】</h4><p>除了自己从零开始创建仓库外,还可以使用别人的远程仓库来创建,例如<code>Github</code>上有许多项目代码,都可以使用这种方式拷贝下来。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone git://git.kernel.org/pub/scm/<span class="token punctuation">..</span>./linux.git<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这样的话会在当前目录生成一个一模一样的仓库。</p><hr><h2 id="四、基础GIT命令"><a href="#四、基础GIT命令" class="headerlink" title="四、基础GIT命令"></a>四、基础GIT命令</h2><p>创建好仓库之后,就可以在仓库之中开始使用命令来控制此仓库文件的版本了。</p><p>在使用这些命令之前,还有几个<code>GIT</code>的基础概念需要掌握,分别是:<code>工作区(working directory)</code>,<code>暂存区(stage)</code>,<code>分支</code>,<code>版本库</code>。</p><ul><li>首先,<code>工作区</code>指的其实就是我们平常我们修改文件,查看文件的地方。</li><li><code>暂存区</code>则是类似于一个中转的区域,被叫做<code>stage</code>或者<code>index</code>。在工作区中修改了内容,那么首先需要先将修改提交到暂存区中,积累一定的修改数量,汇集成一个版本之后,再一起提交到具体的分支中。</li><li>在<code>GIT</code>管理的项目中,有<code>分支</code>这个说法,可以理解为具体的开发方向,<code>GIT</code>仓库在初始化的时候会默认创建一个<code>master</code>分支,你的文件版本就实际保存在这些分支之中。</li><li><code>暂存区</code>和<code>分支</code>合起来称为整个版本库。</li></ul><h4 id="【status】"><a href="#【status】" class="headerlink" title="【status】"></a>【status】</h4><p>在仓库中使用<code>git status</code>命令可以查看当前仓库的状态:</p><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec"><span class="token punctuation">[</span>root<span class="token operator">@</span>acmestudio jason<span class="token punctuation">]</span># git status<span class="token macro property"><span class="token directive-hash">#</span> <span class="token expression">On branch master</span></span><span class="token macro property"><span class="token directive-hash">#</span> <span class="token expression">Changes not staged <span class="token keyword">for</span> commit<span class="token punctuation">:</span></span></span># <span class="token punctuation">(</span>use <span class="token string">"git add <file>..."</span> to update what will be committed<span class="token punctuation">)</span># <span class="token punctuation">(</span>use <span class="token string">"git checkout -- <file>..."</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>#<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">modified</span><span class="token expression"><span class="token punctuation">:</span> jason<span class="token operator">/</span>settings<span class="token punctuation">.</span>py</span></span>#<span class="token macro property"><span class="token directive-hash">#</span> <span class="token expression">Untracked files<span class="token punctuation">:</span></span></span># <span class="token punctuation">(</span>use <span class="token string">"git add <file>..."</span> to include <span class="token keyword">in</span> what will be committed<span class="token punctuation">)</span>#<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">setup</span><span class="token expression"><span class="token punctuation">.</span>py</span></span>no changes added to <span class="token function">commit</span> <span class="token punctuation">(</span>use <span class="token string">"git add"</span> and<span class="token operator">/</span>or <span class="token string">"git commit -a"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>其中主要列出了仓库当前所处的分支,被修改了的文件,以及没有被跟踪的文件。</p><p><strong>参数</strong>:</p><ol><li><code>-s</code> - 以短格式显示仓库状态。</li></ol><hr><h4 id="【add】"><a href="#【add】" class="headerlink" title="【add】"></a>【add】</h4><p>在<code>GIT</code>仓库之中,虽然我们说所有的文件都可以被跟踪,但是这只限于文本文件的修改,<code>GIT</code>无法跟踪二进制文件的修改。</p><p>同时,在跟踪之前也需要先将文件添加到仓库的索引中,也就是说,使用<code>add</code>命令添加到索引中的文件,才会被<code>GIT</code>跟踪。在每次你新建或者修改了文件之后,需要你使用<code>add</code>命令将这个文件先添加到暂存区之中。</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">git <span class="token keyword">add</span> filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>运行了此命令之后,未跟踪文件将会从<code>Untracked files:</code>中转移到<code>Changes not staged for commit:</code>中。</p><p>有些时候,可能修改的文件比较多,一个个去用<code>add</code>命令去添加比较麻烦,所以也可以用<code>*</code>来匹配文件名,以下命令可以将所有未被跟踪的文件添加到暂存区中:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">git <span class="token keyword">add</span> <span class="token operator">*</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><hr><h4 id="【commit】"><a href="#【commit】" class="headerlink" title="【commit】"></a>【commit】</h4><p>在将新文件或者修改过后的文件添加到暂存区之后,就可以使用<code>commit</code>命令将其正式提交到仓库了。但是要注意的是,<code>commit</code>提交到仓库的文件状态,是最后一次执行<code>add</code>时文件的状态,而不是执行<code>commit</code>时文件的状态。</p><p>所以,在提交文件之前,最好都先使用<code>git status</code>检查一下,有没有需要添加的文件还没有用<code>add</code>添加到暂存区中。然后就可以运行命令了:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git commit<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>直接运行此命令后,会跳出一个编辑界面,一般默认是使用<code>vim</code>。如下所示:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># Please enter the commit message for your changes. Lines starting</span><span class="token comment"># with '#' will be ignored, and an empty message aborts the commit.</span><span class="token comment">#</span><span class="token comment"># On branch master</span><span class="token comment"># Your branch is up to date with 'origin/master'.</span><span class="token comment">#</span><span class="token comment"># Changes to be committed:</span><span class="token comment"># modified: "hello.md"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里其实是需要你输入一些关于此次<code>commit</code>的一些信息,对此次代码提交做一定的标识,方便以后如果需要还原版本的时候清楚代码的改动。对此信息保存退出后,则<code>commit</code>提交成功。</p><p><strong>参数</strong>:</p><ol><li><p><code>-a</code> - 虽然说可以使用<code>add</code>命令对<code>commit</code>提交的暂存区做很精细的改动,但是当提交的文件非常多的时候,则<code>add</code>起来会比较的麻烦。所以<code>commit</code>提供了<code>-a</code>参数,使用此参数,则会自动将已被追踪的修改过的文件添加到缓存区中,不用再手动<code>add</code>添加了。</p></li><li><p><code>-m</code> - <code>commit</code>提交的时候需要输入信息,有时候如果希望输入的信息比较少,则可以使用-m参数直接在命令行输入。如下所示:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> commit -m <span class="token string">'message'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ol><hr><h4 id="【rm】"><a href="#【rm】" class="headerlink" title="【rm】"></a>【rm】</h4><p>如果需要移除仓库中已经被追踪的文件,那么最好使用<code>GIT</code>提供的<code>rm</code>命令来删除,会更加安全:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git rm filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>此删除命令会将磁盘上的文件一并删除,在<code>commit</code>后,此文件将不会再被追踪。</p><p><strong>参数</strong>:</p><ol><li><p><code>-f</code> - 如果删除的文件已经被修改过,或者已经被添加到暂存区中,那么则需要用<code>-f</code>参数强制删除。这是一个保护措施,因为还未被提交的修改不会被保存下来,是无法恢复的。</p></li><li><p><code>--cached</code> - 如果希望某个仓库中的文件不再被<code>GIT</code>跟踪,但是依然被保存在磁盘里,这种时候可以使用<code>--cached</code>来删除。在错误的添加了文件到仓库中后,这个参数非常有用。</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git rm --cached filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ol><hr><h4 id="【reset】"><a href="#【reset】" class="headerlink" title="【reset】"></a>【reset】</h4><p>使用<code>GIT</code>最大的一个好处是,<code>GIT</code>会将你提交的每个<code>commit</code>保存下来,以供你以后在出现问题后,能够非常方便的回滚版本。回滚版本的其中一个命令就是<code>reset</code>。</p><p>在你将一些文件使用<code>add</code>命令添加到暂存区之后,使用<code>git status</code>命令查看状态时可以看到提示,如果想将添加到暂存区的文件取消暂存则可以使用以下命令:</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git reset HEAD <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>file</span><span class="token punctuation">></span></span>...<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在这里,<code>HEAD</code>代表的是最近一次的<code>commit</code>,此命令的意思则是将指定文件回滚到最近一次<code>commit</code>提交的状态。</p><p>如果没有指定文件的话,那么将会回滚整个仓库的状态,如下:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git reset HEAD<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><strong>版本表示</strong>:</p><p>回滚的时候可以指定回滚的版本,版本的表示方式有三种,默认情况下都是指向最近一次提交:</p><ol><li><ul><li><code>HEAD</code> - 最近一个提交</li><li><code>HEAD^</code> - 上一次提交(倒数第二次提交)</li><li><code>HEAD^ ^</code> - 倒数第三次提交</li><li><code>HEAD^^^</code> - 倒数第四次的提交</li></ul></li><li><ul><li><code>HEAD~0</code> - 最近一个提交</li><li><code>HEAD~1</code> - 上一次提交(倒数第二次提交)</li><li><code>HEAD~2</code> - 倒数第三次提交</li><li><code>HEAD~3</code> - 倒数第四次的提交</li></ul></li><li>每次提交的<code>SHA1</code>版本号。</li></ol><p><strong>参数</strong>:</p><ol><li><code>--mixed</code> - <code>GIT</code>的默认模式,使用此模式的时候,会清空暂存区,将回滚的内容全部恢复成未暂存的状态。也就是说不会修改任何本地工作区文件,只会回滚<code>index</code>和清空暂存区。</li><li><code>--soft</code> - 使用此模式,同样不会修改任何本地工作区文件,与<code>--mixed</code>的区别主要在于,其会将回滚的内容放入暂存区中。</li><li><code>--hard</code> - 此模式是一个比较危险的命令,使用此模式,将会把仓库彻底还原到<code>commit</code>的状态。如果你的暂存区和工作区中有修改了但未提交的内容,将会彻底丢失,所以谨慎使用此模式。</li></ol><hr><h4 id="【diff】"><a href="#【diff】" class="headerlink" title="【diff】"></a>【diff】</h4><p><code>git diff</code>命令可以查看两次文件内容有什么不同。使用以下命令可以查看工作区和版本库中最新版本的区别。</p><pre class="line-numbers language-jsx" data-language="jsx"><code class="language-jsx">git diff <span class="token constant">HEAD</span> <span class="token operator">--</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>filename</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在这里<code>--</code>表示的是工作区,<code>HEAD</code>表示的是最近一次<code>commit</code>提交的版本,还可以用<code>--cached</code>代表暂存区。</p><p>在没有指定的情况下,是默认查看工作区和暂存区的区别:</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git diff <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>filename</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><hr><h4 id="【log】"><a href="#【log】" class="headerlink" title="【log】"></a>【log】</h4><p>使用<code>git log</code>命令,将会用以下的格式输出提交的<code>commit</code>日志记录,如果记录较多的话,需要按<code>q</code>键退出查看。</p><pre class="line-numbers language-tsx" data-language="tsx"><code class="language-tsx">$ git logcommit <span class="token number">69</span><span class="token function">b8e6b3ebff7b84d6190a374475a20482d4c3ba</span> <span class="token punctuation">(</span><span class="token constant">HEAD</span> <span class="token operator">-</span><span class="token operator">></span> master<span class="token punctuation">,</span> origin<span class="token operator">/</span>master<span class="token punctuation">,</span> origin<span class="token operator">/</span><span class="token constant">HEAD</span><span class="token punctuation">)</span>Author<span class="token operator">:</span> jonson <span class="token operator"><</span>jonson<span class="token decorator"><span class="token at operator">@</span><span class="token function">xxx</span></span><span class="token punctuation">.</span>com<span class="token operator">></span>Date<span class="token operator">:</span> Thu Nov <span class="token number">21</span> <span class="token number">17</span><span class="token operator">:</span><span class="token number">16</span><span class="token operator">:</span><span class="token number">53</span> <span class="token number">2018</span> <span class="token operator">+</span><span class="token number">0800</span> add git branch partcommit 28056c5055ef9ed4156b74713c0205e8fde44713Author<span class="token operator">:</span> jonson <span class="token operator"><</span>jonson<span class="token decorator"><span class="token at operator">@</span><span class="token function">xxx</span></span><span class="token punctuation">.</span>com<span class="token operator">></span>Date<span class="token operator">:</span> Thu Nov <span class="token number">21</span> <span class="token number">15</span><span class="token operator">:</span><span class="token number">21</span><span class="token operator">:</span><span class="token number">30</span> <span class="token number">2018</span> <span class="token operator">+</span><span class="token number">0800</span> complete basic git commandcommit 6f6aae904ad7551d49ab952e9e3afae70bc93c50Author<span class="token operator">:</span> jonson <span class="token operator"><</span>jonson<span class="token decorator"><span class="token at operator">@</span><span class="token function">xxx</span></span><span class="token punctuation">.</span>com<span class="token operator">></span>Date<span class="token operator">:</span> Thu Nov <span class="token number">21</span> <span class="token number">17</span><span class="token operator">:</span><span class="token number">19</span><span class="token operator">:</span><span class="token number">46</span> <span class="token number">2018</span> <span class="token operator">+</span><span class="token number">0800</span> add git<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>参数</strong>:</p><ul><li><p><code>--oneline</code> - 每条<code>commit</code>日志只显示一行内容:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ <span class="token function">git</span> log --oneline69b8e6b <span class="token punctuation">(</span>HEAD -<span class="token operator">></span> master, origin/master, origin/HEAD<span class="token punctuation">)</span> <span class="token function">add</span> <span class="token function">git</span> branch part28056c5 complete basic <span class="token function">git</span> <span class="token builtin class-name">command</span>6f6aae9 <span class="token function">add</span> <span class="token function">git</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><code>--skip</code> - 指定跳过前面几条日志:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">$ git log <span class="token operator">--</span>skip<span class="token operator">=</span><span class="token number">4</span> <span class="token operator">--</span>onelineb9922fc <span class="token keyword">add</span> gitedd4594 change the python file namea9cded2 <span class="token keyword">add</span> git article<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><code>-[length]</code> - 指定输出的日志数量</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ <span class="token function">git</span> log --oneline -269b8e6b <span class="token punctuation">(</span>HEAD -<span class="token operator">></span> master, origin/master, origin/HEAD<span class="token punctuation">)</span> <span class="token function">add</span> <span class="token function">git</span> branch part28056c5 complete basic <span class="token function">git</span> <span class="token builtin class-name">command</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li><li><p><code>--pretty=</code> - 使用其他格式显示提交信息,可选项有:oneline、short、medium、full、fuller、email、raw,默认为medium。</p></li><li><p><code>--graph</code> - 在左侧以图形的方式显示提交的<code>commit</code>变动,更清晰的展示分支的合并等信息。</p></li><li><p><code>--decorate</code> - 展示更多的信息,例如HEAD、分支名、tag。</p></li><li><p><code>--author</code> - 通过提交者的名字来搜索提交信息。</p></li><li><p><code>--grep</code> - 从提交的关键字搜索提交信息。</p></li><li><p><code>-p</code> - 通过路径搜索提交信息</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> log -p -- config/my.config<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ul><hr><h4 id="【tag】"><a href="#【tag】" class="headerlink" title="【tag】"></a>【tag】</h4><p>在<code>GIT</code>中还有一个非常方便的功能,就是打标签,可以给某个特定的<code>commit</code>进行标记。比较广泛的一个方式使用它来标记版本号。使用以下命令将会给当前分支最新的一个<code>commit</code>打上<code>tag</code>。</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git tag <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tagname</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果你需要指定给某个<code>commit</code>打<code>tag</code>的话,则需要你在命令后面加上<code>commit</code>的id。</p><p>使用以下命令可以查看<code>tag</code>的信息:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag <span class="token comment"># 查看本地所有tag</span><span class="token function">git</span> show <span class="token operator"><</span>tagname<span class="token operator">></span> <span class="token comment"># 查看指定tag的详细信息</span><span class="token function">git</span> ls-remote --tags <span class="token operator"><</span>remotename<span class="token operator">></span> 查看远程所有tag<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>需要注意的是,我们创建的<code>tag</code>都是只存在于本地的,所以如果要把<code>tag</code>同步到远程仓库的话,需要额外单独的使用命令同步<code>tag</code>。</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git push <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>remotename</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tagName</span><span class="token punctuation">></span></span> # 推送单个tag到远程仓库git push <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>remotename</span><span class="token punctuation">></span></span> --tags # 推送所有未推送的tag到远程仓库<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p><strong>参数</strong>:</p><ul><li>-<code>a</code> - 指定<code>tag</code>的名字。</li><li><code>-m</code> - 给<code>tag</code>添加上备注的信息,与<code>commit</code>的信息类似。</li><li><code>-d</code> - 这个参数代表删除<code>tag</code>。需要注意的是如果要删除远程的<code>tag</code>,则需要本地删除后,再push到远程仓库。</li></ul><hr><h2 id="五、分支管理"><a href="#五、分支管理" class="headerlink" title="五、分支管理"></a>五、分支管理</h2><p>在<code>GIT</code>之中,有分支的概念。在这里举一个例子,你希望在你的工作项目上新增添一个功能,那么你就可以在当前项目的基础上新开一个分支,然后在这个专门的分支上开发的你新功能,而原来的工作项目不受任何影响。等到你的新功能开发完毕通过测试后,就可以将这个分支与之前的工作项目分支合并了。</p><p>这种开发方式,能够将工作从开发主线上分离开来,避免工作时影响到工作主线。</p><p>由于<code>GIT</code>的分支实现原理跟指针类似,所以创建切换合并分支都是非常迅速的。<code>GIT</code>也非常鼓励新建一个分支去完成任务,任务完成后和主分支合并,然后删除掉这个新分支,这样使用下来与直接在主分支工作是差不多的,但是安全性要高不少。</p><h4 id="【branch】"><a href="#【branch】" class="headerlink" title="【branch】"></a>【branch】</h4><p>首先,直接使用<code>git branch</code>命令是查看当前仓库的分支:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git branch<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果在<code>git branch</code>命令后面跟上一个名字,则可以在当前仓库新建一个分支:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git branch working<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>也可以使用当前分支的某历史版本创建分支,这样的话需要指定具体的<code>commit</code>的ID:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git branch working 169d2dc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>需要注意的是,仓库一般默认会有一个<code>master</code>分支,这个分支其实并没有什么特殊,跟其他新建的分支没有什么区别,只是在<code>git init</code>时默认会创建这样一个分支,大部分人也懒得去修改。</p><p><strong>参数</strong>:</p><ul><li><p><code>-d</code> - 如果在创建之后需要删除一个分支,可以加上此参数。</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git branch -d working<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ul><hr><h4 id="【checkout】"><a href="#【checkout】" class="headerlink" title="【checkout】"></a>【checkout】</h4><p>在创建了分支之后,我们所处的依然是之前的分支,要切换到新的分支的话,依然是需要我们手动切换的。</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git checkout working<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><strong>参数</strong>:</p><ul><li><code>-b</code> - 加上这个参数之后,则代表直接创建一个分支,并且切换到这个分支,也就是说可以省略掉<code>git branch</code>这个步骤。</li></ul><hr><h4 id="【merge】"><a href="#【merge】" class="headerlink" title="【merge】"></a>【merge】</h4><p>在创建了分支之后,大部分情况下最终都是要合并的,也就是将分支修改的内容和另一个分支的修改内容合并到一起。</p><p>使用<code>git merge</code>命令将可以把某一分支与当前分支合并到一起:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git merge working<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果两个分支之间没有冲突的话,那么分支的合并将会非常简单,<code>GIT</code>会自行决定如何合并两个分支。但是如果两个分支之间有文件冲突的话,也就是说两个分支内都对同一个文件进行了修改这种类似的操作,<code>GIT</code>将无法决定保留哪一个分支的内容。</p><p>因为在逻辑层面上,也需要由你自己来决定,在冲突的情况下,保留哪个分支的内容。在这种情况下,合并的时候会显示类似以下的内容:</p><pre class="line-numbers language-css" data-language="css"><code class="language-css">CONFLICT <span class="token punctuation">(</span>content<span class="token punctuation">)</span><span class="token punctuation">:</span> Merge conflict in a.txtAutomatic merge failed<span class="token punctuation">;</span> fix conflicts and then commit the result.<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>在冲突的文件内,<code>GIT</code>会将两个分支的内容都放在了一起,由你自行修改:</p><pre class="line-numbers language-jsx" data-language="jsx"><code class="language-jsx"><span class="token operator"><<</span><span class="token operator"><<</span><span class="token operator"><<</span><span class="token operator"><</span> <span class="token constant">HEAD</span>i am master<span class="token operator">===</span><span class="token operator">===</span><span class="token operator">=</span>hello<span class="token punctuation">,</span> i am working<span class="token operator">>>></span><span class="token operator">>>></span><span class="token operator">></span> working<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>可以看到<code>====</code>分割上方的是当前分支的内容,下方是合并的<code>working</code>分支的内容。此时由你自行修改,处理完冲突之后,<code>add</code>添加好就可以提交了。</p><hr><h2 id="六、远程仓库"><a href="#六、远程仓库" class="headerlink" title="六、远程仓库"></a>六、远程仓库</h2><p>在前面讲的用法基本上都是本地的<code>GIT</code>用法,但是使用<code>GIT</code>很大的一个优势是可以多人协作,同时完成项目,那么这基本必然要涉及到远程仓库的使用。远程仓库可以自己在服务器上搭建,也可以使用一些其他人提供的仓库托管服务,例如<code>Github</code>这个全球最大的同性交友网站。</p><p>使用<code>init</code>命令生成的仓库中,是没有配置远程仓库的,需要自行配置。而如果是使用<code>clone</code>获取的仓库,则会将来源的远程仓库默认配置为一个名为<code>origin</code>的远程仓库,这个远程仓库没有什么特殊,只是默认起名而已。在一些比较复杂的多人合作项目中,会配置有多个远程仓库。</p><h4 id="【remote】"><a href="#【remote】" class="headerlink" title="【remote】"></a>【remote】</h4><p>使用<code>git remote</code>命令即可查看当前仓库有配置哪些远程仓库:</p><pre class="line-numbers language-ruby" data-language="ruby"><code class="language-ruby">$ git remoteorigin<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>如果你需要添加新的远程仓库,那么可以使用以下命令:</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git remote add <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>shortname</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span> <span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><code><shortname></code>是你给这个远程分支起的名字,这个名字只会在本地起作用。</p><p>以下还有一些显示与删除等命令:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> remote show <span class="token punctuation">[</span>remote-name<span class="token punctuation">]</span> <span class="token comment"># 显示远程仓库详细的信息</span><span class="token function">git</span> remote <span class="token function">rename</span> old_name new_name <span class="token comment"># 重命名远程仓库</span><span class="token function">git</span> remote <span class="token function">rm</span> remote_name <span class="token comment"># 删除远程仓库</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p><strong>参数</strong>:</p><ul><li><code>-v</code> - 会显示远程仓库的url。</li></ul><hr><h4 id="【fetch】"><a href="#【fetch】" class="headerlink" title="【fetch】"></a>【fetch】</h4><p>在配置了远程仓库之后,就可以从远程仓库拉取内容了。这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。</p><pre class="line-numbers language-css" data-language="css"><code class="language-css">git fetch [remote-name]<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果需要只拉取某个分支的内容,需要在后面加上分支的名称。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch origin master <span class="token comment"># 拉取远程仓库origin中的master分支</span><span class="token function">git</span> fetch origin master:temp <span class="token comment"># 拉取远程仓库origin中的master分支,并命名为temp分支</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>需要注意的是,<code>fetch</code>这个命令只是将版本库中的内容拉取下来,并不会自动合并和修改你工作区中的内容,需要你自行手动合并。</p><p>之后需要合并拉取的内容到工作区的话,需要使用<code>git merge</code>命令。</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git merge FETCH_HEAD<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这里的<code>FETCH_HEAD</code>是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。</p><p>一般来说一个比较常见且安全的使用方式如下:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch origin master:tmp <span class="token comment"># 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支</span><span class="token function">git</span> <span class="token function">diff</span> tmp <span class="token comment"># 来比较本地代码与刚刚从远程下载下来的代码的区别</span><span class="token function">git</span> merge tmp <span class="token comment"># 合并temp分支到本地的master分支</span><span class="token function">git</span> branch -d temp <span class="token comment"># 如果不想保留temp分支 可以用这步删除</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><hr><h4 id="【pull】"><a href="#【pull】" class="headerlink" title="【pull】"></a>【pull】</h4><p>如果觉得使用<code>fetch</code>命令比较麻烦,且确定远程仓库的内容可以安全合并的话,那么可以使用<code>pull</code>命令。<code>pull</code>命令其实是一个混合命令,相当于把<code>git fetch</code>和<code>git merge</code>这两个命令合并到了一起,一个命令直接解决问题。</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git pull origin<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><hr><h4 id="【push】"><a href="#【push】" class="headerlink" title="【push】"></a>【push】</h4><p>在多人协作完成项目时,本地工作完成后,需要推送到远程仓库中,这个时候需要使用<code>git push</code>命令来进行推送。这个命令的用法如下所示:</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">git push <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>远程主机名</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>本地分支名</span><span class="token punctuation">></span></span>:<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>远程分支名</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果当前分支只有一个远程分支,那么主机名与分支名都可以省略:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git push<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果当前分支与远程分支存在追踪关系,则可以省略分支名,只留主机名,例如:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git push origin<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果只省略远程分支名,则表示将分支退送到与之存在追踪关系的分支,如果远程分支不存在,则创建新的远程分支:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git push origin master<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果只省略本地分支名,则代表删除指定远程分支:</p><pre class="line-numbers language-undefined" data-language="undefined"><code class="language-undefined">git push origin :master<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><hr><h2 id="七、配置忽略文件"><a href="#七、配置忽略文件" class="headerlink" title="七、配置忽略文件"></a>七、配置忽略文件</h2><p>在使用<code>GIT</code>管理项目时,我们项目里常常会有一些文件是不需要纳入版本管理的,例如<code>Mac</code>系统的<code>.DS_Store</code>之类的默认文件,又比如Python的运行生成的<code>__pycache__</code>目录。</p><p>如果这种文件较多时,我们添加文件将变得比较的麻烦,所以<code>GIT</code>给我们提供了一个方式,可以忽略掉指定的文件。</p><p>首先是配置全局忽略,<code>GIT</code>管理的仓库都能起效。配置的方式有几种,我们这里主要使用<code>.gitignore</code>文件来进行配置。</p><p>首先我们需要创建一个<code>.gitignore</code>文件,这个文件放在哪里都可以,但推荐的位置是直接放到家目录中:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">touch</span> .gitignore<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>然后,我们需要将此文件配置到<code>GIT</code>中(如果有修改文件路径的话,这里需要相应的修改):</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> config --global core.excludesfile ~/.gitignore<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>最后,我们再来编辑<code>.gitignore</code>文件,将需要忽略的文件写到这个文件中即可,文件内格式如下所示:</p><pre class="line-numbers language-css" data-language="css"><code class="language-css">.DS_Store__pycache__*.pyc.vscode<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>如果需要按照具体的项目来配置特定的忽略文件的话,那么可以配置一个<code>.gitignore</code>文件直接放到仓库的根目录即可。</p><p>作者:王南北丶<br>链接:<a href="https://www.jianshu.com/p/0e9d07ec76f9">https://www.jianshu.com/p/0e9d07ec76f9</a><br>来源:简书<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p>]]></content>
<categories>
<category> git </category>
</categories>
<tags>
<tag> git </tag>
<tag> 管理 </tag>
</tags>
</entry>
<entry>
<title>5个思维方式,助你提升格局、眼界,看到别人看不见的东西</title>
<link href="/2022/04/19/5-ge-si-wei-fang-shi-zhu-ni-ti-sheng-ge-ju-yan-jie-kan-dao-bie-ren-kan-bu-jian-de-dong-xi/"/>
<url>/2022/04/19/5-ge-si-wei-fang-shi-zhu-ni-ti-sheng-ge-ju-yan-jie-kan-dao-bie-ren-kan-bu-jian-de-dong-xi/</url>
<content type="html"><![CDATA[<p>不说废话,总结了以往读过的20几本思维方法、大脑结构等相关书籍,再回顾自己几年的工作经验,我提炼出了这5个思维方式。</p><p><strong>1、闭环思维</strong></p><p>闭环的本质是你要给人一种确定性,交代给别人或别人交代给自己的事,肯定会有一个确定的结果。</p><p>它体现在行为上,就是 “凡事有交代,件件有着落,事事有回音。”共可分为三个层次:</p><p><strong>① 沟通闭环:</strong>主动反馈过程,积极反馈结果。</p><p><strong>② 能力闭环:</strong>能力与承诺匹配,既不盲目承诺,也不碰到挑战就躲。</p><p><strong>③ 结果闭环:</strong>抱着对结果负责的态度,做到自己的最大极限。</p><p>这三种层次闭环的要求是逐层递进的。</p><p>你要做到能力闭环,就必然会做到沟通闭环,因为你只有不断地主动反馈,才会让能力更好地匹配承诺。你要做到结果闭环,就必然要做到能力闭环、沟通闭环,否则你就没办法对结果负责。</p><p><strong>2、风险储备思维</strong></p><p><strong>风险储备是富人相较于穷人,大公司相较于小公司的巨大优势。</strong></p><p>对穷人或小微企业而言,风险储备是一种奢侈,是一种可望而不可即的宝贵资源,因此他们不得不在风险储备不足的情况下,以九死一生的做法去博很低很低的那么一点成功概率。</p><p>2019年诺贝尔经济学奖的三位得主阿比吉特·巴纳吉、埃丝特·迪弗洛和迈克尔·克雷默,他们在《贫穷的本质:你为什么摆脱不了贫穷》一书中研究出的贫穷本质之一就是:</p><p><strong>穷人因为没有任何风险储备,不得不采取侥幸的心态与短视的行为,同时又因无法承担任何小错误所导致的后果,从而陷入贫穷陷阱里难以<strong><strong>跳出</strong></strong>。</strong></p><p>他们看到的穷人走出贫穷陷阱的唯一方式就是,一代人甚至两代人牺牲自己作为下一代的风险储备,但这种方式对付出的一代人而言又是多么地残忍呢?</p><p>因此一旦你有了做风险储备的条件,请万分珍惜,认真做好风险储备。</p><p>我从2014年底创业以来,最重要的经营原则之一就是确保公司的现金流在零收入的情况下,至少能维持6~12个月的支出,一旦低于这个警戒线,我就会千方百计地提前去筹钱了。</p><p>这也是你这些年来历经几次大的业务转型和今年的特殊情况,公司经营依然能够有条不紊的关键原因之一。</p><p><strong>3、</strong> <strong>有针对性地提高惯性思维的质量</strong></p><p>无论你对惯性思维的印象有多么负面,比如思维局限啦、缺乏创新啦、顽固不化啦,你都无法摆脱它。</p><p><strong>因为你的生理构造已经决定了,你永远也无法摆脱惯性思维。</strong></p><p>虽然大脑大约只占你人体质量的2%。</p><p>但即使坐着不动,它也会消耗人体热量的20%,全身耗氧量的25%,以及消耗掉肝脏储存血糖的75%。</p><p>哪怕在发呆,你的大脑每分钟也需要0.1卡路里的热量,而当你集中精力进行思考的时候,大脑每分钟消耗的能量则是1.5卡路里。</p><p>而你每一次反惯性思维的思考,都需要大脑消耗更多的能量。</p><p>一旦消耗过多,就会出现心理学上的“自我损耗(ego depletion)”现象,<strong>你的自我控制力会大大下降,从而更依赖惯性思考。</strong></p><p><img src="https://s2.loli.net/2022/04/19/JKWPVm2C7frHFXE.png" alt="5个思维方式,助你提升格局、眼界,看到别人看不见的东西"></p><p>所以不要老想着去摆脱惯性思维了,而是转换思路:想办法提高惯性思考的质量。</p><p>就像大禹治水一样,不要总想着堵——堵狠了反而洪水更泛滥了——而是要顺着河道疏导,一疏导水反而就听话了。</p><p>那如何疏导大脑,让惯性思考的质量更高呢?</p><p><strong>方法就是让更高质量的“框架”成为你的思考惯性。</strong></p><p>举个例子:</p><blockquote><p>同样接到一个推广书籍的任务,一般人惯性思考想到的可能是去微博推广、找公众号推送、在社群里发通知等等。<br>而我惯性思考想到的是,这次推广要达成多少本书的销售?要在多长时间内实现? 现有的公众号和社群在这段时间内能满足多少?是不是还有差距?如果有的话用哪些渠道补充最合适?</p></blockquote><p>我的这个惯性思考框架就比上面的那个框架质量高一些。</p><p><strong>4、元认知思维</strong></p><p>元认知水平决定了你能否有效地评估自我水平,以及监控自己的思维和学习过程。</p><p>有什么高效方法,可以提高自我的元认知水平呢?</p><p>三个行之有效的方法。</p><p><strong>▼ 1、构建自己的能力体系</strong></p><p>要提升对自我的认知水平,一个很好的方式就是构建出自己的能力体系。</p><p>这样你就能更清楚地知道,自己当前的能力、技能、知识是怎样的,在不同的领域分别有哪些差距。</p><p><img src="https://s2.loli.net/2022/04/19/WEB4GxJzITVDORZ.jpg" alt="5个思维方式,助你提升格局、眼界,看到别人看不见的东西"></p><p><strong>▼ 2、有意识地应用策略来学习</strong></p><p>不同的学习策略在不同的情境下,学习效果会有天壤之别。</p><p>重复策略——比如反复背诵——在学习一门语言上有着独到的优势。</p><p>但在学习哲学时就不那么有效了,这时精加工策略的效果就远远好于重复策略了。</p><p>因此,你在学习时,如果能有意识地识别出自己正在应用的学习策略,并能根据不同情境有意识地调整不同的学习策略的话。</p><p>那么你的学习效率和学习效果都将大大提升。</p><p><strong>▼ 3、显性化监控、评测和调节过程</strong></p><p>无论你对自身水平做多少评测,也不管你的学习策略多么有效,在真正学习一个技能或知识时,你依然会发生偏差。</p><p>因为在目前的科技条件下,你依然没有能力完全认清这个世界的本质规律,以及认清你自己。</p><p>因此,在学习中你要刻意监控自己的学习过程,评测自己的学习效果,以及针对学习偏差进行调节。</p><p>这就是学习的元认知过程。</p><p>这个过程理解起来很容易,偶尔做一次也不难,但难就难在如何坚持持续去做。</p><p>因为绝大多数时候,你压根就意识不到你没有在监控学习过程。</p><p>等你发现学习效果不佳的时候,学习时间和资源已经全部被消耗完了,甚至整个人生都消耗掉2/3了。</p><p>因此,你需要养成一个学习的自我监控、评测、调节的习惯才行。</p><p><strong>5、从三个层次提升换位思考能力</strong></p><p>如何做到换位思考?</p><p>这事说起来容易,想做到却很难。</p><p>不过,我有一个有效的方法,可以从三个层次提升你的换位思考能力:</p><p><strong>第一层:知不知</strong></p><p>很多时候,你并不是不知道换位思考的重要性,而是意识不到自己其实没在换位思考。</p><p>有两个行之有效的方法,可以帮助你提醒自己:</p><p><strong>1)在醒目的地方做提醒标识</strong></p><blockquote><p>比如,在座位的隔板上、电脑桌面上或者手机的日历提醒里记上“别忘了换位思考哦”, 经常提醒自己</p></blockquote><p><strong>2)每日做换位思考日复盘</strong></p><blockquote><p>比如,要求自己每天至少做到3次换位思考,并每天晚上将这些换位思考的场景用文字再复 述一遍。</p></blockquote><p><strong>第二层:能不能</strong></p><p>意识到了换位思考,不代表你就能做好换位思考。</p><p>要真正成为换位思考的高手,你得从两方面入手:</p><p><strong>① 想人所想</strong></p><p>处理人际关系时,不要光看对方行为的表象,要多思考行为背后的原因或目的。</p><blockquote><p>比如,对配合的事一拖再拖的同事,可能并不是没有协作意识,而是因为领导给他布置了 优先级更高的任务,他没有时间来处理你的事。</p></blockquote><p><strong>② 感同身受</strong></p><p>分析出对方行为背后的原因后,不代表你就能感同身受,因为你每个人的成长环境、性格特征、人生阅历都各有不同。</p><p>所以你要丰富自己的阅历,深入了解各种不同类型的人,才能真正做到感同身受。</p><p><strong>第三层:愿不愿</strong></p><p>绝大多数时候,换位思考的本质还是为了自己。</p><p>站在别人的角度考虑问题、设身处地地理解他人,其最终目的还是为了自己能更好地与他人交往,或影响他人。</p><p>所以当这种换位思考的行为,和你的利益没有冲突,甚至有利时,你是会很乐意去做的。</p><p>但一旦发生利益冲突后,你就不得不面临愿不愿意让利的问题了。</p><p>比如,努力工作5年之后,你终于等到了一个升职机会,但跟你竞争的一位同事家里很困难,更需要这个机会。</p><p>你能做到让利成全别人吗?</p><p>……</p><p>如果你能做到的话,你就达到换位思考的第三层水平,也就是“圣人”层次了。</p>]]></content>
<categories>
<category> 思维 </category>
</categories>
</entry>
<entry>
<title>自建jenkins镜像</title>
<link href="/2022/04/08/zi-jian-jenkins-jing-xiang/"/>
<url>/2022/04/08/zi-jian-jenkins-jing-xiang/</url>
<content type="html"><![CDATA[<pre class="line-numbers language-docker" data-language="docker"><code class="language-docker"><span class="token instruction"><span class="token keyword">FROM</span> jenkins/jenkins:lts</span><span class="token comment"># Switch to root to install .NET Core SDK</span><span class="token instruction"><span class="token keyword">USER</span> root</span><span class="token comment"># Show distro information!</span><span class="token instruction"><span class="token keyword">RUN</span> uname -a && cat /etc/*release</span><span class="token comment"># Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current</span><span class="token comment"># Install dependency for .NET Core 6</span><span class="token instruction"><span class="token keyword">RUN</span> apt-get update</span><span class="token instruction"><span class="token keyword">RUN</span> apt-get install -y curl libunwind8 gettext apt-transport-https</span><span class="token comment"># Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current</span><span class="token comment"># Install microsoft.qpg</span><span class="token instruction"><span class="token keyword">RUN</span> curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg</span><span class="token instruction"><span class="token keyword">RUN</span> mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg</span><span class="token instruction"><span class="token keyword">RUN</span> sh -c <span class="token string">'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list'</span></span><span class="token comment"># Install the .NET Core framework</span><span class="token instruction"><span class="token keyword">RUN</span> apt-get update</span><span class="token instruction"><span class="token keyword">RUN</span> apt-get install -y dotnet-sdk-6.0</span><span class="token instruction"><span class="token keyword">RUN</span> apt-get install -y nodejs</span><span class="token comment"># Install Flubu Tools</span><span class="token instruction"><span class="token keyword">RUN</span> dotnet tool install --global FlubuCore.Tool</span><span class="token comment"># Install Docker CLi</span><span class="token instruction"><span class="token keyword">ENV</span> DOCKERVERSION=20.10.9</span><span class="token instruction"><span class="token keyword">RUN</span> curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-<span class="token variable">${DOCKERVERSION}</span>.tgz <span class="token operator">\</span> && tar xzvf docker-<span class="token variable">${DOCKERVERSION}</span>.tgz --strip 1 <span class="token operator">\</span> -C /usr/local/bin docker/docker <span class="token operator">\</span> && rm docker-<span class="token variable">${DOCKERVERSION}</span>.tgz</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
<categories>
<category> Jenkins </category>
</categories>
<tags>
<tag> jenkins </tag>
<tag> ci </tag>
</tags>
</entry>
<entry>
<title>技术人员转团队管理该怎么做,这篇文章告诉你</title>
<link href="/2022/04/01/ji-zhu-ren-yuan-zhuan-tuan-dui-guan-li-gai-zen-me-zuo-zhe-pian-wen-zhang-gao-su-ni/"/>
<url>/2022/04/01/ji-zhu-ren-yuan-zhuan-tuan-dui-guan-li-gai-zen-me-zuo-zhe-pian-wen-zhang-gao-su-ni/</url>
<content type="html"><![CDATA[<h3 id="一、管理团队的三板斧"><a href="#一、管理团队的三板斧" class="headerlink" title="一、管理团队的三板斧"></a><strong>一、管理团队的三板斧</strong></h3><p>管理归纳总结起来就是三板斧,<strong>拿结果、建团队、招聘与解聘</strong>,只要做好这三件事,我们的团队管理工作一定不要差到哪里去,以我的经验,相当一部分的团队管理者其实做的比较差,根本就不懂管理,也不去学如何管理,搞的团队乌烟瘴气,一团糟。</p><h4 id="1、拿结果"><a href="#1、拿结果" class="headerlink" title="1、拿结果"></a><strong>1、拿结果</strong></h4><p>现在的企业中一定是结果导向的,你的结果做的不好,团队的成长和绩效也不会好到哪里,所以我们的第一板斧就是拿结果,要问团队要结果。</p><p>那怎么拿结果呢?大家可以看下我下面的思维导图</p><p><img src="https://s2.loli.net/2022/04/01/fp3jUX8C9NKGPm7.png" alt="img"></p><h4 id="2、建团队"><a href="#2、建团队" class="headerlink" title="2、建团队"></a><strong>2、建团队</strong></h4><p> 下面的的思维导图是告诉我们在组建团队的过程中我们需要怎么做。</p><p><img src="https://s2.loli.net/2022/04/01/7nURZcKJVCvq6pz.png" alt="img"></p><h4 id="3、招聘-amp-解聘"><a href="#3、招聘-amp-解聘" class="headerlink" title="3、招聘&解聘"></a><strong>3、招聘&解聘</strong></h4><p> 团队的人一定的活的,不能是死的,所以招聘解聘很重要,通过优胜劣汰保证团队的整体能力是向上发展的。在淘汰不合格的同事上一定要果断!</p><p><img src="https://s2.loli.net/2022/04/01/4AhoZzKj7qsUQwt.png" alt="img"></p><h3 id="二、跨团队大项目如何管理"><a href="#二、跨团队大项目如何管理" class="headerlink" title="二、跨团队大项目如何管理"></a>二、跨团队大项目如何管理</h3><p>做成功交付一个大项目,是技术人员转管理的重要捷径,所以有这样的机会,大家一定要把握住,过程中的磕磕绊绊,委屈都不要太在意,只要项目成功了,我们就成功了,所以大项目一定是把握住!</p><p> <img src="https://s2.loli.net/2022/04/01/mWGPEa6dLJijCpw.png" alt="img"></p><h3 id="三、技术规划的重点"><a href="#三、技术规划的重点" class="headerlink" title="三、技术规划的重点"></a>三、技术规划的重点</h3><p> 团队管理人也需要做技术规划,我们做技术规划要从以下几个维度进行考虑</p><p><img src="https://s2.loli.net/2022/04/01/hP6fDdjLnbzXivT.png" alt="img"></p><h3 id="四、接手一个新团队该如何怎么做"><a href="#四、接手一个新团队该如何怎么做" class="headerlink" title="四、接手一个新团队该如何怎么做"></a>四、接手一个新团队该如何怎么做</h3><p>一旦我们从技术转管理,一般不会让我们从零开始组建团队的,一定是接手一个已经存在的团队的,所以盘人和盘事,我们一定要做好</p><p><img src="https://s2.loli.net/2022/04/01/Fsp9jRGC38KdAe1.png" alt="img"></p><p>期望我上面的总结可以给大家带来帮助,谢谢!</p><p>转载:<a href="https://www.cnblogs.com/bainianminguo/p/16079774.html">https://www.cnblogs.com/bainianminguo/p/16079774.html</a></p>]]></content>
<categories>
<category> 管理 </category>
</categories>
<tags>
<tag> 管理 </tag>
<tag> 技术管理 </tag>
<tag> 团队管理 </tag>
</tags>
</entry>
<entry>
<title>Rust极简教程</title>
<link href="/2022/03/29/rust-ji-jian-jiao-cheng/"/>
<url>/2022/03/29/rust-ji-jian-jiao-cheng/</url>
<content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Rust是一门赋予每个人构建可靠且高效软件能力的编程语言。可靠主要体现在安全性上。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软件。</p><p><a href="https://img2022.cnblogs.com/blog/718864/202203/718864-20220322225451146-1012328002.png"><img src="https://s2.loli.net/2022/03/29/2JpYbRokW7CqSQd.png" alt="img"></a></p><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ul><li>高性能:Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。</li><li>可靠性:Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。</li><li>生产力:Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具——包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。</li><li>Rustacean:使用 rust 的攻城狮不叫 ruster 而是叫 Rustacean ,咱也不知道为什么,书上就是这么说的。</li></ul><h2 id="特征"><a href="#特征" class="headerlink" title="特征"></a>特征</h2><ul><li>作为一门编程语言,rust既可以分类为面向过程编程语言,也可以分类为面向对象编程语言</li><li>rust拥有精细化的基础数据结构</li><li>rust中支持泛型,并且拥有泛型枚举</li><li>rust中支持接口,甚至支持接口默认方法,并且接口既可以作为方法入参也可以作为方法出参</li></ul><h2 id="用途"><a href="#用途" class="headerlink" title="用途"></a>用途</h2><ul><li>传统命令行程序</li><li>嵌入式</li><li>网络服务</li><li>WebAssembly</li><li>Web服务</li><li>……</li></ul><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><blockquote><p>以 windows 11 为例</p></blockquote><p>下载 rustup-init.exe ,双击此可执行程序会打开一个命令行程序,此程序引导安装,具体安装过程:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Rust Visual C<span class="token operator">+</span><span class="token operator">+</span> prerequisitesRust requires the Microsoft C<span class="token operator">+</span><span class="token operator">+</span> build tools <span class="token keyword">for</span> Visual Studio <span class="token number">2013</span> <span class="token operator">or</span>later<span class="token punctuation">,</span> but they don't seem <span class="token keyword">to</span> be installed<span class="token punctuation">.</span>The easiest way <span class="token keyword">to</span> acquire the build tools <span class="token keyword">is</span> by installing MicrosoftVisual C<span class="token operator">+</span><span class="token operator">+</span> Build Tools <span class="token number">2019</span> which provides just the Visual C<span class="token operator">+</span><span class="token operator">+</span> buildtools<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>visualstudio<span class="token punctuation">.</span>microsoft<span class="token punctuation">.</span>com<span class="token operator">/</span>visual<span class="token operator">-</span>cpp<span class="token operator">-</span>build<span class="token operator">-</span>tools<span class="token operator">/</span>Please ensure the Windows <span class="token number">10</span> SDK <span class="token operator">and</span> the English language pack componentsare included <span class="token keyword">when</span> installing the Visual C<span class="token operator">+</span><span class="token operator">+</span> Build Tools<span class="token punctuation">.</span>Alternately<span class="token punctuation">,</span> you can install Visual Studio <span class="token number">2019</span><span class="token punctuation">,</span> Visual Studio <span class="token number">2017</span><span class="token punctuation">,</span>Visual Studio <span class="token number">2015</span><span class="token punctuation">,</span> <span class="token operator">or</span> Visual Studio <span class="token number">2013</span> <span class="token operator">and</span> during install <span class="token keyword">select</span>the <span class="token string">"C++ tools"</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>visualstudio<span class="token punctuation">.</span>microsoft<span class="token punctuation">.</span>com<span class="token operator">/</span>downloads<span class="token operator">/</span>Install the C<span class="token operator">+</span><span class="token operator">+</span> build tools before proceeding<span class="token punctuation">.</span><span class="token keyword">If</span> you will be targeting the GNU ABI <span class="token operator">or</span> otherwise know what you aredoing <span class="token keyword">then</span> it <span class="token keyword">is</span> fine <span class="token keyword">to</span> continue installation without the buildtools<span class="token punctuation">,</span> but otherwise<span class="token punctuation">,</span> install the C<span class="token operator">+</span><span class="token operator">+</span> build tools before proceeding<span class="token punctuation">.</span>Continue? <span class="token punctuation">(</span>y<span class="token operator">/</span>N<span class="token punctuation">)</span> yWelcome <span class="token keyword">to</span> Rust!This will download <span class="token operator">and</span> install the official compiler <span class="token keyword">for</span> the Rustprogramming language<span class="token punctuation">,</span> <span class="token operator">and</span> its <span class="token keyword">package</span> manager<span class="token punctuation">,</span> Cargo<span class="token punctuation">.</span>Rustup metadata <span class="token operator">and</span> toolchains will be installed into the Rustuphome directory<span class="token punctuation">,</span> located at<span class="token punctuation">:</span> C<span class="token punctuation">:</span>\Users\cml\<span class="token punctuation">.</span>rustupThis can be modified <span class="token keyword">with</span> the RUSTUP_HOME environment <span class="token keyword">variable</span><span class="token punctuation">.</span>The Cargo home directory located at<span class="token punctuation">:</span> C<span class="token punctuation">:</span>\Users\cml\<span class="token punctuation">.</span>cargoThis can be modified <span class="token keyword">with</span> the CARGO_HOME environment <span class="token keyword">variable</span><span class="token punctuation">.</span>The cargo<span class="token punctuation">,</span> rustc<span class="token punctuation">,</span> rustup <span class="token operator">and</span> other commands will be added <span class="token keyword">to</span>Cargo's bin directory<span class="token punctuation">,</span> located at<span class="token punctuation">:</span> C<span class="token punctuation">:</span>\Users\cml\<span class="token punctuation">.</span>cargo\binThis path will <span class="token keyword">then</span> be added <span class="token keyword">to</span> your PATH environment <span class="token keyword">variable</span> bymodifying the HKEY_CURRENT_USER<span class="token operator">/</span>Environment<span class="token operator">/</span>PATH registry key<span class="token punctuation">.</span>You can uninstall at any time <span class="token keyword">with</span> rustup self uninstall <span class="token operator">and</span>these changes will be reverted<span class="token punctuation">.</span>Current installation options<span class="token punctuation">:</span> default host triple<span class="token punctuation">:</span> x86_64<span class="token operator">-</span>pc<span class="token operator">-</span>windows<span class="token operator">-</span>msvc default toolchain<span class="token punctuation">:</span> stable <span class="token punctuation">(</span>default<span class="token punctuation">)</span> profile<span class="token punctuation">:</span> default modify PATH <span class="token keyword">variable</span><span class="token punctuation">:</span> yes<span class="token number">1</span><span class="token punctuation">)</span> Proceed <span class="token keyword">with</span> installation <span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token number">2</span><span class="token punctuation">)</span> Customize installation<span class="token number">3</span><span class="token punctuation">)</span> Cancel installation<span class="token operator">></span>info<span class="token punctuation">:</span> profile set <span class="token keyword">to</span> 'default'info<span class="token punctuation">:</span> default host triple <span class="token keyword">is</span> x86_64<span class="token operator">-</span>pc<span class="token operator">-</span>windows<span class="token operator">-</span>msvcinfo<span class="token punctuation">:</span> syncing channel updates <span class="token keyword">for</span> 'stable<span class="token operator">-</span>x86_64<span class="token operator">-</span>pc<span class="token operator">-</span>windows<span class="token operator">-</span>msvc'info<span class="token punctuation">:</span> latest update <span class="token keyword">on</span> <span class="token number">2022</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">20</span><span class="token punctuation">,</span> rust version <span class="token number">1.58.1</span> <span class="token punctuation">(</span>db9d1b20b <span class="token number">2022</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">20</span><span class="token punctuation">)</span>info<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'cargo' <span class="token number">3.8</span> MiB <span class="token operator">/</span> <span class="token number">3.8</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">1.7</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">2</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'clippy' <span class="token number">1.6</span> MiB <span class="token operator">/</span> <span class="token number">1.6</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">1.5</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">1</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'rust<span class="token operator">-</span>docs' <span class="token number">18.8</span> MiB <span class="token operator">/</span> <span class="token number">18.8</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">3.3</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">5</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'rust<span class="token operator">-</span>std' <span class="token number">22.9</span> MiB <span class="token operator">/</span> <span class="token number">22.9</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">3.2</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">7</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'rustc' <span class="token number">65.2</span> MiB <span class="token operator">/</span> <span class="token number">65.2</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">493.2</span> KiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">1</span>m <span class="token number">14</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> downloading <span class="token keyword">component</span> 'rustfmt' <span class="token number">2.2</span> MiB <span class="token operator">/</span> <span class="token number">2.2</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">631.2</span> KiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">3</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'cargo'info<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'clippy'info<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'rust<span class="token operator">-</span>docs' <span class="token number">18.8</span> MiB <span class="token operator">/</span> <span class="token number">18.8</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">1.9</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">6</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'rust<span class="token operator">-</span>std' <span class="token number">22.9</span> MiB <span class="token operator">/</span> <span class="token number">22.9</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">10.5</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">2</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'rustc' <span class="token number">65.2</span> MiB <span class="token operator">/</span> <span class="token number">65.2</span> MiB <span class="token punctuation">(</span><span class="token number">100</span> %<span class="token punctuation">)</span> <span class="token number">12.2</span> MiB<span class="token operator">/</span>s <span class="token keyword">in</span> <span class="token number">5</span>s ETA<span class="token punctuation">:</span> <span class="token number">0</span>sinfo<span class="token punctuation">:</span> installing <span class="token keyword">component</span> 'rustfmt'info<span class="token punctuation">:</span> default toolchain set <span class="token keyword">to</span> 'stable<span class="token operator">-</span>x86_64<span class="token operator">-</span>pc<span class="token operator">-</span>windows<span class="token operator">-</span>msvc' stable<span class="token operator">-</span>x86_64<span class="token operator">-</span>pc<span class="token operator">-</span>windows<span class="token operator">-</span>msvc installed <span class="token operator">-</span> rustc <span class="token number">1.58.1</span> <span class="token punctuation">(</span>db9d1b20b <span class="token number">2022</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">20</span><span class="token punctuation">)</span>Rust <span class="token keyword">is</span> installed now<span class="token punctuation">.</span> Great!<span class="token keyword">To</span> get started you may need <span class="token keyword">to</span> restart your current shell<span class="token punctuation">.</span>This would reload its PATH environment <span class="token keyword">variable</span> <span class="token keyword">to</span> includeCargo's bin directory <span class="token punctuation">(</span>%USERPROFILE%\<span class="token punctuation">.</span>cargo\bin<span class="token punctuation">)</span><span class="token punctuation">.</span>Press the Enter key <span class="token keyword">to</span> continue<span class="token punctuation">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="核心组件"><a href="#核心组件" class="headerlink" title="核心组件"></a>核心组件</h1><ul><li>rustup:安装、更新rust用的,rustup doc 可查看安装包中的官方指导文档</li><li>cargo:包管理器和编译源代码工具</li><li>rustc:将rust源文件编译成可执行程序</li><li>rustdoc:为rust项目生成说明文档</li></ul><h1 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h1><table><thead><tr><th align="left">命令</th><th align="left">说明</th><th align="left">备注</th></tr></thead><tbody><tr><td align="left">rustup doc</td><td align="left">打开官方指导文档</td><td align="left"></td></tr><tr><td align="left">cargo new projectName</td><td align="left">创建一个rust工程</td><td align="left">示例:cargo new firstRustProject</td></tr><tr><td align="left">cargo run</td><td align="left">运行rust工程</td><td align="left"></td></tr><tr><td align="left">cargo build</td><td align="left">编译rust工程</td><td align="left">若增加了依赖,即修改了toml文件,需要重新编译</td></tr></tbody></table><h1 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h1><ul><li>fn 声明函数</li><li>let 声明变量,变量默认不可变,加 mut 的变量为可变变量</li><li>虽然所有变量声明都用let关键字,但是rust是强类型的语言,内置了强大的类型推导</li><li>函数参数:参数名:参数数据类型</li><li>变量重影性质:同一个名称可以被多个变量使用,后面的变量会覆盖前面的变量</li><li>const 声明常量</li><li>//注释一行,/**/注释多行</li><li>使用英文分号换行</li></ul><p>示例:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//变量默认是不可变的,加上 mut 关键字就可以重新赋值。</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> x<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"The value of x is {} "</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> x<span class="token operator">=</span><span class="token number">6</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"The value of x is {} "</span><span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//变量的隐藏</span> <span class="token keyword">let</span> money<span class="token operator">=</span><span class="token number">100</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"money is {}"</span><span class="token punctuation">,</span>money<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> money <span class="token operator">=</span>money<span class="token operator">+</span><span class="token number">8</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"money is {}"</span><span class="token punctuation">,</span>money<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> money<span class="token operator">=</span><span class="token string">"一百元"</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"money is {}"</span><span class="token punctuation">,</span>money<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//常量使用 const 关键字声明,声明的时候必须指定数据类型,常量名全大写。</span> <span class="token comment">//不需要let , 不可使用mut 修饰</span> <span class="token keyword">const</span> <span class="token constant">MAX_PIONTS</span><span class="token punctuation">:</span> <span class="token keyword">u32</span><span class="token operator">=</span><span class="token number">888</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"The constant is {}"</span><span class="token punctuation">,</span><span class="token constant">MAX_PIONTS</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> result<span class="token punctuation">:</span><span class="token keyword">char</span><span class="token operator">=</span> <span class="token function">a_function</span><span class="token punctuation">(</span><span class="token number">88</span><span class="token punctuation">,</span> <span class="token char">'M'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"result is {}"</span><span class="token punctuation">,</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">fn</span> <span class="token function-definition function">a_function</span><span class="token punctuation">(</span>a<span class="token punctuation">:</span><span class="token keyword">u64</span><span class="token punctuation">,</span>b<span class="token punctuation">:</span><span class="token keyword">char</span><span class="token punctuation">,</span>c<span class="token punctuation">:</span><span class="token keyword">bool</span><span class="token punctuation">)</span><span class="token punctuation">-></span> <span class="token keyword">char</span><span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"a is {}"</span><span class="token punctuation">,</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"b is {}"</span><span class="token punctuation">,</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"c is {}"</span><span class="token punctuation">,</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token char">'N'</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Hello<span class="token punctuation">,</span> world!The value <span class="token keyword">of</span> x <span class="token keyword">is</span> <span class="token number">5</span>The value <span class="token keyword">of</span> x <span class="token keyword">is</span> <span class="token number">6</span>money <span class="token keyword">is</span> <span class="token number">100</span>money <span class="token keyword">is</span> <span class="token number">108</span>money <span class="token keyword">is</span> 一百元The <span class="token keyword">constant</span> <span class="token keyword">is</span> <span class="token number">888</span>a <span class="token keyword">is</span> <span class="token number">88</span>b <span class="token keyword">is</span> Mc <span class="token keyword">is</span> <span class="token boolean">false</span>result <span class="token keyword">is</span> N<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h2><h3 id="标量类型"><a href="#标量类型" class="headerlink" title="标量类型"></a>标量类型</h3><p>整数,浮点,布尔,字符</p><ul><li>整数:i8,u8,i16,u16,i32,u32,i64,u64,i128,u128,isize,usize<ul><li>i表示有符号</li><li>u表示无符号</li><li>isize 和 usize 两种整数类型是用来衡量数据大小的,它们的位长度取决于所运行的目标平台,如果是 32 位架构的处理器将使用 32 位位长度整型。</li></ul></li><li>浮点:f32,f64</li></ul><h3 id="复合类型"><a href="#复合类型" class="headerlink" title="复合类型"></a>复合类型</h3><p>可以将多个值放到一个数据类型中。</p><ul><li>元组-tuple。长度固定,元素的数据类型可以不同</li><li>数组,长度固定,元素的数据类型必须相同</li><li>Vector:不是标准库提供的。和数组类似,长度可变</li></ul><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> q<span class="token operator">=</span><span class="token number">3.0</span><span class="token punctuation">;</span> <span class="token keyword">let</span> q<span class="token punctuation">:</span><span class="token keyword">f32</span><span class="token operator">=</span><span class="token number">5.00</span><span class="token punctuation">;</span> <span class="token keyword">let</span> w<span class="token operator">=</span><span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">let</span> r<span class="token punctuation">:</span><span class="token keyword">bool</span> <span class="token operator">=</span><span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">let</span> t<span class="token operator">=</span>'🔣'<span class="token punctuation">;</span> <span class="token keyword">let</span> tup <span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token keyword">i32</span><span class="token punctuation">,</span><span class="token keyword">u64</span><span class="token punctuation">,</span><span class="token keyword">bool</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">88</span><span class="token punctuation">,</span><span class="token number">99</span><span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"元素1:{},元素2:{},元素3:{}"</span><span class="token punctuation">,</span>tup<span class="token number">.0</span> <span class="token punctuation">,</span> tup<span class="token number">.1</span><span class="token punctuation">,</span> tup<span class="token number">.2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> arr<span class="token punctuation">:</span><span class="token punctuation">[</span><span class="token keyword">u64</span><span class="token punctuation">;</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> arr2<span class="token operator">=</span><span class="token punctuation">[</span><span class="token char">'E'</span><span class="token punctuation">;</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"arr piont 2 is :{}"</span><span class="token punctuation">,</span>arr<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"arr2 piont 2 is :{}"</span><span class="token punctuation">,</span>arr2<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Vector:todo</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="条件语句"><a href="#条件语句" class="headerlink" title="条件语句"></a>条件语句</h2><p>和大多数编程语言一样, if - else if - else 表示条件语句,在 if 后面不用加括号。</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//条件语句</span> <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token number">12</span><span class="token punctuation">;</span> <span class="token keyword">let</span> b<span class="token punctuation">;</span> <span class="token keyword">if</span> a <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span> b <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> a <span class="token operator"><</span> <span class="token number">0</span> <span class="token punctuation">{</span> b <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> b <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"b is {}"</span><span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//三元运算符</span> <span class="token keyword">let</span> x <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token keyword">if</span> x <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"number 为 {}"</span><span class="token punctuation">,</span> number<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="循环"><a href="#循环" class="headerlink" title="循环"></a>循环</h2><ul><li>while</li><li>for</li><li>loop:终止循环,并返回一个值</li></ul><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//循环</span> <span class="token comment">//while</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> number <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span> number <span class="token operator">!=</span> <span class="token number">4</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"{}"</span><span class="token punctuation">,</span> number<span class="token punctuation">)</span><span class="token punctuation">;</span> number <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"while cycle EXIT"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//for - 迭代器</span> <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> a<span class="token punctuation">.</span><span class="token function">iter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"元素值为 : {}"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"for-iter cycle EXIT"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//for - 下标</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> length <span class="token operator">=</span> b<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"b 数组的长度是:{}"</span><span class="token punctuation">,</span> length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token number">0</span><span class="token punctuation">..</span>length <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"b[{}] = {}"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"for-index cycle EXIT"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//loop 终止循环,并返回一个值</span> <span class="token keyword">let</span> s <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token char">'R'</span><span class="token punctuation">,</span> <span class="token char">'U'</span><span class="token punctuation">,</span> <span class="token char">'N'</span><span class="token punctuation">,</span> <span class="token char">'O'</span><span class="token punctuation">,</span> <span class="token char">'B'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">let</span> location <span class="token operator">=</span> <span class="token keyword">loop</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> ch <span class="token operator">=</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> ch <span class="token operator">==</span> <span class="token char">'B'</span> <span class="token punctuation">{</span> <span class="token keyword">break</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> i <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">" \'B\' 的索引为 {}"</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="输出-amp-输入"><a href="#输出-amp-输入" class="headerlink" title="输出&输入"></a>输出&输入</h2><h3 id="输出"><a href="#输出" class="headerlink" title="输出"></a>输出</h3><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token builtin">println</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token string">"print a small =_=*"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="输出花括号"><a href="#输出花括号" class="headerlink" title="输出花括号"></a>输出花括号</h4><p>花括号中套花括号就可以输出花括号<br>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">let</span> <span class="token keyword">mut</span> name <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"输出中带花括号:{{ {} }}"</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-css" data-language="css"><code class="language-css"><span class="token selector">输出中带花括号:</span><span class="token punctuation">{</span> cml <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="输出非基础类型"><a href="#输出非基础类型" class="headerlink" title="输出非基础类型"></a>输出非基础类型</h4><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token builtin">println</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token string">"输出一个结构体,a={:?}"</span><span class="token punctuation">,</span> a<span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="输入"><a href="#输入" class="headerlink" title="输入"></a>输入</h3><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">let</span> <span class="token keyword">mut</span> guess <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token namespace">io<span class="token punctuation">::</span></span><span class="token function">stdin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">read_line</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">mut</span> guess<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">"无法读取行"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h1 id="所有权"><a href="#所有权" class="headerlink" title="所有权"></a>所有权</h1><p>所有权可以理解为命名空间+作用域+指针。</p><ul><li>基本数据类型(值类型)变量在栈空间中可以复制。先给x赋值9(let x = 9),将x赋值给y等同于直接给y赋值9(let y = x 等同于let y = 9)</li><li>引用类型变量在堆空间中的“值引用”可以复制,但是存储在栈空间的“值”不可复制。因此,引用类型变量仅可被消费一次</li><li>引用类型变量可以通过“克隆”的方式复制</li><li>特殊的数据类型—>类型的引用(即指针),使用 & 关键字表示<ul><li>指针存放在栈中,便于理解可以将指针看作“特殊的值类型”</li><li>被借用的不可变变量,不可再借用给其他人</li><li>指针类型的不可变变量,不可被修改</li><li>值类型(基本数据类型)变量也可以使用指针,但是一般不建议这样使用</li></ul></li><li>可变变量也可以有指针</li><li>rust中不允许出现空指针</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//01.基本数据类型(值类型)变量在栈空间中可以复制。先给x赋值9(let x = 9),将x赋值给y等同于直接给y赋值9(let y = x 等同于let y = 9)</span> <span class="token keyword">let</span> x <span class="token operator">=</span> <span class="token number">9</span><span class="token punctuation">;</span> <span class="token keyword">let</span> y <span class="token operator">=</span> x<span class="token punctuation">;</span> <span class="token comment">//x is :9 , y is :9</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"x is :{0} , y is :{1}"</span><span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> c1 <span class="token operator">=</span> <span class="token char">'M'</span><span class="token punctuation">;</span> <span class="token keyword">let</span> c2 <span class="token operator">=</span> c1<span class="token punctuation">;</span> <span class="token comment">//c1 is :M , c2 is :M</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"c1 is :{0} , c2 is :{1}"</span><span class="token punctuation">,</span> c1<span class="token punctuation">,</span> c2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//02.引用类型变量在堆空间中的“值引用”可以复制,但是存储在栈空间的“值”不可复制。因此,引用类型变量仅可被消费一次。</span> <span class="token keyword">let</span> s1 <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> s2 <span class="token operator">=</span> s1<span class="token punctuation">;</span> <span class="token comment">//编译错误:use of moved value: `s1`</span> <span class="token comment">//let s3 = s1;</span> <span class="token comment">//编译错误:borrow of moved value: `s1`</span> <span class="token comment">//println!("s1 is :{0} , s2 is :{1}", s1, s2);</span> <span class="token comment">//03.引用类型变量可以通过“克隆”的方式复制。</span> <span class="token keyword">let</span> h1 <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> h2 <span class="token operator">=</span> h1<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> h3 <span class="token operator">=</span> h1<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//h1 = hello, h2 = hello , h3 is :hello</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"h1 = {}, h2 = {} , h3 is :{}"</span><span class="token punctuation">,</span> h1<span class="token punctuation">,</span> h2<span class="token punctuation">,</span> h3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//04.特殊的数据类型--->类型的引用(即指针),使用 & 关键字表示</span> <span class="token keyword">let</span> k1 <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//k1为String类型:std::String::String ; k2 为带String类型的指针类型:&std::String:String</span> <span class="token keyword">let</span> k2 <span class="token operator">=</span> <span class="token operator">&</span>k1<span class="token punctuation">;</span> <span class="token keyword">let</span> k3 <span class="token operator">=</span> k2<span class="token punctuation">;</span> <span class="token comment">//指针存放在栈中,便于理解可以将指针看作“特殊的值类型”。所以虽然k2已经赋值给了k3,任然可以赋值给k4。</span> <span class="token keyword">let</span> k4 <span class="token operator">=</span> k2<span class="token punctuation">;</span> <span class="token comment">//k1无法赋值给k5,因为k1已经被借用了。这是出于安全考虑,试想如果多个人都可以借用k1,意味着多个人可以修改k1,那势必对正在使用它的人正在进行的工作产生影响</span> <span class="token comment">// let k5 = k1;</span> <span class="token comment">//编译错误:`k2` is a `&` reference, so the data it refers to cannot be borrowed as mutable</span> <span class="token comment">//既然k2是指针类型,那么就不允许被修改,因为k2的“值”本身是借来的,如果修改了,那么势必对正在使用它的人正在进行的工作产生影响</span> <span class="token comment">//k2.push_str("world");</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"k1 is {}, k2 is {}, k3 is :{} , k4 is : {}"</span><span class="token punctuation">,</span> k1<span class="token punctuation">,</span> k2<span class="token punctuation">,</span> k3<span class="token punctuation">,</span> k4<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//值类型(基本数据类型)变量也可以使用指针,但是一般不建议这样使用</span> <span class="token comment">//n1为i32类型;n2为&i32类型</span> <span class="token keyword">let</span> n1 <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span> <span class="token keyword">let</span> n2 <span class="token operator">=</span> <span class="token operator">&</span>n1<span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"n1 is :{} , n2 is :{}"</span><span class="token punctuation">,</span> n1<span class="token punctuation">,</span> n2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//05.可变变量的指针。</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> m1 <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"run"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> m2 <span class="token operator">=</span> <span class="token operator">&</span><span class="token keyword">mut</span> m1<span class="token punctuation">;</span> m2<span class="token punctuation">.</span><span class="token function">push_str</span><span class="token punctuation">(</span><span class="token string">",world"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"m2 is :{}"</span><span class="token punctuation">,</span> m2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//编译错误:cannot borrow `m1` as immutable because it is also borrowed as mutable</span> <span class="token comment">//借出去后,所有权已不在拥有,所以无法被消费</span> <span class="token comment">// println!("m1 is :{} , m2 is :{}", m1, m2);</span> <span class="token comment">//编译错误:cannot borrow `m2` as mutable, as it is not declared as mutable。cannot borrow as mutable</span> <span class="token comment">//不可将借来的东西再借给别人</span> <span class="token comment">// let m3 = &mut m2;</span> <span class="token comment">//06.rust中不允许出现空指针</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">Hello<span class="token punctuation">,</span> world<span class="token operator">!</span>x <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token number">9</span> <span class="token punctuation">,</span> y <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token number">9</span>c1 <span class="token keyword">is</span> <span class="token punctuation">:</span>M <span class="token punctuation">,</span> c2 <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token class-name">M</span>h1 <span class="token operator">=</span> hello<span class="token punctuation">,</span> h2 <span class="token operator">=</span> hello <span class="token punctuation">,</span> h3 <span class="token keyword">is</span> <span class="token punctuation">:</span>hellok1 <span class="token keyword">is</span> <span class="token class-name">hello</span><span class="token punctuation">,</span> k2 <span class="token keyword">is</span> <span class="token class-name">hello</span><span class="token punctuation">,</span> k3 <span class="token keyword">is</span> <span class="token punctuation">:</span>hello <span class="token punctuation">,</span> k4 <span class="token keyword">is</span> <span class="token punctuation">:</span> hellon1 <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token number">8</span> <span class="token punctuation">,</span> n2 <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token number">8</span>m2 <span class="token keyword">is</span> <span class="token punctuation">:</span>run<span class="token punctuation">,</span>world<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="切片"><a href="#切片" class="headerlink" title="切片"></a>切片</h1><p>切片是指向数据结构(字符串、集合)一部分内容的引用。</p><p>不愿意将rust中的切片理解为一种“类型”,实际上也不是;更不愿将rust中的切片理解为一种“集合”。暂且将切片理解成一种对象吧。例如 &s[0..5] 就是获取到了字符串 s 索引从0到5位置的元素,包含0不包含5。</p><p>rust中的切片部分主要是要理解索引和下标的概念。</p><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> s <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"hello,world."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//ss 的数据类型为:&str</span> <span class="token keyword">let</span> ss <span class="token operator">=</span> <span class="token operator">&</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">..</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"s is : {} , ss is : {}"</span><span class="token punctuation">,</span> s<span class="token punctuation">,</span> ss<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//start_part 的数据类型为:&[i32]</span> <span class="token keyword">let</span> start_part <span class="token operator">=</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">..</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> end_part <span class="token operator">=</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">..</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> full_part <span class="token operator">=</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token punctuation">..</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span> <span class="token string">"arr is : {:?} , start_part is : {:?} , end_part is : {:?} , full_part is : {:?}"</span><span class="token punctuation">,</span> arr<span class="token punctuation">,</span> start_part<span class="token punctuation">,</span> end_part<span class="token punctuation">,</span> full_part <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">Hello<span class="token punctuation">,</span> world<span class="token operator">!</span>s <span class="token keyword">is</span> <span class="token punctuation">:</span> hello<span class="token punctuation">,</span>world<span class="token punctuation">.</span> <span class="token punctuation">,</span> ss <span class="token keyword">is</span> <span class="token punctuation">:</span> helloarr <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> start_part <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> end_part <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> full_part <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h1 id="结构体"><a href="#结构体" class="headerlink" title="结构体"></a>结构体</h1><p>struct 类似 java 中的类,用来自定义一种数据结构,这种数据结构一般用来描述生活中的某一个对象。struct 中可以包含属性和方法。使用结构体分为两步:首先需要定义一个结构体,然后需要实例化一个结构体,再然后才可以使用。</p><p>一旦结构体实例化的时候是可变的,即使用 mut 修饰, 那么结构体中所有的属性都将是可变的。</p><p>结构体属性:</p><ul><li>声明方式,属性名:数据类型;</li><li>即使是最后一个属性,末尾也要加英文逗号;</li><li>属性可以是另外一个结构体,但不能是本身;</li><li>属性可以是一个元组</li><li>属性可以是一个枚举</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token comment">/** * 人 */</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Person</span> <span class="token punctuation">{</span> <span class="token comment">//结构体属性:声明方式,属性名:数据类型;即使是最后一个属性,末尾也要加英文逗号;属性可以是另外一个结构体,但不能是本身;属性可以是一个元组</span> active<span class="token punctuation">:</span> <span class="token keyword">bool</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">,</span> nation<span class="token punctuation">:</span> <span class="token class-name">Nation</span><span class="token punctuation">,</span> parent<span class="token punctuation">:</span> <span class="token class-name">Parent</span><span class="token punctuation">,</span> empty<span class="token punctuation">:</span> <span class="token class-name">Empty</span><span class="token punctuation">,</span> tuple<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token keyword">u32</span><span class="token punctuation">,</span> <span class="token keyword">u32</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token comment">/** * 国家结构体 */</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Nation</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> area<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> time_zone<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token comment">/** * 父母结构体 * 特殊的结构体,元组结构体。 */</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Parent</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">/** * 空结构体 */</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Empty</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//实例化一个结构体</span> <span class="token keyword">let</span> p1 <span class="token operator">=</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> active<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cnaylor@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token number">99</span><span class="token punctuation">,</span> nation<span class="token punctuation">:</span> <span class="token class-name">Nation</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"xm"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> area<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"north"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> time_zone<span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> parent<span class="token punctuation">:</span> <span class="token class-name">Parent</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"baba"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"mama"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> empty<span class="token punctuation">:</span> <span class="token class-name">Empty</span><span class="token punctuation">,</span> tuple<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//实例化一个可变结构体</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> p2 <span class="token operator">=</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> active<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cnaylor@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token number">99</span><span class="token punctuation">,</span> nation<span class="token punctuation">:</span> <span class="token class-name">Nation</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"xm"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> area<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"north"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> time_zone<span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> parent<span class="token punctuation">:</span> <span class="token class-name">Parent</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"baba"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"mama"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> empty<span class="token punctuation">:</span> <span class="token class-name">Empty</span><span class="token punctuation">,</span> tuple<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//给结构体实例重新赋值</span> p2<span class="token punctuation">.</span>email <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"c@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> email <span class="token operator">=</span> <span class="token operator">&</span>p2<span class="token punctuation">.</span>email<span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"p1 is : {:#?} , p2 is : {:#?} , email is :{}"</span><span class="token punctuation">,</span> p1<span class="token punctuation">,</span> p2<span class="token punctuation">,</span> email<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token attribute attr-name">#[derive(Debug)]</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">User</span> <span class="token punctuation">{</span> active<span class="token punctuation">:</span> <span class="token keyword">bool</span><span class="token punctuation">,</span> username<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">fn</span> <span class="token function-definition function">build_user</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> username<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> u <span class="token operator">=</span> <span class="token class-name">User</span> <span class="token punctuation">{</span> email<span class="token punctuation">:</span> email<span class="token punctuation">,</span> <span class="token comment">//简写。函数参数和结构体属性名相同,可简写</span> <span class="token comment">// email,</span> username<span class="token punctuation">,</span> active<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//从已创建的结构体实例创建实例</span> <span class="token comment">// let u2 = User { ..u };</span> <span class="token keyword">let</span> u3 <span class="token operator">=</span> <span class="token class-name">User</span> <span class="token punctuation">{</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"o@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">..</span>u <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">return</span> u3<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> u <span class="token operator">=</span> <span class="token function">build_user</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"a@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"tom"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"u is : {:?}"</span><span class="token punctuation">,</span> u<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml">Hello<span class="token punctuation">,</span> world<span class="token tag">!</span><span class="token key atrule">p1 is</span> <span class="token punctuation">:</span> Person <span class="token punctuation">{</span> <span class="token key atrule">active</span><span class="token punctuation">:</span> <span class="token boolean important">true</span><span class="token punctuation">,</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"cml"</span><span class="token punctuation">,</span> <span class="token key atrule">email</span><span class="token punctuation">:</span> <span class="token string">"cnaylor@163.com"</span><span class="token punctuation">,</span> <span class="token key atrule">sign_in_count</span><span class="token punctuation">:</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token key atrule">nation</span><span class="token punctuation">:</span> Nation <span class="token punctuation">{</span> <span class="token key atrule">time_zone</span><span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token key atrule">parent</span><span class="token punctuation">:</span> Parent( "baba"<span class="token punctuation">,</span> <span class="token string">"mama"</span><span class="token punctuation">,</span> )<span class="token punctuation">,</span> <span class="token key atrule">empty</span><span class="token punctuation">:</span> Empty<span class="token punctuation">,</span> <span class="token key atrule">tuple</span><span class="token punctuation">:</span> ( 8<span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> )<span class="token punctuation">,</span><span class="token punctuation">}</span> <span class="token punctuation">,</span> email is <span class="token punctuation">:</span>c@163.com<span class="token key atrule">u is</span> <span class="token punctuation">:</span> User <span class="token punctuation">{</span> <span class="token key atrule">active</span><span class="token punctuation">:</span> <span class="token boolean important">true</span><span class="token punctuation">,</span> <span class="token key atrule">username</span><span class="token punctuation">:</span> <span class="token string">"tom"</span><span class="token punctuation">,</span> <span class="token key atrule">email</span><span class="token punctuation">:</span> <span class="token string">"o@163.com"</span><span class="token punctuation">,</span> <span class="token key atrule">sign_in_count</span><span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="枚举"><a href="#枚举" class="headerlink" title="枚举"></a>枚举</h1><p>枚举表示某一个对象可能的值,实际使用中常用来表达:ip地址类型,订单状态,人员性别,实名认证方式等某一事物简短又不经常变化的“可选值”。</p><p>枚举成员:</p><ul><li>英文逗号分割</li><li>可以是字符串,数字类型或者结构体。甚至可以包含另一个枚举</li><li>要合理使用标准库中的枚举,避免重复定义</li><li>可以使用match比对枚举成员,类似java中的switch-case</li><li>可以用 if - let —> else 比对枚举成员</li></ul><h2 id="Match"><a href="#Match" class="headerlink" title="Match"></a>Match</h2><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>fs<span class="token punctuation">::</span></span><span class="token class-name">File</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> f <span class="token operator">=</span> <span class="token class-name">File</span><span class="token punctuation">::</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"hello.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">match</span> f <span class="token punctuation">{</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"File opened successfully."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token class-name">Err</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Failed to open the file."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="If-let"><a href="#If-let" class="headerlink" title="If-let"></a>If-let</h2><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">enum</span> <span class="token type-definition class-name">Book</span> <span class="token punctuation">{</span> <span class="token class-name">Papery</span><span class="token punctuation">(</span><span class="token keyword">u32</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Electronic</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> book <span class="token operator">=</span> <span class="token class-name">Book</span><span class="token punctuation">::</span><span class="token class-name">Electronic</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"url"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token keyword">let</span> <span class="token class-name">Book</span><span class="token punctuation">::</span><span class="token class-name">Papery</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span> <span class="token operator">=</span> book <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Papery {}"</span><span class="token punctuation">,</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Not papery book"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="Option"><a href="#Option" class="headerlink" title="Option"></a>Option</h2><p>Option 是一个标准库中的枚举,用来处理空值(null) 的情况。Option是一个泛型枚举,接受类型 T 。Option 要干的事情和java 中的 optional(java8新特性) 类似。</p><p>简言之:</p><ul><li>我们在设计资源提供者时候,如果不确定资源提供者是否会输出null,那么我们可以将返回值定义为 Option。若一切正常,资源消费者直接消费返回值T就行;若出了问题,资源消费者得到的返回值将为Option.None 。</li><li>同理,作为调用方,我们可以定义一个Option的变量来接收资源提供者的输出值,而后根据返回值是否为none处理业务逻辑。</li></ul><p>Option 源码:</p><pre class="line-numbers language-scss" data-language="scss"><code class="language-scss"><span class="token selector">enum Option<T> </span><span class="token punctuation">{</span> <span class="token function">Some</span><span class="token punctuation">(</span>T<span class="token punctuation">)</span><span class="token punctuation">,</span> None<span class="token punctuation">,</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>使用举例:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token comment">// 整数除法。</span><span class="token keyword">fn</span> <span class="token function-definition function">checked_division</span><span class="token punctuation">(</span>dividend<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">,</span> divisor<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">Option</span><span class="token operator"><</span><span class="token keyword">i32</span><span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> divisor <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token comment">// 失败表示成 `None` 取值</span> <span class="token class-name">None</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// 结果 Result 被包装到 `Some` 取值中</span> <span class="token class-name">Some</span><span class="token punctuation">(</span>dividend <span class="token operator">/</span> divisor<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">// 此函数处理可能失败的除法</span><span class="token keyword">fn</span> <span class="token function-definition function">try_division</span><span class="token punctuation">(</span>dividend<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">,</span> divisor<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// `Option` 值可以进行模式匹配,就和其他枚举类型一样</span> <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token function">checked_division</span><span class="token punctuation">(</span>dividend<span class="token punctuation">,</span> divisor<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token macro property">result!</span><span class="token operator">=</span><span class="token class-name">Option</span><span class="token punctuation">::</span><span class="token class-name">None</span> <span class="token punctuation">{</span> <span class="token comment">//获取返回值</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Nice, result is :{:?}"</span><span class="token punctuation">,</span> result<span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">match</span> <span class="token function">checked_division</span><span class="token punctuation">(</span>dividend<span class="token punctuation">,</span> divisor<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">None</span> <span class="token operator">=></span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"{} / {} failed!"</span><span class="token punctuation">,</span> dividend<span class="token punctuation">,</span> divisor<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Some</span><span class="token punctuation">(</span>quotient<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"{} / {} = {}"</span><span class="token punctuation">,</span> dividend<span class="token punctuation">,</span> divisor<span class="token punctuation">,</span> quotient<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">try_division</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">try_division</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">Nice<span class="token punctuation">,</span> result <span class="token keyword">is</span> <span class="token punctuation">:</span><span class="token number">2</span><span class="token number">4</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">=</span> <span class="token number">2</span><span class="token number">1</span> <span class="token operator">/</span> <span class="token number">0</span> failed<span class="token operator">!</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h1 id="集合"><a href="#集合" class="headerlink" title="集合"></a>集合</h1><p>Rust 标准库中包含一系列被称为 集合(collections)的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。</p><h2 id="vector容器"><a href="#vector容器" class="headerlink" title="vector容器"></a>vector容器</h2><p>vector 允许我们在一个单独的数据结构中储存多个值,所有值在内存中彼此相邻排列。vector 只能储存相同类型的值。</p><p>如果借助枚举,有时候 vector 也可以变相存储不同类型的值。</p><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//新建一个 vector</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> v<span class="token punctuation">:</span> <span class="token class-name">Vec</span><span class="token operator"><</span><span class="token keyword">i32</span><span class="token operator">></span> <span class="token operator">=</span> <span class="token class-name">Vec</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> v2 <span class="token operator">=</span> <span class="token macro property">vec!</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"v is : {:?} , v2 is : {:?}"</span><span class="token punctuation">,</span> v<span class="token punctuation">,</span> v2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//更新</span> v<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">888</span><span class="token punctuation">)</span><span class="token punctuation">;</span> v<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">111</span><span class="token punctuation">)</span><span class="token punctuation">;</span> v<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">222</span><span class="token punctuation">)</span><span class="token punctuation">;</span> v<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">333</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//删除</span> v<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//查询</span> <span class="token keyword">let</span> two <span class="token operator">=</span> v<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> two2 <span class="token operator">=</span> <span class="token operator">&</span>v<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//get方法返回的是Option</span> <span class="token keyword">let</span> three <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"two is : {} , three is : {:?}"</span><span class="token punctuation">,</span> two<span class="token punctuation">,</span> three<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//遍历</span> <span class="token keyword">let</span> arr <span class="token operator">=</span> <span class="token macro property">vec!</span><span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token operator">&</span>arr <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"arr item for --> {}"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//借助枚举,vector中可以存储不同的数据类型</span> <span class="token keyword">let</span> row <span class="token operator">=</span> <span class="token macro property">vec!</span><span class="token punctuation">[</span> <span class="token class-name">SpreadsheetCell</span><span class="token punctuation">::</span><span class="token class-name">Int</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SpreadsheetCell</span><span class="token punctuation">::</span><span class="token class-name">Text</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"blue"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SpreadsheetCell</span><span class="token punctuation">::</span><span class="token class-name">Float</span><span class="token punctuation">(</span><span class="token number">10.12</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> s <span class="token operator">=</span> <span class="token operator">&</span>row<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"row is : {:?} , s is : {:?} "</span><span class="token punctuation">,</span> row<span class="token punctuation">,</span> s<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">enum</span> <span class="token type-definition class-name">SpreadsheetCell</span> <span class="token punctuation">{</span> <span class="token class-name">Int</span><span class="token punctuation">(</span><span class="token keyword">i32</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Float</span><span class="token punctuation">(</span><span class="token keyword">f64</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Text</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Hello<span class="token punctuation">,</span> world!v <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> v2 <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span>two <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token number">222</span> <span class="token punctuation">,</span> three <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token function">Some</span><span class="token punctuation">(</span><span class="token number">333</span><span class="token punctuation">)</span>arr item <span class="token keyword">for</span> <span class="token comment">--> 100</span>arr item <span class="token keyword">for</span> <span class="token comment">--> 32</span>arr item <span class="token keyword">for</span> <span class="token comment">--> 57</span>row <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token function">Int</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Text</span><span class="token punctuation">(</span><span class="token string">"blue"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Float</span><span class="token punctuation">(</span><span class="token number">10.12</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> s <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token function">Text</span><span class="token punctuation">(</span><span class="token string">"blue"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="String"><a href="#String" class="headerlink" title="String"></a>String</h2><p>你没有看错,rust 中,字符串也是集合,是什么集合呢? 是“字符”的集合。注意:上面提到过字符是 rust 的基础标量类型,但是字符串不是标量类型,而是集合类型。</p><ul><li>字符串是UTF-8编码,中文不会乱码,一个英文字符占1字节,一个汉字占2字节。</li><li>字符串底层实际是一个结构体,数据存储在结构体中的 Vec (vector容器)里面 。</li><li>rust中不建议用下标访问字符串元素:rust中的字符串大部分时候和 java 中的不太一样,相比较而言更低级(对部分使用者来说),但是rust中的字符串更能真实的反应文字本来的样子。</li></ul><p>更新字符串的方式:</p><ul><li>push_str</li><li>push</li><li>加号</li><li>format!</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> s <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> data <span class="token operator">=</span> <span class="token string">"initial contents"</span><span class="token punctuation">;</span> <span class="token keyword">let</span> ss <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token function">to_string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> sss <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"你好!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"s is : {} , ss is : {} , sss is : {}"</span><span class="token punctuation">,</span> s<span class="token punctuation">,</span> ss<span class="token punctuation">,</span> sss<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//更新</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> word <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"Aa"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> word<span class="token punctuation">.</span><span class="token function">push_str</span><span class="token punctuation">(</span><span class="token string">"Bb"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> word<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token char">'C'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> word <span class="token operator">+=</span> <span class="token string">"cDd"</span><span class="token punctuation">;</span> word <span class="token operator">=</span> <span class="token macro property">format!</span><span class="token punctuation">(</span><span class="token string">"{}{}-{}"</span><span class="token punctuation">,</span> word<span class="token punctuation">,</span> <span class="token string">"Ee"</span><span class="token punctuation">,</span> <span class="token string">"Ff"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"final word is : {} "</span><span class="token punctuation">,</span> word<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//不要使用下标访问</span> <span class="token keyword">let</span> p <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> p1 <span class="token operator">=</span> <span class="token operator">&</span>p<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">..</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> k <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"你好我是陈明亮"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> k1 <span class="token operator">=</span> <span class="token operator">&</span>k<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">..</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//输出结果可能不是大多数人预期:p1 is : hel , k1 is : 你</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"p1 is : {} , k1 is : {}"</span><span class="token punctuation">,</span> p1<span class="token punctuation">,</span> k1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//遍历</span> word<span class="token operator">+=</span><span class="token string">"北京"</span><span class="token punctuation">;</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> word<span class="token punctuation">.</span><span class="token function">chars</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"word ---> item is :{}"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Hello<span class="token punctuation">,</span> world!s <span class="token keyword">is</span> <span class="token punctuation">:</span> <span class="token punctuation">,</span> ss <span class="token keyword">is</span> <span class="token punctuation">:</span> initial contents <span class="token punctuation">,</span> sss <span class="token keyword">is</span> <span class="token punctuation">:</span> 你好!final word <span class="token keyword">is</span> <span class="token punctuation">:</span> AaBbCcDdEe<span class="token operator">-</span>Ffp1 <span class="token keyword">is</span> <span class="token punctuation">:</span> hel <span class="token punctuation">,</span> k1 <span class="token keyword">is</span> <span class="token punctuation">:</span> 你word <span class="token comment">---> item is :A</span>word <span class="token comment">---> item is :a</span>word <span class="token comment">---> item is :B</span>word <span class="token comment">---> item is :b</span>word <span class="token comment">---> item is :C</span>word <span class="token comment">---> item is :c</span>word <span class="token comment">---> item is :D</span>word <span class="token comment">---> item is :d</span>word <span class="token comment">---> item is :E</span>word <span class="token comment">---> item is :e</span>word <span class="token comment">---> item is :-</span>word <span class="token comment">---> item is :F</span>word <span class="token comment">---> item is :f</span>word <span class="token comment">---> item is :b</span>word <span class="token comment">---> item is :C</span>word <span class="token comment">---> item is :c</span>word <span class="token comment">---> item is :D</span>word <span class="token comment">---> item is :d</span>word <span class="token comment">---> item is :E</span>word <span class="token comment">---> item is :e</span>word <span class="token comment">---> item is :-</span>word <span class="token comment">---> item is :F</span>word <span class="token comment">---> item is :f</span>word <span class="token comment">---> item is :北</span>word <span class="token comment">---> item is :京</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="代码组织"><a href="#代码组织" class="headerlink" title="代码组织"></a>代码组织</h1><p>讲道理,rust 中的代码组织相比 java 、CSharp 这些所谓高级语言,要复杂的多。大概包含两个部分:命名空间和访问权限。</p><h2 id="命名空间"><a href="#命名空间" class="headerlink" title="命名空间"></a>命名空间</h2><p>rust 中针对包管理主要有三个概念:包(package),箱(crate),模块(module)。三个概念形成一个树状结构,包中包含箱,箱中包含模块。</p><ul><li>包:cargo new 出来的工程就是一个包,包中包含箱。一个包会包含有一个 Cargo.toml 文件,阐述如何去构建里面的 crate</li><li>箱:箱是二进制程序文件或者库文件,箱中包含模块。在 <a href="https://crates.io/">https://crates.io</a> 这个网站中有很多别人开发好的箱,我们可以通过引入这些箱提升我们的开发效率。</li><li>模块:基于业务功能的实现和代码组织的考量,我们将功能相似或共同完成一个功能的代码分到一个组里面,这个组就是模块了,一个箱中往往包含多个模块。当然,模块中可以包含子模块。</li></ul><h2 id="访问其他mod和crate"><a href="#访问其他mod和crate" class="headerlink" title="访问其他mod和crate"></a>访问其他mod和crate</h2><h3 id="访问权限和关键字"><a href="#访问权限和关键字" class="headerlink" title="访问权限和关键字"></a>访问权限和关键字</h3><p>Rust 中默认所有项(函数、方法、结构体、枚举、模块和常量)都是私有的。父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用他们父模块中的项。</p><p>关键字:</p><ul><li>pub:添加 pub 访问修饰符的项将被公开,所有人可以访问</li><li>use:将其他命名空间引入当前作用域</li><li>as :使用 as 可将use进来的命名空间取一个别名,一般用来解决当两个需 use 对象的名称相同时候区分他们</li><li>mod :定义一个 module 或者导入一个 module。</li></ul><h3 id="访问其他文件中的对象"><a href="#访问其他文件中的对象" class="headerlink" title="访问其他文件中的对象"></a>访问其他文件中的对象</h3><ul><li>一个文件默认就是 module ,所以 other_rs_file.rs 就是一个名为 other_rs_file 的 module</li><li>main.rs 中如果要使用 other_rs_file 中的对象需要先导入这个 module: mod other_rs_file ,使用 mod::对象名 访问其中对象</li><li>如果 other_rs_file.rs 中定义了子 module , main.rs 仅需导入顶层 module (即 mod other_rs_file) ,使用 mod::子mod::对象名 访问其中对象</li><li>rust 默认将rs文件识别为一个 module 处理, 但是无法将文件夹识别为一个 module ,所以如果我们要访问entity文件夹中dept.rs文件中的对象,需要在entiry文件夹中新增一个mod.rs 并在其中定义 dept module ,访问其中对象的时候同样仅需导入顶层 mod ,然后通过 entity::dept::Dept 方式访问 dept 对象。</li></ul><p>工程目录文件结构:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">│ main<span class="token punctuation">.</span>rs│ other_rs_file<span class="token punctuation">.</span>rs└─<span class="token keyword">entity</span> dept<span class="token punctuation">.</span>rs <span class="token operator">mod</span><span class="token punctuation">.</span>rs<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>示例代码:<br>other_rs_file.rs:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">pub</span> <span class="token keyword">mod</span> <span class="token module-declaration namespace">other</span> <span class="token punctuation">{</span> <span class="token attribute attr-name">#[derive(Debug)]</span> <span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">User</span> <span class="token punctuation">{</span> <span class="token comment">//结构体属性默认是私有的,若外部需要访问需添加pub关键字</span> <span class="token keyword">pub</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">pub</span> age<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">fn</span> <span class="token function-definition function">init_user</span><span class="token punctuation">(</span>n<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> u <span class="token operator">=</span> <span class="token class-name">User</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">return</span> u<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">pub</span> <span class="token keyword">fn</span> <span class="token function-definition function">add_user</span><span class="token punctuation">(</span>n<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> a<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token keyword">bool</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//枚举不用给元素添加 pub ,只要枚举是公开的,里面元素就是公开的</span> <span class="token attribute attr-name">#[derive(Debug)]</span> <span class="token keyword">pub</span> <span class="token keyword">enum</span> <span class="token type-definition class-name">IpAddrKind</span> <span class="token punctuation">{</span> <span class="token constant">IPV4</span><span class="token punctuation">,</span> <span class="token constant">IPV6</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>dept.rs:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">Dept</span> <span class="token punctuation">{</span> <span class="token keyword">pub</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">pub</span> no<span class="token punctuation">:</span> <span class="token keyword">i32</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>mod.rs:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">pub</span> <span class="token keyword">mod</span> <span class="token module-declaration namespace">dept</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>main.rs:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">mod</span> <span class="token module-declaration namespace">other_rs_file</span><span class="token punctuation">;</span><span class="token keyword">mod</span> <span class="token module-declaration namespace">entity</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* * main.rs 同级 rs文件 * 引入其他rs文件,需先导入module ,通过mod名称(即文件名称)::对象名称 访问其内部对象 * 如果在其他文件内部定义了子 module , 导入方式不变,访问方式:mod名称::子mod名称::对象名称 * 导入时候只导入顶层mod */</span> <span class="token keyword">let</span> u <span class="token operator">=</span> <span class="token namespace">other_rs_file<span class="token punctuation">::</span>other<span class="token punctuation">::</span></span><span class="token class-name">User</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"实例化另外一个rs文件中定义的结构体,u is: {:?}"</span><span class="token punctuation">,</span> u<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* * main.rs 上级文件夹 rs 文件 * rust 默认将rs文件识别为一个 module 处理, 但是无法将文件夹识别为一个 module ,所以如果我们要访问entity文件夹中dept.rs文件中的对象,需要在entiry文件夹中新增一个mod.rs 并在其中定义 dept module。 */</span> <span class="token keyword">let</span> d<span class="token operator">=</span><span class="token namespace">entity<span class="token punctuation">::</span>dept<span class="token punctuation">::</span></span><span class="token class-name">Dept</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"技术部门"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> no<span class="token punctuation">:</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"实例化另外一个rs文件中定义的结构体,d is: {:?}"</span><span class="token punctuation">,</span> d<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>main输出:</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp">Hello<span class="token punctuation">,</span> world<span class="token operator">!</span>实例化另外一个rs文件中定义的结构体,u <span class="token keyword">is</span>: User <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">"cml"</span><span class="token punctuation">,</span> <span class="token named-parameter punctuation">age</span><span class="token punctuation">:</span> <span class="token number">9</span> <span class="token punctuation">}</span>实例化另外一个rs文件中定义的结构体,d <span class="token keyword">is</span>: Dept <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">"技术部门"</span><span class="token punctuation">,</span> <span class="token named-parameter punctuation">no</span><span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="使用第三方库"><a href="#使用第三方库" class="headerlink" title="使用第三方库"></a>使用第三方库</h2><ul><li>使用 use 导入其他的 crate</li><li>默认的 crate 源是 crate.io 这个网站</li><li>导入其他 crate 需要在 Cargo.toml 中定义相关 dependencies。标准库除外,标准库中的 crate 可以直接导入使用</li><li>使用花括号导入一个 crate 下多个 module :use std::{self,io,cmp::Ordering}</li><li>使用 * 号导入一个 crate 下所有 module:use std:😗;</li></ul><p>示例代码:<br>Cargo.toml:</p><pre class="line-numbers language-ini" data-language="ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">package</span><span class="token punctuation">]</span></span><span class="token key attr-name">name</span> <span class="token punctuation">=</span> <span class="token value attr-value">"<span class="token inner-value">Crate</span>"</span><span class="token key attr-name">version</span> <span class="token punctuation">=</span> <span class="token value attr-value">"<span class="token inner-value">0.1.0</span>"</span><span class="token key attr-name">edition</span> <span class="token punctuation">=</span> <span class="token value attr-value">"<span class="token inner-value">2021</span>"</span><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">dependencies</span><span class="token punctuation">]</span></span><span class="token key attr-name">rand</span> <span class="token punctuation">=</span> <span class="token value attr-value">"<span class="token inner-value">0.5.5</span>"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>main.rs:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token comment">/** 导入标准库*/</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>fmt<span class="token punctuation">::</span></span><span class="token class-name">Result</span> <span class="token keyword">as</span> <span class="token class-name">FmtResult</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>io<span class="token punctuation">::</span></span><span class="token class-name">Result</span> <span class="token keyword">as</span> <span class="token class-name">IoResult</span><span class="token punctuation">;</span><span class="token comment">// use std::cmp::Ordering</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span><span class="token operator">*</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span><span class="token punctuation">{</span><span class="token keyword">self</span><span class="token punctuation">,</span> <span class="token namespace">cmp<span class="token punctuation">::</span></span><span class="token class-name">Ordering</span><span class="token punctuation">,</span> io<span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">/** 导入外部第三方库*/</span><span class="token keyword">use</span> <span class="token namespace">rand<span class="token punctuation">::</span></span><span class="token punctuation">{</span>thread_rng<span class="token punctuation">,</span> <span class="token class-name">Rng</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> fmtr <span class="token operator">=</span> <span class="token class-name">FmtResult</span><span class="token punctuation">::</span><span class="token class-name">Ok</span><span class="token punctuation">;</span> <span class="token keyword">let</span> ior <span class="token operator">=</span> <span class="token class-name">IoResult</span><span class="token punctuation">::</span><span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token string">"成功"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"fmtr 无法打印 , ior is : {:?}"</span><span class="token punctuation">,</span> ior<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//生成随机数</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> rng <span class="token operator">=</span> <span class="token function">thread_rng</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> x<span class="token punctuation">:</span> <span class="token keyword">u32</span> <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">gen</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"x is :{}"</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h1><ul><li>rust中的异常不叫 exception , 而是叫做 panic (恐慌),意思是编译器执行到这里的代码害怕了,不敢继续执行了,就恐慌了,相当于程序就终止了。</li><li>rust官方对于错误处理有两个类别:可恢复错误(如打开文件失败算是一个错误,但是这种错误可以重试);不可恢复错误(如索引越界,这就是实打实的bug了,程序将崩溃)</li><li>对于不可恢复的错误,官方的做法是提供一个Result<T, E> 枚举类来处理,如 std::fs::File—>Result 。若程序运行成功返回 Ok(T) ,即响应结果,若程序运行出现错误返回 Err(E) ,即错误信息。</li></ul><p>工程结构:</p><pre class="line-numbers language-css" data-language="css"><code class="language-css">│ Cargo.lock│ Cargo.toml│ hello.txt├─src│ main.rs<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>fs<span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>fs<span class="token punctuation">::</span></span><span class="token class-name">File</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>io<span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>io<span class="token punctuation">::</span></span><span class="token class-name">Read</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> f <span class="token operator">=</span> <span class="token class-name">File</span><span class="token punctuation">::</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"hello.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">match</span> f <span class="token punctuation">{</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"File opened successfully."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token class-name">Err</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">//打开失败</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Failed to open the file."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">match</span> err<span class="token punctuation">.</span><span class="token function">kind</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//打开失败原因,不存在情况创建</span> <span class="token namespace">io<span class="token punctuation">::</span></span><span class="token class-name">ErrorKind</span><span class="token punctuation">::</span><span class="token class-name">NotFound</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"File Not Found. soon create . "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">File</span><span class="token punctuation">::</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"hello.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">fs<span class="token punctuation">::</span></span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"hello.txt"</span><span class="token punctuation">,</span> <span class="token string">"I am hello.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> _ <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">//其他原因直接抛 panic</span> <span class="token macro property">panic!</span><span class="token punctuation">(</span><span class="token string">"Failed to open the file."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//打印 txt内容</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> file <span class="token operator">=</span> <span class="token namespace">std<span class="token punctuation">::</span>fs<span class="token punctuation">::</span></span><span class="token class-name">File</span><span class="token punctuation">::</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"hello.txt"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> contents <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> file<span class="token punctuation">.</span><span class="token function">read_to_string</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">mut</span> contents<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">print!</span><span class="token punctuation">(</span><span class="token string">"txt 的内容是:{}"</span><span class="token punctuation">,</span> contents<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Hello<span class="token punctuation">,</span> world!Failed <span class="token keyword">to</span> <span class="token keyword">open</span> the <span class="token keyword">file</span><span class="token punctuation">.</span><span class="token keyword">File</span> <span class="token operator">Not</span> Found<span class="token punctuation">.</span> soon create <span class="token punctuation">.</span>txt 的内容是:I am hello<span class="token punctuation">.</span>txt<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h1 id="泛型"><a href="#泛型" class="headerlink" title="泛型"></a>泛型</h1><h2 id="泛型概念"><a href="#泛型概念" class="headerlink" title="泛型概念"></a>泛型概念</h2><p>泛型这种编程语言得设计绝非 rust 独有的,实际上在C# , Java 这些语言中早就引入了泛型的设计思想。泛型即类型的泛化,在编写代码的时候并不知道具体的数据类型或者数据结构是什么样子的,而是定义一个标识,在运行时此标识可动态替换为实际的数据类型。很显然这种设计能够让开发人员避免编写很多相似的重复的代码。</p><p>在 rust 中,可以在如下位置编写泛型代码:</p><ul><li>泛型函数</li><li>泛型结构体</li><li>泛型枚举</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!-->泛型"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* * 泛型函数 */</span> <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"数字数组中最大元素是 = {}"</span><span class="token punctuation">,</span> <span class="token function">max</span><span class="token punctuation">(</span><span class="token operator">&</span>a<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"A"</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"字符数组中最大元素是 = {}"</span><span class="token punctuation">,</span> <span class="token function">max</span><span class="token punctuation">(</span><span class="token operator">&</span>b<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* * 泛型结构体 */</span> <span class="token comment">// i32</span> <span class="token keyword">let</span> p1 <span class="token operator">=</span> <span class="token class-name">Point</span> <span class="token punctuation">{</span> x<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> y<span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//f64</span> <span class="token keyword">let</span> p2 <span class="token operator">=</span> <span class="token class-name">Point</span> <span class="token punctuation">{</span> x<span class="token punctuation">:</span> <span class="token number">1.0</span><span class="token punctuation">,</span> y<span class="token punctuation">:</span> <span class="token number">2.0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"p1 ={:?} , p2 = {:?}"</span><span class="token punctuation">,</span> p1<span class="token punctuation">,</span> p2<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">//求最大元素</span><span class="token keyword">fn</span> <span class="token function-definition function">max</span><span class="token operator"><</span><span class="token class-name">T</span><span class="token punctuation">:</span> <span class="token namespace">std<span class="token punctuation">::</span>cmp<span class="token punctuation">::</span></span><span class="token class-name">PartialOrd</span><span class="token operator">></span><span class="token punctuation">(</span>array<span class="token punctuation">:</span> <span class="token operator">&</span><span class="token punctuation">[</span><span class="token class-name">T</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token operator">&</span><span class="token class-name">T</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> max_index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span> i <span class="token operator"><</span> array<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> array<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span> array<span class="token punctuation">[</span>max_index<span class="token punctuation">]</span> <span class="token punctuation">{</span> max_index <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> i <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token operator">&</span>array<span class="token punctuation">[</span>max_index<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">//泛型结构体</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Point</span><span class="token operator"><</span><span class="token class-name">T</span><span class="token operator">></span> <span class="token punctuation">{</span> x<span class="token punctuation">:</span> <span class="token class-name">T</span><span class="token punctuation">,</span> y<span class="token punctuation">:</span> <span class="token class-name">T</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml">Hello<span class="token punctuation">,</span> world<span class="token tag">!--</span><span class="token punctuation">></span>泛型数字数组中最大元素是 = 6字符数组中最大元素是 = Cp1 =Point <span class="token punctuation">{</span> <span class="token key atrule">x</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token key atrule">y</span><span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> p2 = Point <span class="token punctuation">{</span> <span class="token key atrule">x</span><span class="token punctuation">:</span> <span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token key atrule">y</span><span class="token punctuation">:</span> <span class="token number">2.0</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h1 id="特性(接口)"><a href="#特性(接口)" class="headerlink" title="特性(接口)"></a>特性(接口)</h1><p>特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法</p><p>一个对象的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话,这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。</p><ul><li>一个结构体可以同时实现多个接口,但是一个结构体的继承者类(即 impl , rust 中实现类无自己的类名)仅可实现一个接口</li><li>trait 接口可以有默认实现方法,这个就和java8一样,接口可以有默认的已实现方法</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>time<span class="token punctuation">::</span></span><span class="token punctuation">{</span><span class="token class-name">SystemTime</span><span class="token punctuation">,</span> <span class="token constant">UNIX_EPOCH</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!--->特性(接口)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//实例化Person</span> <span class="token keyword">let</span> p <span class="token operator">=</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">let</span> d <span class="token operator">=</span> p<span class="token punctuation">.</span><span class="token function">describe</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"d = {}"</span><span class="token punctuation">,</span> d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> s <span class="token operator">=</span> p<span class="token punctuation">.</span><span class="token function">tostring</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"s={}"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> t <span class="token operator">=</span> p<span class="token punctuation">.</span><span class="token function">nowTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"t ={:?}"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">//定义一个描述接口</span><span class="token keyword">trait</span> <span class="token type-definition class-name">Descriptive</span> <span class="token punctuation">{</span> <span class="token keyword">fn</span> <span class="token function-definition function">describe</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span> <span class="token comment">//接口默认方法</span> <span class="token keyword">fn</span> <span class="token function-definition function">nowTime</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">SystemTime</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> start <span class="token operator">=</span> <span class="token class-name">SystemTime</span><span class="token punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> start<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">//定义一个 tostring 接口</span><span class="token keyword">trait</span> <span class="token type-definition class-name">ToString</span> <span class="token punctuation">{</span> <span class="token keyword">fn</span> <span class="token function-definition function">tostring</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">//定义一个结构体</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Person</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token keyword">u8</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token comment">//结构体的一个继承类实现了 Descriptive 接口</span><span class="token keyword">impl</span> <span class="token class-name">Descriptive</span> <span class="token keyword">for</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">fn</span> <span class="token function-definition function">describe</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">{</span> <span class="token macro property">format!</span><span class="token punctuation">(</span> <span class="token string">"I am Person , name is : {} , age is : {}"</span><span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>age <span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">impl</span> <span class="token class-name">ToString</span> <span class="token keyword">for</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">fn</span> <span class="token function-definition function">tostring</span><span class="token punctuation">(</span><span class="token operator">&</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">{</span> <span class="token macro property">format!</span><span class="token punctuation">(</span><span class="token string">"Person:{{name:{},age:{}}}"</span><span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>age<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-makefile" data-language="makefile"><code class="language-makefile">Hello, world!--->特性(接口)d <span class="token operator">=</span> I am Person , name is <span class="token punctuation">:</span> cml , age is <span class="token punctuation">:</span> 100s<span class="token operator">=</span>Person<span class="token punctuation">:</span><span class="token punctuation">{</span>name<span class="token punctuation">:</span>cml,age<span class="token punctuation">:</span>100<span class="token punctuation">}</span>t <span class="token operator">=</span>SystemTime <span class="token punctuation">{</span> intervals<span class="token punctuation">:</span> 132914629768805244 <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h1 id="文件和IO"><a href="#文件和IO" class="headerlink" title="文件和IO"></a>文件和IO</h1><p>rust 标准库中的 std::fs 可以用来操作文件</p><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>fs<span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>fs<span class="token punctuation">::</span></span><span class="token class-name">OpenOptions</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>io<span class="token punctuation">::</span>prelude<span class="token punctuation">::</span></span><span class="token operator">*</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!--->文件io"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//读取文件内容,一次性读取</span> <span class="token comment">//文件内容:This is a text file.</span> <span class="token keyword">let</span> text <span class="token operator">=</span> <span class="token namespace">fs<span class="token punctuation">::</span></span><span class="token function">read_to_string</span><span class="token punctuation">(</span><span class="token string">"text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"txt文件的内容是:{}"</span><span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//写入文件,追加</span> <span class="token comment">//追加完成文件内容:</span> <span class="token function">append</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"追加后,txt文件的内容是:{}"</span><span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//写入文件,会覆盖</span> <span class="token comment">//覆盖之后文件内容:</span> <span class="token namespace">fs<span class="token punctuation">::</span></span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"text.txt"</span><span class="token punctuation">,</span> <span class="token string">"FROM RUST PROGRAM"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"覆盖写入后,txt文件的内容是:{}"</span><span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">//追加</span><span class="token keyword">fn</span> <span class="token function-definition function">append</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token namespace">std<span class="token punctuation">::</span>io<span class="token punctuation">::</span></span><span class="token class-name">Result</span><span class="token operator"><</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> file <span class="token operator">=</span> <span class="token class-name">OpenOptions</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"text.txt"</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span> file<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">b" APPEND WORD"</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-vhdl" data-language="vhdl"><code class="language-vhdl">Hello<span class="token punctuation">,</span> world!<span class="token comment">--->文件io</span>txt文件的内容是:This <span class="token keyword">is</span> a text <span class="token keyword">file</span><span class="token punctuation">.</span>追加后,txt文件的内容是:This <span class="token keyword">is</span> a text <span class="token keyword">file</span><span class="token punctuation">.</span>覆盖写入后,txt文件的内容是:This <span class="token keyword">is</span> a text <span class="token keyword">file</span><span class="token punctuation">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h1 id="面向对象"><a href="#面向对象" class="headerlink" title="面向对象"></a>面向对象</h1><p>面向对象编程(OOP)思想是一个概念,是一种思想指导,围绕“对象”展开,从万物皆是对象的角度出发,一个 crate , 一个 module ,一个 struct ,一个枚举等等都是一个个独立的对象,能自主表达一个事物、某种特征。而运用封装、继承、多态等手段可以让对象与对象之间产生某种联系,进而表达更多的事物,解决更多的问题。</p><p>面向对象思想是构建大型应用软件系统的基石。</p><p>rust 语言中 可以通过 结构体,枚举,特性(trait)等来实现oop思想。</p><h1 id="并发编程"><a href="#并发编程" class="headerlink" title="并发编程"></a>并发编程</h1><p>rust 中的并发编程主要得益与 线程 、 消息传递和互斥锁。<br>Rust 语言是满足多线程特性的,所以 rust 可以满足 主–>子 多任务应用场景。</p><p>消息传递有点类似与消息队列,但消息队列一般跨进程或线程,而 rust 中的消息传递主要是主子线程中数据的传递。</p><h2 id="线程"><a href="#线程" class="headerlink" title="线程"></a>线程</h2><ul><li>rust 标准库 std::thread 中的 spawn 函数用来创建一个新的线程</li><li>通过在主线程中 join 子线程,让主线程阻塞,确保所有子线程执行完毕再继续执行子线程。这种情况在实际开发中非常常见,比如在获取用户个人中心信息接口中,我们将获取基本信息、订单信息、积分信息、用户消息信息分别放在4个子线程中并发执行,在主线程中等待所有子线程都响应了再将结果汇总返回给调用方。</li></ul><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>thread<span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>time<span class="token punctuation">::</span></span><span class="token class-name">Duration</span><span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[主线程] Hello, world!--->线程"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建子线程</span> <span class="token keyword">for</span> item <span class="token keyword">in</span> <span class="token number">0</span><span class="token punctuation">..</span><span class="token number">5</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[主线程] 即将创建一个子线程,当前循环变量:{}"</span><span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> child_thread <span class="token operator">=</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">spawn</span><span class="token punctuation">(</span><span class="token closure-params"><span class="token closure-punctuation punctuation">|</span><span class="token closure-punctuation punctuation">|</span></span> <span class="token punctuation">{</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token number">0</span><span class="token punctuation">..</span><span class="token number">2</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[子线程] hi number {} from the spawned thread!"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">::</span><span class="token function">from_millis</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token number">0</span><span class="token punctuation">..</span><span class="token number">3</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[主线程] hi number {} from the main thread!"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">::</span><span class="token function">from_millis</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//线程join</span> <span class="token keyword">let</span> child1 <span class="token operator">=</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">spawn</span><span class="token punctuation">(</span><span class="token closure-params"><span class="token closure-punctuation punctuation">|</span><span class="token closure-punctuation punctuation">|</span></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[child-1]hi I am spawned thread!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">::</span><span class="token function">from_millis</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> child2 <span class="token operator">=</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">spawn</span><span class="token punctuation">(</span><span class="token closure-params"><span class="token closure-punctuation punctuation">|</span><span class="token closure-punctuation punctuation">|</span></span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[child-2]hi I am spawned thread!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">::</span><span class="token function">from_millis</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> child1<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> child2<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[main]hi I am main thread!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-less" data-language="less"><code class="language-less">[主线程] Hello<span class="token punctuation">,</span> world!<span class="token operator">-</span><span class="token operator">-</span><span class="token operator">-</span>>线程[主线程] 即将创建一个子线程,当前循环变量<span class="token punctuation">:</span>0[主线程] 即将创建一个子线程,当前循环变量<span class="token punctuation">:</span>1[子线程] hi number 0 from the spawned thread![主线程] 即将创建一个子线程,当前循环变量<span class="token punctuation">:</span>2[子线程] hi number 0 from the spawned thread![主线程] 即将创建一个子线程,当前循环变量<span class="token punctuation">:</span>3[子线程] hi number 0 from the spawned thread![主线程] 即将创建一个子线程,当前循环变量<span class="token punctuation">:</span>4[子线程] hi number 0 from the spawned thread![主线程] hi number 0 from the main thread![子线程] hi number 0 from the spawned thread![子线程] hi number 1 from the spawned thread![子线程] hi number 1 from the spawned thread![子线程] hi number 1 from the spawned thread![子线程] hi number 1 from the spawned thread![主线程] hi number 1 from the main thread![子线程] hi number 1 from the spawned thread![主线程] hi number 2 from the main thread![child<span class="token operator">-</span>1]hi I am spawned thread![child<span class="token operator">-</span>2]hi I am spawned thread![main]hi I am main thread!<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="消息传递"><a href="#消息传递" class="headerlink" title="消息传递"></a>消息传递</h2><p>以下示例演示了子线程获得了主线程的发送者 tx,并调用了它的 send 方法发送数据,然后主线程就通过对应的接收者 rx 接收到了发送的数据。</p><p>无法在子线程中发送而在另外一个子线程中接收</p><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>sync<span class="token punctuation">::</span></span>mpsc<span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>thread<span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!--->消息传递"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> p1 <span class="token operator">=</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> active<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cml"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"cnaylor@163.com"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token number">99</span><span class="token punctuation">,</span> tuple<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">let</span> <span class="token punctuation">(</span>tx<span class="token punctuation">,</span> rx<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token namespace">mpsc<span class="token punctuation">::</span></span><span class="token function">channel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">spawn</span><span class="token punctuation">(</span><span class="token keyword">move</span> <span class="token closure-params"><span class="token closure-punctuation punctuation">|</span><span class="token closure-punctuation punctuation">|</span></span> <span class="token punctuation">{</span> tx<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>p1<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> received <span class="token operator">=</span> rx<span class="token punctuation">.</span><span class="token function">recv</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Got: {:?}"</span><span class="token punctuation">,</span> received<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token attribute attr-name">#[derive(Debug)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Person</span> <span class="token punctuation">{</span> active<span class="token punctuation">:</span> <span class="token keyword">bool</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span> sign_in_count<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">,</span> tuple<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token keyword">u32</span><span class="token punctuation">,</span> <span class="token keyword">u32</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml">Hello<span class="token punctuation">,</span> world<span class="token tag">!---</span><span class="token punctuation">></span>消息传递<span class="token key atrule">Got</span><span class="token punctuation">:</span> Person <span class="token punctuation">{</span> <span class="token key atrule">active</span><span class="token punctuation">:</span> <span class="token boolean important">true</span><span class="token punctuation">,</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"cml"</span><span class="token punctuation">,</span> <span class="token key atrule">email</span><span class="token punctuation">:</span> <span class="token string">"cnaylor@163.com"</span><span class="token punctuation">,</span> <span class="token key atrule">sign_in_count</span><span class="token punctuation">:</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token key atrule">tuple</span><span class="token punctuation">:</span> (8<span class="token punctuation">,</span> 8) <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h2 id="互斥锁"><a href="#互斥锁" class="headerlink" title="互斥锁"></a>互斥锁</h2><p>互斥锁(mutex)是 mutual exclusion 的缩写,也就是说,任意时刻,其只允许一个线程访问某些数据。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 锁(lock)来表明其希望访问数据。锁是一个作为互斥器一部分的数据结构,它记录谁有数据的排他访问权。因此,我们描述互斥器为通过锁系统 保护(guarding)其数据。</p><p>以下示例演示了在主线程中创建一个值,并在多个子线程中修改此值,最终等所有子线程处理完毕,主线程打印最终值。为了让变量能够跨线程之间共享,引入了std::sync::Arc 这个结构体。</p><p>示例代码:</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>sync<span class="token punctuation">::</span></span><span class="token punctuation">{</span><span class="token class-name">Arc</span><span class="token punctuation">,</span> <span class="token class-name">Mutex</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span></span>thread<span class="token punctuation">;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Hello, world!--->互斥锁"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Arc 原子引用计数器,确保在多个线程中共享数据;counter初始值为0 </span> <span class="token keyword">let</span> counter <span class="token operator">=</span> <span class="token class-name">Arc</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token class-name">Mutex</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"counter 初始值为:0"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//定义一个子线程集合</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> handles <span class="token operator">=</span> <span class="token macro property">vec!</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token number">0</span><span class="token punctuation">..</span><span class="token number">10</span> <span class="token punctuation">{</span> <span class="token comment">//将counter值从主线程中克隆,并赋值给私有变量 counter</span> <span class="token keyword">let</span> counter <span class="token operator">=</span> <span class="token class-name">Arc</span><span class="token punctuation">::</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token operator">&</span>counter<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> handle <span class="token operator">=</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">spawn</span><span class="token punctuation">(</span><span class="token keyword">move</span> <span class="token closure-params"><span class="token closure-punctuation punctuation">|</span><span class="token closure-punctuation punctuation">|</span></span> <span class="token punctuation">{</span> <span class="token comment">//获取互斥锁,并将counter值加一</span> <span class="token keyword">let</span> <span class="token keyword">mut</span> num <span class="token operator">=</span> counter<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">*</span>num <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">let</span> thread_id <span class="token operator">=</span> <span class="token namespace">thread<span class="token punctuation">::</span></span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">id</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"[子线程:{:?}]中将 counter 的值修改为:{}"</span><span class="token punctuation">,</span> thread_id<span class="token punctuation">,</span> num<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将创建的子线程存储到子线程集合中</span> handles<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>handle<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//将所有的子线程join到主线程,确保主线程等待所有子线程执行成功</span> <span class="token keyword">for</span> handle <span class="token keyword">in</span> handles <span class="token punctuation">{</span> handle<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token operator">*</span>counter<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"Result: {}"</span><span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上代码输出:</p><pre class="line-numbers language-css" data-language="css"><code class="language-css">Hello<span class="token punctuation">,</span> world!--->互斥锁counter 初始值为:0[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>2<span class="token punctuation">)</span>]中将 counter 的值修改为:1[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>4<span class="token punctuation">)</span>]中将 counter 的值修改为:2[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>3<span class="token punctuation">)</span>]中将 counter 的值修改为:3[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>5<span class="token punctuation">)</span>]中将 counter 的值修改为:4[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>8<span class="token punctuation">)</span>]中将 counter 的值修改为:5[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>6<span class="token punctuation">)</span>]中将 counter 的值修改为:6[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>7<span class="token punctuation">)</span>]中将 counter 的值修改为:7[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>9<span class="token punctuation">)</span>]中将 counter 的值修改为:8[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>10<span class="token punctuation">)</span>]中将 counter 的值修改为:9[子线程:<span class="token function">ThreadId</span><span class="token punctuation">(</span>11<span class="token punctuation">)</span>]中将 counter 的值修改为:10<span class="token property">Result</span><span class="token punctuation">:</span> 10<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><p>本文示例代码维护在gitee上面:<a href="https://gitee.com/naylor_personal/rust-hello-world">https://gitee.com/naylor_personal/rust-hello-world</a></p><p><strong>打开代码仓库中的 Sport 文件夹,有惊喜!!!</strong></p><h1 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h1><ul><li>勘误:本文篇幅较长、涉及内容较多,若阅读过程种发现错误,欢迎批评指正</li><li>目的:本文绝非传统意义上面的技术博文,仅作为学习rust的笔记,或者说是学习rust的一个教程。文中涵盖rust大部分基础知识,在实际开发过程中可以作为手册翻阅</li><li>心得:本文主要使用下班和周末时间断断续续编写,历时超过一个月。纵观整个过程,开头和结尾是喜悦的,中间的过程是相当的枯燥。开头为即将掌握一门新语言的 hello,world 编写方式而感到兴奋。结束后回顾了整个过程,发现除了学会了rust 的hello,world 之外,其实也同步回顾了一些已经使用过的其他语言的基础知识,尤其是java。中间过程是对未知事物的探索和对自我理解的求证,简单来说就是先得想办法索取rust中有哪些内容,然后形成自己的理解,最后在整理文章和编写示例代码的时候不断推导和验证自己的理解是否正确。</li></ul><h1 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h1><ul><li>下载:<a href="https://www.rust-lang.org/zh-CN/tools/install">https://www.rust-lang.org/zh-CN/tools/install</a></li><li>B站教程:<a href="https://www.bilibili.com/video/BV1hp4y1k7SV?spm_id_from=333.999.0.0">https://www.bilibili.com/video/BV1hp4y1k7SV?spm_id_from=333.999.0.0</a></li><li>runoob教程:<a href="https://www.runoob.com/rust/rust-tutorial.html">https://www.runoob.com/rust/rust-tutorial.html</a></li><li>Rust程序设计中文版:<a href="https://rust.bootcss.com/title-page.html">https://rust.bootcss.com/title-page.html</a></li><li><a href="https://kaisery.github.io/trpl-zh-cn/">https://kaisery.github.io/trpl-zh-cn/</a></li><li>create:<a href="https://crates.io/">https://crates.io/</a></li></ul>]]></content>
<categories>
<category> 编程语言 </category>
</categories>
<tags>
<tag> rust </tag>
</tags>
</entry>
<entry>
<title>一篇文章讲透贝壳创新战略“ACN”模式</title>
<link href="/2022/03/28/yi-pian-wen-zhang-jiang-tou-bei-ke-chuang-xin-zhan-lue-acn-mo-shi/"/>
<url>/2022/03/28/yi-pian-wen-zhang-jiang-tou-bei-ke-chuang-xin-zhan-lue-acn-mo-shi/</url>
<content type="html"><![CDATA[<p><img src="https://s2.loli.net/2022/03/28/OYPcDBFSpk2X9u3.jpg" alt="贝壳创新战略"></p><h4 id="贝壳起于链家,但不同于链家网的垂直自营模式,其作用是缔造平台,以共享真实房源信息与链家管理模式为号召,吸引经纪人与经纪公司入驻。在2021年《财富》中国500强排行榜中贝壳排名第164位,即使是受疫情影响下,2021年营业收入也达到了808亿元。但是贝壳是如何解决房源信息的真实性和房产经纪的佣金分配问题呢?本篇文章将会从房源交易市场的根源性博弈入手,探究贝壳的ACN模式是如何探索房屋管理交易从而实现业务的可持续性创新。"><a href="#贝壳起于链家,但不同于链家网的垂直自营模式,其作用是缔造平台,以共享真实房源信息与链家管理模式为号召,吸引经纪人与经纪公司入驻。在2021年《财富》中国500强排行榜中贝壳排名第164位,即使是受疫情影响下,2021年营业收入也达到了808亿元。但是贝壳是如何解决房源信息的真实性和房产经纪的佣金分配问题呢?本篇文章将会从房源交易市场的根源性博弈入手,探究贝壳的ACN模式是如何探索房屋管理交易从而实现业务的可持续性创新。" class="headerlink" title="贝壳起于链家,但不同于链家网的垂直自营模式,其作用是缔造平台,以共享真实房源信息与链家管理模式为号召,吸引经纪人与经纪公司入驻。在2021年《财富》中国500强排行榜中贝壳排名第164位,即使是受疫情影响下,2021年营业收入也达到了808亿元。但是贝壳是如何解决房源信息的真实性和房产经纪的佣金分配问题呢?本篇文章将会从房源交易市场的根源性博弈入手,探究贝壳的ACN模式是如何探索房屋管理交易从而实现业务的可持续性创新。"></a>贝壳起于链家,但不同于链家网的垂直自营模式,其作用是缔造平台,以共享真实房源信息与链家管理模式为号召,吸引经纪人与经纪公司入驻。在2021年《财富》中国500强排行榜中贝壳排名第164位,即使是受疫情影响下,2021年营业收入也达到了808亿元。但是贝壳是如何解决房源信息的真实性和房产经纪的佣金分配问题呢?本篇文章将会从房源交易市场的根源性博弈入手,探究贝壳的ACN模式是如何探索房屋管理交易从而实现业务的可持续性创新。</h4><p>截止到2021年,<a href="https://www.ke.com/city/">贝壳</a>联网门店数超过<strong>5.1</strong>万家,同比增长<strong>8.7%<strong>,活跃门店数量超过</strong>4.5</strong>万家,同比增长<strong>4.4%<strong>;联网经纪人</strong>45.5</strong>万人,活跃经纪人人数超过<strong>40.6</strong>万人,占比接近 **90%**。</p><p>他们用一套叫ACN(Agent Cooperate Network,经纪人合作网络)的逻辑,打破经纪人、店东、品牌之间的边界,把经纪人之间头破血流的竞争变为合作,提升全行业效率。</p><p>逻辑是对的。用同向为竞,取代相向为争,做大盘子。通过减少恶性竞争,提高行业效率。实际也发现在不少门店的收入增长1天倍以上的同时,客户房子的成交天数也大幅缩短,从143减到了109天。</p><h2 id="01-房源交易市场存在的博弈问题"><a href="#01-房源交易市场存在的博弈问题" class="headerlink" title="01 房源交易市场存在的博弈问题"></a>01 房源交易市场存在的博弈问题</h2><p>原来的房产经纪在业内大量充斥着信息不对称赚钱,用不存在的假房源吸引买家,再推销其它房子,故意隐瞒房子的各种缺点,只为成交,不让上下游见面,吃两头差价。<strong>但信息不对称,并不是这个行业的“真问题”。这个行业的真问题其实是:C端单次博弈,B端零和博弈。</strong></p><p><img src="https://s2.loli.net/2022/03/28/NTAzwQPlcsK42pa.jpg" alt="今日创见|如何打造创新团队"></p><h4 id="(1)C端单次博弈"><a href="#(1)C端单次博弈" class="headerlink" title="(1)C端单次博弈"></a><strong>(1)C端单次博弈</strong></h4><p>什么叫C端单次博弈?你去旅游,走进一家海鲜餐厅,看到一条没有见过的鱼,于是问老板:老板,这是什么鱼啊?老板二话不说,立马从鱼缸里把鱼捞出来,“砰”的一声在地上摔死,然后告诉你这叫什么鱼。500元一斤,这条鱼10几斤,5000元。你傻了,说我就是问一问,你摔死它干嘛。然后想走。20多个人围了过来。你意识到,你被宰了。<strong>为什么我们常常在旅游景点,遇到这些的“宰客”现象呢?</strong> <strong>因为“单次博弈”。</strong></p><p>你站在海鲜餐厅老板的角度想想看。大部分进餐厅的客人都是游客,这辈子估计只来一次。你对他好也不会再来吃,你对他坏也不会再遇到。这时,你的最佳策略是什么?一定是宰死他为止啊!这就是单次博弈。<strong>单次博弈,会让人倾向于把短期利益最大化,而不计长期后果。</strong> <strong>房产经纪行业,也存在大量的单次博弈。</strong></p><p>整个房产经纪行业,已接近200万人从事该行业,受疫情影响,平均房产经纪人从业一年内离职率高达29.4%,较2020年上涨<strong>7.1</strong>个百分点。据统计,中国房地产经纪行业从业人员的月流失率**10%**以上。</p><p>和C端消费者的“单次博弈”,在房产交易行业的存在可能性很大,可以看做几乎是必然的。<strong>单次博弈的风险,让个别经纪人通过转行的方式化解对其个人的影响,但对整个房产经纪行业而言,却是剩下的从业人员“背锅”</strong></p><h4 id="(2)B端零和博弈"><a href="#(2)B端零和博弈" class="headerlink" title="(2)B端零和博弈"></a><strong>(2)B端零和博弈</strong></h4><p>什么叫B端零和博弈?这里有一块蛋糕。我吃你就没有了,你吃我就没有了。然后我们就打起来了。打到最后只有两种结果:<strong>要么我吃你饿着,要么你吃我饿着。</strong> <strong>这属于零和博弈。</strong></p><p><strong>在房产经纪行业,中介费则催生了典型的零和博弈。</strong></p><p>张三努力寻找客户,带客户看房子,介绍房子的优缺点,想要促成交易。就要临门一脚了,李四给客户打电话:这套房子找我买,中介费便宜1000元。客户和李四成交了。张三辛勤劳动,什么都没得到(0%)。李四暗地撬单,偷走所有果实(100%)。</p><p><strong>在零和博弈中,赢家拿走全部,输家两手空空。</strong></p><p>因此在房产经纪行业恶性竞争不断升级,各自互相撬单,甚至大打出手。那怎么办呢?张三要求,在我这里卖房的业主,必须<strong>签署独家委托协议</strong>。这似乎是阻止了互相撬单,恶性竞争。但是,因为<strong>独家委托协议的限制</strong>,帮着一起卖房子的人少了,成交就变慢了,甚至没卖出去,业主的利益受到连带损害。因为想要避免<strong>零和博弈,却让客户利益受损,行业效率下降。</strong></p><p>C端服务单次博弈,B端竞争零和博弈,<strong>两大博弈问题是制约房产经纪行业发展的真问题。看到真问题,才能找到根本解。</strong></p><p>什么是“根本解”?贝壳的CEO彭永东提出:<strong>改变博弈结构。把C端单次博弈,改变为重复博弈;把B端零和博弈,改变为多赢博弈。</strong></p><h2 id="02-房源交易市场如何解决博弈问题?"><a href="#02-房源交易市场如何解决博弈问题?" class="headerlink" title="02 房源交易市场如何解决博弈问题?"></a>02 房源交易市场如何解决博弈问题?</h2><p>房产经纪行业的真问题是:C端单次博弈,B端零和博弈。C端单次博弈的根源,是<strong>经纪人从业时间短</strong>;B端零和博弈的根源,是<strong>经纪人赢家通吃</strong>。</p><p>那么,解决这个问题的根本思路,也就出来了。那就是用一套行业合作机制:一是<strong>延长经纪人的从业时间,老客户的口碑效应显现,让经纪人可以从长期诚信中受益,减少C端单次博弈</strong>;二是<strong>经纪人合作卖房,按照贡献分配中介佣金,让所有的付出都可以得到相应的回报,减小B端零和博弈</strong>。</p><p>这套行业合作机制,就是贝壳提出的“ACN”。ACN是一套行业合作机制。这个合作机制,把经纪人的工作,分为了<strong>10</strong>个角色(房源方<strong>5</strong>个,客源方<strong>5</strong>个):</p><p>● 房源录入人是第一个把房源录入ACN的经纪人。这个人,可能是房源附近的一家门店的经纪人,也可能是以前把房子卖给业主,所以业主信任的经纪人。这个角色具体是谁,有一定的随机性。<strong>但这是整个房产交易的开始。</strong></p><p>● 房源维护人是一个在房源附近、熟悉小区环境,可以陪同客户看房的经纪人。房源录入人,可能并不正好在房源附近。他可能只是认识业主,所以无法帮助房子成交,甚至无法陪同客户看房。</p><p>● 房源实勘人由专业的人员担任,因为对拍照、录制VR的专业性要求高,影响房屋成交。</p><p>● 委托备件人是负责看起来琐碎,但不能出错的事务性工作。比如获得业主签字的委托书、身份信息、房产证信息,然后上传到政府指定的系统。一个门店里的所有备件工作,可由一个人完成。</p><p>● 房源钥匙人,作为一个角色,它是独立的。他挑起了业主对经纪公司的信任。这个角色很关键。把钥匙放在谁手上,是要得到业主同意的。这个人很可能也是房源维护人,也陪同客户看房。</p><p>这是房源方的5个角色。实际操作中,一个经纪人可能会同时承担几个角色。在近一半的情况中,房源录入人和房源实勘人,就是一个人。甚至有时候,这5个角色都是一个人。但也有不少情况,房源录入人和房源维护人,不是同一个人。做贡献的是角色,得利益的是人。所以,一定要把角色分清楚。</p><p>这样,<strong>承担角色越多,得到利益越多。这样才公平</strong>。那这5个角色加在一起,能分到中介费的多少呢?每个城市都不一样。贝壳基本是一市一策。但大体上,在四成多一些。</p><p>另外的五成多,分给5个客源方角色。</p><p>● 客源推荐人。这是第一个接触、引入这个客户的人。不管客户是主动找上门,还是历史老客户推荐、朋友推荐,是客户推荐人把客户引入ACN合作网络里的,到平台上来成交的。</p><p>● 客源成交人。这是帮助客户找到满意的房子,并完成带看、成交、最终完成签约的人。大多时候,这个人也是客源推荐人。但也有不重合的。比如,客源推荐人经验少,店东会安排一个更高级别的经纪人,担任客源成交人。</p><p>● 客源合作人是辅助经纪人的角色,比如带看和交易的时候准备文件。这个角色,通常是比较年轻的经纪人。他分成比例也不高。但是,他可以跟着学习成长。</p><p>● 客源首看人是第一个带看房屋的人,比如经纪人A带客户看了一套房子。没看中。他又和经纪人B去看了几套其它房子。最后兜兜转转回来成交了最开始的那套,但成交人不是A。不过A,就是客源首看人。为什么要专门设置客源首看人呢?因为<strong>ACN是保护首看的。这样,才能有效预防抢单、撬单。</strong></p><p>● 交易/金融顾问是在ACN统一的交易中心内,帮助业主、客户完成签约、贷款等交易手续的专员,交易/金融专员的角色可以<strong>帮助减少客源成交人的事务性工作,也降低风险。</strong></p><p>这5个角色,分配五成多的佣金。那谁应该拿得更多呢?客源成交人。大约能拿到这五成多中的60%,也就是佣金总额的30%出头。(分配比率是长时间经过实践检验得出的,但是并非固定值)ACN在每个城市都有协会,根据本地的情况做微调,以达到最公平的均衡。</p><p>ACN带来了“重复博弈 + 多赢博弈”的胜利。贝壳先把链家所有真房源都放在ACN网络里,所有后面加入的房源即使是曾经竞争对手的经纪公司,都可以跟卖链家这些房源。</p><p><strong>真房源,一直是链家的核心竞争力。</strong>这相当于我先把自家的肉全都端上桌,你可以一起吃。你们要不要也端两个菜上桌,让我们这顿宴席更丰盛,自己看吧。链家先干为敬,行业他人将信将疑。这样的情绪,一直延续了5个月。直到2018年10月。市场出现了转机。逐渐有人,端菜上桌了。</p><p><strong>愿意端菜上桌,与大家分享,一定是因为他从分享中获益了。这是ACN逻辑能够成立,并且形成增强回路的关键标志。</strong></p><p>2021年贝壳披露的数据显示,在链家的“基本盘”存量房业务,非链家门店GTV已达到<strong>9281亿元</strong>,快要追赶上链家的<strong>1.01万亿元</strong>;在新房业务上,非链家门店GTV更是达<strong>1.11万亿元</strong>,远超链家的<strong>2767亿</strong>元。贝壳平台上参与者间的合作不断增强,二手跨店合作率稳定提升至**75%<strong>,年末非链家门店贡献在售二手房房源量超过</strong>81%**。</p><p>分工带来效率,贝壳CEO彭永东说。以前要不然100%,要不然0%。在ACN模式下房产经纪面前有三个选择矩阵:1)低概率的100%;2)高概率的0%;3)确定的X%。越来越多房产经纪公司,选择确定的X%。这就不断促成行业协作,把盘子做大。交易盘子大了,B端零和博弈,就会切换为多赢博弈。</p><p>ACN网络10个角色的设定,也很好地<strong>解决了经纪人从业时间短</strong>的问题,从而<strong>解决了C端单次博弈</strong>的问题。如果你是一个新人,没有经验,签不了单,怎么办?那可以从“委托备件人”或者“客源合作人”,这样的事务性工作开始做起啊。分成虽然不高,但足以养活自己,同时不断向前辈学习,持续成长。在过去,新人加入行业的第一天,就要和业内最有经验的经纪人同台竞技。</p><p>这种一上来就打老怪的游戏,对新人非常不友好。要不然大获全胜,要不然尸骨无存。所以,从业时间当然短。而ACN的10个角色,就像一张“职业生涯地图”,让新人可以在不同难度、不同重要度的职位、职级上不断爬升,给了新人成长的时间。<strong>从业时间增加,从C端单次博弈模式,就会切换为重复博弈。从C端单次博弈,切换到重复博弈;从B端零和博弈,切换到多赢博弈。</strong></p><h2 id="03-ACN解决房源交易市场中博弈问题的结果"><a href="#03-ACN解决房源交易市场中博弈问题的结果" class="headerlink" title="03 ACN解决房源交易市场中博弈问题的结果"></a>03 ACN解决房源交易市场中博弈问题的结果</h2><p>任何一个商业模式,都包括三个部分:客户价值,资源能力,和盈利方式。贝壳的客户价值是:解决行业C端单次博弈,B端零和博弈的问题;资源能力是:ACN经纪人合作网络。贝壳挣的钱,来自ACN这个模式带来的三个全局性增量(Δ)。</p><p>一切的商业模式,都必须有全局性增量。如果没有,那所谓的商业模式,就是把你口袋的钱换到我口袋。<strong>ACN必须创造出全局性增量,才可以让贝壳增效、商家挣钱,才可以叫<a href="https://runwise.co/category/product-innovation/">商业模式创新</a>。</strong></p><p><strong>Δ1:从链家到贝壳的增量。</strong>链家,从2018年的GTV大约1万亿到2021年贝壳全年成交额(GTV)为3.85万亿元,GTV(Gross Transaction Volume),就是房产的成交总额。一套价值1000万的房子转手,GTV就是1000万。从单打独斗,到行业协作,贝壳介入了比链家更大的市场(1万亿 → 3.85万亿)。虽然链家在竞争中独拿全部,贝壳在合作中分享部分,但市场变大了,贝壳的收入规模,远远大于链家。从链家转向平台第一年,收入200多亿,到2021年营业收入为808亿元,增长3倍。</p><p><strong>Δ2:体验口碑的持续增量。</strong>一边是贝壳带着45万经纪人,坚持做真房源,用重复博弈的思路延长经纪人从业时间;另一边是另外150万经纪人仍然用以前的套路,客户买房时会怎么选?当然会选服务更好的。这本身就是过去十几年链家在鱼龙混杂的经纪行业脱颖而出的原因,现在这些都到了贝壳,体验更好,贝壳和上面所有合作者就会有共同的增量。再进一步看,<strong>一个确定的趋势是中国未来存量房市场越来越大,经纪服务渗透率越来越高,这个市场会更大,口碑更好的贝壳就更有可能获得这部分新市场增量。</strong></p><p><strong>Δ3:从经纪到周边的增量。</strong>经纪业务,不是贝壳的核心。从经纪公司的中介费中分佣金,必然会导致我多你就少的博弈。贝壳CEO彭永东说,贝壳是希望通过经纪业务,接触到更大的市场,发现周边更大的可能性。彭永东预计,这个行业每产生1元钱的中介收入,就能触达2元钱的周边业务。这是更大的增量空间。</p><p>比如金融。比如装修。比如一手房。一手房过去在楼盘附近的售楼中心销售。但现在很多一手房上架了贝壳ACN。全国5.1万门店, 和45.6万经纪人一起帮你卖。45.6万人经纪人共同发掘了,大量分散的二线城市买省会城市,市中心租房买郊区新房的,时空距离远的需求,让一手房销售效率得到巨大提升。<strong>这就是从传统二手房经纪业务,走向周边,你想得到或者想不到的增量。</strong>只要创造了增量,下面就不是怎么挣钱的问题了,而只是怎么分钱的问题。</p><h2 id="04-总结与启示"><a href="#04-总结与启示" class="headerlink" title="04 总结与启示"></a>04 总结与启示</h2><p>链家的创始人左晖曾说过“做难而正确的事。”做正确的事则需要直面行业的“真问题”。难的事则是需要找到问题的“根本解”。贝壳在进入房源市场,打造交易信息平台时,并没有回避行业中关于人性的博弈,而是利用交易行为中各类角色的分析和利润的分配,并主动邀请竞争对手加入平台打破原有零和博弈的局面。从<a href="https://runwise.co/category/applied-leadership/">创新的增量</a>看,这打破了原有市场资源的局限,扩充了资源互通的圈子,不仅给予竞争对手信息和平台,也实现自身业务的可持续增长。</p><p>文章来源:贝壳找房-另类平台崛起</p>]]></content>
<categories>
<category> 模式 </category>
</categories>
<tags>
<tag> ACN </tag>
<tag> 贝壳 </tag>
<tag> 创新 </tag>
</tags>
</entry>
<entry>
<title>Docker容器中安装Mysql5.7</title>
<link href="/2022/03/24/docker-rong-qi-zhong-an-zhuang-mysql5-7/"/>
<url>/2022/03/24/docker-rong-qi-zhong-an-zhuang-mysql5-7/</url>
<content type="html"><![CDATA[<h4 id="一、拉取镜像"><a href="#一、拉取镜像" class="headerlink" title="一、拉取镜像"></a>一、拉取镜像</h4><pre class="line-numbers language-none"><code class="language-none">docker pull mysql:5.7<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>创建数据目录</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /usr/local/dockerdata/mysql/conf<span class="token function">mkdir</span> /usr/local/dockerdata/mysql/logs<span class="token function">mkdir</span> /usr/local/dockerdata/mysql/mysql<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h4 id="二、创建配置文件"><a href="#二、创建配置文件" class="headerlink" title="二、创建配置文件"></a>二、创建配置文件</h4><p>设置编码为utf8mb4<br> <code>cd /usr/local/dockerdata/mysql/conf</code><br> <code>vi my.conf</code><br> 需要手动添加上[client]和[mysql]。</p><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">client</span></span><span class="token punctuation">]</span><span class="token keyword">default</span><span class="token operator">-</span>character<span class="token operator">-</span><span class="token keyword">set</span> <span class="token operator">=</span> utf8mb4<span class="token punctuation">[</span>mysql<span class="token punctuation">]</span><span class="token keyword">default</span><span class="token operator">-</span>character<span class="token operator">-</span><span class="token keyword">set</span> <span class="token operator">=</span> utf8mb4<span class="token punctuation">[</span>mysqld<span class="token punctuation">]</span>character<span class="token operator">-</span><span class="token keyword">set</span><span class="token operator">-</span>client<span class="token operator">-</span>handshake <span class="token operator">=</span> FALSEcharacter<span class="token operator">-</span><span class="token keyword">set</span><span class="token operator">-</span>server <span class="token operator">=</span> utf8mb4collation<span class="token operator">-</span>server <span class="token operator">=</span> <span class="token class-name">utf8mb4_unicode_ci</span>init_connect<span class="token operator">=</span>'SET NAMES utf8mb4'<span class="token keyword">default</span><span class="token operator">-</span>time_zone <span class="token operator">=</span> '<span class="token operator">+</span><span class="token number">8</span><span class="token punctuation">:</span><span class="token number">00</span>' #默认时区配置sql_mode<span class="token operator">=</span>STRICT_TRANS_TABLES<span class="token punctuation">,</span>NO_ZERO_IN_DATE<span class="token punctuation">,</span>NO_ZERO_DATE<span class="token punctuation">,</span>ERROR_FOR_DIVISION_BY_ZERO<span class="token punctuation">,</span>NO_AUTO_CREATE_USER<span class="token punctuation">,</span>NO_ENGINE_SUBSTITUTION<span class="token preprocessor property">#设置数据库支持分组</span>lower_case_table_names<span class="token operator">=</span><span class="token number">1</span> #表名不区分大小写设置utf8编码只需要在 <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">mysqld</span></span><span class="token punctuation">]</span>后添加 character_set_server<span class="token operator">=</span>utf8<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="三、运行镜像"><a href="#三、运行镜像" class="headerlink" title="三、运行镜像"></a>三、运行镜像</h3><pre class="line-numbers language-none"><code class="language-none">docker run --restart always -p 3306:3306 --name mysql -v /usr/local/dockerdata/mysql/conf/my.conf:/etc/mysql/my.conf -v /usr/local/dockerdata/mysql/logs:/logs -v /usr/local/dockerdata/mysql/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="四、进入镜像"><a href="#四、进入镜像" class="headerlink" title="四、进入镜像"></a>四、进入镜像</h3><pre class="line-numbers language-none"><code class="language-none">docker exec -it mysql bash<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="五、-进入mysql"><a href="#五、-进入mysql" class="headerlink" title="五、 进入mysql"></a>五、 进入mysql</h3><pre class="line-numbers language-none"><code class="language-none">mysql -uroot -p<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="六、-设置远程可以登录"><a href="#六、-设置远程可以登录" class="headerlink" title="六、 设置远程可以登录"></a>六、 设置远程可以登录</h3><p>现在这样是无法在本地用工具登录访问的,现在要做两件事,一件事是将云服务器上的3306端口开放;另一件事是配置远程可以访问。<br> <code>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Admin123!' WITH GRANT OPTION;</code><br> <code>flush privileges;</code></p><h5 id="解决Navicat连接docker中mysql容器10060-x2F-10061错误"><a href="#解决Navicat连接docker中mysql容器10060-x2F-10061错误" class="headerlink" title="解决Navicat连接docker中mysql容器10060/10061错误"></a>解决Navicat连接docker中mysql容器10060/10061错误</h5><p>1.关闭防火墙</p><p><code>stemctl status firewalld</code> 查看防火墙状态<br> <code>service iptables stop</code> 永久关闭防火墙<br> <code>systemctl stop firewalld</code> 暂时关闭防火墙</p><p>2.指定容器内部端口为3306</p><p> 因为我容器中有其他应用的端口用到3306所以这里改了,若容器内没有把3306端口占用<br><code>docker run --restart always -p 3306:3306 --name mysql -v /usr/local/dockerdata/mysql/conf/my.conf:/etc/mysql/my.conf -v /usr/local/dockerdata/mysql/logs:/logs -v /usr/local/dockerdata/mysql/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7</code></p><p>3.进入 <code>mysql.conf</code> 把bind-address去掉注释同时改为0.0.0.0,并且加上port=3306。再重启mysql容器就可以了。</p><p>作者:陈煦缘<br>链接:<a href="https://www.jianshu.com/p/cb4ad4e824ff">https://www.jianshu.com/p/cb4ad4e824ff</a><br>来源:简书<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p>]]></content>
<categories>
<category> Mysql </category>
</categories>
<tags>
<tag> Mysql </tag>
<tag> Docker </tag>
</tags>
</entry>
<entry>
<title>元数据和主数据</title>
<link href="/2022/03/23/yuan-shu-ju-he-zhu-shu-ju/"/>
<url>/2022/03/23/yuan-shu-ju-he-zhu-shu-ju/</url>
<content type="html"><![CDATA[<p> 企业数据管理的内容和范畴通常包含交易数据、主数据以及元数据。本文将主要针对主数据、元数据的相关概念以及应用跟大家做一个探讨。 </p><h3 id="1-1-主数据和主数据管理的概念"><a href="#1-1-主数据和主数据管理的概念" class="headerlink" title="1.1 主数据和主数据管理的概念"></a>1.1 主数据和主数据管理的概念</h3><p> 企业主数据是用来描述企业核心业务实体的数据,比如客户、合作伙伴、员工、产品、物料单、账户等;它是具有高业务价值的、可以在企业内跨越各个业务部门被重复使用的数据,并且存在于多个异构的应用系统中。</p><p> 企业主数据可以包括很多方面,除了常见的客户主数据之外,不同行业的客户还可能拥有其他各种类型的主数据,例如:对于电信行业客户而言,电信运营商提供的各种服务可以形成其产品主数据;对于航空业客户而言,航线、航班是其企业主数据的一种。对于某一个企业的不同业务部门,其主数据也不同,例如市场销售部门关心客户信息,产品研发部门关心产品编号、产品分类等产品信息,人事部门关心员工机构,部门层次关系等信息。</p><h4 id="1-1-1数据管理的范畴和主数据管理的概念"><a href="#1-1-1数据管理的范畴和主数据管理的概念" class="headerlink" title="1.1.1数据管理的范畴和主数据管理的概念"></a>1.1.1数据管理的范畴和主数据管理的概念</h4><p> 企业数据管理的内容及范畴通常包括交易数据、主数据以及元数据。</p><ul><li>· 交易数据:用于纪录业务事件,如客户的订单,投诉记录,客服申请等,它往往用于描述在某一个时间点上业务系统发生的行为。</li><li>· 主数据:主数据则定义企业核心业务对象,如客户、产品、地址等,与交易流水信息不同,主数据一旦被记录到数据库中,需要经常对其进行维护,从而确保其时效性和准确性;主数据还包括关系数据,用以描述主数据之间的关系,如客户与产品的关系、产品与地域的关系、客户与客户的关系、产品与产品的关系等。</li><li>· 元数据:即关于数据的数据,用以描述数据及其环境的结构化信息,便于查找、理解、使用和管理数据。</li></ul><p> 主数据管理是指一整套的用于生成和维护企业主数据的规范、技术和方案,以保证主数据的完整性、一致性和准确性。</p><h4 id="1-1-2主数据管理的意义"><a href="#1-1-2主数据管理的意义" class="headerlink" title="1.1.2主数据管理的意义"></a>1.1.2主数据管理的意义</h4><p> 集成、共享、数据质量、数据治理是主数据管理的四大要素,主数据管理要做的就是从企业的多个业务系统中整合最核心的、最需要共享的数据(主数据),集中进行数据的清洗和丰富,并且以服务的方式把统一的、完整的、准确的、具有权威性的主数据分发给全企业范围内需要使用这些数据的操作型应用和分析型应用,包括各个业务系统、业务流程和决策支持系统等。</p><p> 主数据管理使得企业能够集中化管理数据,在分散的系统间保证主数据的一致性,改进数据合规性、快速部署新应用、充分了解客户、加速推出新产品的速度。从 IT 建设的角度,主数据管理可以增强 IT 结构的灵活性,构建覆盖整个企业范围内的数据管理基础和相应规范,并且更灵活地适应企业业务需求的变化。</p><p> 以客户主数据为例,客户主数据是目前企业级客户普遍面临的一个问题,在大多数企业中,客户信息通常分散于 CRM 等各个业务系统中,而每个业务系统中都只有客户信息的片断,即不完整的客户信息,但却缺乏企业级的完整、统一的单一客户视图,结果导致企业不能完全了解客户,无法协调统一的市场行为,导致客户满意度下降,市场份额减少。因此,建立客户主数据系统的目的在于:</p><p>· 整合并存储所有业务系统和渠道的客户及潜在客户的信息:一方面从相关系统中抽取客户信息,并完成客户信息的清洗和整合工作,建立企业级的客户统一视图;另一方面,客户主数据管理系统将形成的统一客户信息以广播的形式同步到其他各个系统,从而确保客户信息的一致;</p><p>· 为相关的应用系统提供联机交易支持,提供客户信息的唯一访问入口点,为所有应用系统提供及时和全面的客户信息;服务于 OCRM 系统,充分利用数据的价值,在所有客户接触点上提供更多具有附加价值的服务;</p><p>· 实现 SOA 的体系结构:建立客户主数据系统之前,数据被锁定在每一个应用系统和流程中,建立主数据管理系统之后,数据从应用系统中被释放出来,并且被处理成为一组可重用的服务,被各个应用系统调用。</p><h4 id="1-1-3主数据管理系统与数据仓库系统的关系"><a href="#1-1-3主数据管理系统与数据仓库系统的关系" class="headerlink" title="1.1.3主数据管理系统与数据仓库系统的关系"></a>1.1.3主数据管理系统与数据仓库系统的关系</h4><p> 主数据管理系统与数据仓库系统是相辅相成的两个系统,但二者绝不是重复的,也不是互斥的。它们有很多共同之处:</p><ul><li>· 首先二者对企业都具有相同的价值,可以减少数据冗余和不一致性、提升对数据的洞察力,二者都是跨部门的集中式系统;</li><li>· 其次二者都依赖很多相同的技术手段,都会涉及到 ETL 技术、都需要元数据管理、都强调数据质量;</li><li>· 第三就是二者建设手段类似,都需要数据治理的规范作为指导、都需要不同系统、不同部门的协作、需要统一的安全策略。</li></ul><p>但是,主数据管理系统和数据仓库 / 决策支持系统二者之间也存在很多不同:</p><ul><li>· 处理类型不同:主数据管理 (MDM) 系统是偏交易型的系统,它为各个业务系统提供联机交易服务,系统的服务对象是呼叫中心、B2C、CRM 等业务系统;而数据仓库是属于分析型的系统,面向的是分析型的应用,是在大量历史交易数据的基础上进行多维分析,系统的使用对象是各层领导和业务分析、市场销售预测人员等;</li><li>· 实时性不同:与传统的数据仓库方案的批量 ETL 方式不同,主数据管理系统在数据初始加载阶段要使用 ETL,但在后续运行中要大量依赖实时整合的方式来进行主数据的集成和同步;</li><li>· 数据量不同:数据仓库存储的是大量的历史数据和各个维度的汇总数据,可能会是海量的,而 MDM 存储的仅仅是客户和产品等信息。</li></ul><p> 虽然主数据管理系统和数据仓库系统异同共存,但是二者却有着紧密的联系,并且可以互为促进、互为补充。举例而言,数据仓库系统的分析结果可以作为衍生数据输入到 MDM 系统,从而使 MDM 系统能够更好地为操作型 CRM 系统服务。</p><h4 id="1-1-4主数据管理系统和-ODS-的关系"><a href="#1-1-4主数据管理系统和-ODS-的关系" class="headerlink" title="1.1.4主数据管理系统和 ODS 的关系"></a>1.1.4主数据管理系统和 ODS 的关系</h4><p> 在某些情况下,主数据管理系统和 ODS 系统可能容易被混淆,的确,从实时上来看,主数据管理系统和 ODS 系统存储的都是实时数据,但是二者存储的数据内容是全然不同的,主数据管理系统中不存储交易数据,比如银行客户的交易流水信息是不应该放在主数据管理系统中进行管理的,这与 MDM 与 ODS 的一个很大区别。举一个航空公司的例子,比如某个客户在电子商务网站上定了一张机票,产生一个订单,然后他又通过呼叫中心要求改签,这个场景中,两个系统之间要实现客户信息和订单信息的共享,其中客户信息共享通过MDM 系统来实现,而订单信息则需要采用 ODS 或其它手段进行共享,我们是不推荐把此类信息交由 MDM 系统来管理的。</p><h4 id="1-1-5主数据管理典型应用"><a href="#1-1-5主数据管理典型应用" class="headerlink" title="1.1.5主数据管理典型应用"></a>1.1.5主数据管理典型应用</h4><p> 主数据管理的典型应用有客户管理与产品管理,主数据管理在金融行业典型的应用就是企业级客户信息整合系统(Enterprise Custome Information Facility,简称ECIF),其目标是整合全行现有业务系统中的客户信息,保留客户的最新信息,为各应用系统提供完整的、共享的、一致的客户信息,建立企业级客户单一视图,在全行范围内为客户信息的使用和管理提供服务,为全行从“以产品为中心”的业务流程向“以客户为中心”的业务流程整合提供强有力的支持。</p><h4 id="1-1-6基于元数据的主数据管理"><a href="#1-1-6基于元数据的主数据管理" class="headerlink" title="1.1.6基于元数据的主数据管理"></a>1.1.6基于元数据的主数据管理</h4><p> 元数据管理作为企业数据资产管理中的一项核心技术,也将为主数据管理提供有力支撑,具体表现在:</p><ul><li>· 为业务实体的定义、关系和业务规则到IT实现之间提供清晰、标准的语义转换,提高业务和IT之间的一致性,保障IT系统能够真实反映业务事实;</li><li>· 为主数据管理的各个数据处理阶段提供数据标准、数据映射关系和数据规则的描述,保障主数据管理的数据质量;</li><li>· 为主数据库和其他系统之间的数据交互提供有关数据标准、数据映射关系和数据规则的描述。</li></ul><h3 id="1-2-元数据管理和管数据管理的概念"><a href="#1-2-元数据管理和管数据管理的概念" class="headerlink" title="1.2 元数据管理和管数据管理的概念"></a>1.2 元数据管理和管数据管理的概念</h3><h4 id="1-2-1元数据定义"><a href="#1-2-1元数据定义" class="headerlink" title="1.2.1元数据定义"></a>1.2.1元数据定义</h4><p> 元数据(Meta Data)是关于数据的数据,当人们描述现实世界的现象时,就会产生抽象信息,这些抽象信息便可以看作是元数据,元数据主要用来描述数据的上下文信息。通俗的来讲,假若图书馆的每本书中的内容是数据的话,那么找到每本书的索引则是元数据,元数据之所以有其它方法无法比拟的优势,就在于它可以帮助人们更好的理解数据,发现和描述数据的来龙去脉,特别是那些即将要从OLTP系统上升到DW/BI体系建设的企业,元数据可以帮他们形成清晰直观的数据流图,元数据是数据管控的基本手段。</p><p> 元数据是为了提升共享、重新获取和理解企业信息资产的水平,元数据是企业信息管理的润滑剂,不对元数据进行管理或管理不得当,信息将被丢失或处于隐匿状态而难以被用户使用,数据集成将十分昂贵,不能对业务进行有效支撑。终端用户要识别相关的信息将十分困难,最终用户将失去对数据的信任。</p><h4 id="1-2-2元数据分类"><a href="#1-2-2元数据分类" class="headerlink" title="1.2.2元数据分类"></a>1.2.2元数据分类</h4><p> 元数据管理的范围将涵括数据产生、数据存储、数据加工和展现等各个环节的数据描述信息,帮助用户理解数据来龙去脉、关系及相关属性。按其描述对象的不同可以划分为三类元数据:技术元数据、业务元数据和管理元数据。这三种元数据的具体描述如下:</p><ul><li><strong>技术元数据</strong> 技术元数据是描述数据系统中技术领域相关概念、关系和规则的数据,主要包括对数据结构、数据处理方面的特征描述,覆盖数据源接口、数据仓库与数据集市存储、ETL、OLAP、数据封装和前端展现等全部数据处理环节;</li><li><strong>业务元数据</strong> 业务元数据是描述数据系统中业务领域相关概念、关系和规则的数据,主要包括业务术语、信息分类、指标定义和业务规则等信息;</li><li><strong>管理元数据</strong> 管理元数据是描述数据系统中管理领域相关概念、关系和规则的数据,主要包括人员角色、岗位职责和管理流程等信息。</li></ul><h4 id="1-2-3元数据管理的范围"><a href="#1-2-3元数据管理的范围" class="headerlink" title="1.2.3元数据管理的范围"></a>1.2.3元数据管理的范围</h4><p> 元数据管理范围的不应仅仅局限于企业数据仓库、数据集市以及管理分类应用的数据,还应该将企业的业务系统的元数据纳入进来就行统一的管理,真正做到从源头对元数据进行管理,作为对数据的完整生命周期进行管理。</p><h4 id="1-2-4元数据应用"><a href="#1-2-4元数据应用" class="headerlink" title="1.2.4元数据应用"></a>1.2.4元数据应用</h4><p><strong>1)</strong> <strong>数据地图</strong></p><p> 数据地图展现是以拓扑图的形式对数据系统的各类数据实体、数据处理过程元数据进行分层次的图形化展现,并通过不同层次的图形展现粒度控制,满足开发、运维或者业务上不同应用场景的图形查询和辅助分析需要。</p><p><strong>2)</strong> <strong>元数据分析</strong></p><ul><li>· 血缘分析</li></ul><p> 血缘分析(也称血统分析)是指从某一实体出发,往回追溯其处理过程,直到数据系统的数据源接口。对于不同类型的实体,其涉及的转换过程可能有不同类型,如:对于底层仓库实体,涉及的是ETL处理过程;而对于仓库汇总表,可能既涉及ETL处理过程,又涉及仓库汇总处理过程;而对于指标,则除了上面的处理过程,还涉及指标生成的处理过程。数据源接口实体由源系统提供,作为数据系统的数据输入,其它的数据实体都经过了一个或多个不同类型的处理过程。血缘分析正是提供了这样一种功能,可以让使用者根据需要了解不同的处理过程,每个处理过程具体做什么,需要什么样的输入,又产生什么样的输出。</p><ul><li>· 影响分析</li></ul><p> 影响分析是指从某一实体出发,寻找依赖该实体的处理过程实体或其他实体。如果需要可以采用递归方式寻找所有的依赖过程实体或其他实体。该功能支持当某些实体发生变化或者需要修改时,评估实体影响范围。</p><ul><li>· 实体关联分析</li></ul><p> 实体关联分析是从某一实体关联的其它实体和其参与的处理过程两个角度来查看具体数据的使用情况,形成一张实体和所参与处理过程的网络,从而进一步了解该实体的重要程度。本功能可以用来支撑需求变更影响评估的应用.</p><ul><li>· 实体差异分析</li></ul><p> 实体差异分析是对元数据的不同实体进行检查,用图形和表格的形式展现它们之间的差异,包括名字、属性及数据血缘和对系统其他部分影响的差异等,在数据系统中存在许多类似的实体。这些实体(如数据表)可能只有名字上或者是在属性中存在微小的差异,甚至有部分属性名字都相同,但处于不同的应用中。由于各种原因,这些微小的差异直接影响了数据统计结果,数据系统需要清楚了解这些差异。本功能有助于进一步统一统计口径,评估近似实体的差异</p><ul><li>· 指标一致性分析</li></ul><p> 指标一致性分析是指用图形化的方式来分析比较两个指标的数据流图是否一致,从而了解指标计算过程是否一致。该功能是指标血缘分析的一种具体应用。指标一致性分析可以帮助用户清楚地了解到将要比较的两个指标在经营分析数据流图中各阶段所涉及的数据对象和转换关系是否一致,帮助用户更好地了解指标的来龙去脉,清楚理解分布在不同部门且名称相同的指标之间的差异,从而提高用户对指标值的信任。</p><p><strong>3)</strong> <strong>辅助应用优化</strong></p><p> 元数据对数据系统的数据、数据加工过程以及数据间的关系提供了准确的描述,利用血缘分析、影响分析和实体关联分析等元数据分析功能,可以识别与系统应用相关的技术资源,结合应用生命周期管理过程,辅助进行数据系统的应用优化</p><p><strong>4)</strong> <strong>辅助安全管理</strong></p><p> 企业数据平台所存储的数据和提供的各类分析应用,涉及到公司经营方面的各类敏感信息。因此在数据系统建设过程中,须采用全面的安全管理机制和措施来保障系统的数据安全。</p><p> 数据系统安全管理模块负责数据系统的数据敏感度、客户隐私信息和各环节审计日志记录管理,对数据系统的数据访问和功能使用进行有效监控。为实现数据系统对敏感数据和客户隐私信息的访问控制,进一步实现权限细化,安全管理模块应以元数据为依据,由元数据管理模块提供敏感数据定义和客户隐私信息定义,辅助安全管理模块完成相关安全管控操作。</p><p><strong>5)</strong> <strong>基于元数据的开发管理</strong></p><p> 数据系统项目开发的主要环节包括:需求分析、设计、开发、测试和上线。开发管理应用可以提供相应的功能,对以上各环节的工作流程、相关资源、规则约束、输入输出信息等提供管理和支持。</p>]]></content>
<categories>
<category> 数据仓库 </category>
</categories>
<tags>
<tag> 元数据 </tag>
<tag> 主数据 </tag>
</tags>
</entry>
<entry>
<title>30岁做什么,可在5年后受益匪浅?</title>
<link href="/2022/03/16/30-sui-zuo-shi-me-ke-zai-5-nian-hou-shou-yi-fei-qian/"/>
<url>/2022/03/16/30-sui-zuo-shi-me-ke-zai-5-nian-hou-shou-yi-fei-qian/</url>
<content type="html"><![CDATA[<p><strong>开始做一项投资5年以后才能得到回报的事情。</strong></p><p>6年前,我想写微信公众号,写了两个月,粉丝一直增长很慢,最终放弃了,而当时一起做公众号认识的朋友,现在已有人做到几十万粉丝,靠公众号实现自由职业。</p><p>4年前,我想学python,做数据分析,记着那个国庆7天假,没有出门,在家学了7天python,坚持了两周,虽然能简单编写几个程序,但总感觉对目前工作没有什么价值,放弃了。</p><p>1年前,我想学PPT,学了一个月,因为工作突然忙了起来,然后就忘记了。</p><p>我有时幻想,假如这些事情,有一件我能坚持下来,保持每天学两个小时,到现在也能有些成效,至少比现在的我要好吧。</p><p>这些事情,我为什么没有坚持住?</p><p><strong>因为我太想短期就看到成效了,一旦短期看不到效果,动机下降,自然很快就放弃了。</strong></p><p>很多事情,我们为什么很容易放弃?</p><p>因为现实打击了我们,我们没有像我们想象的那样飞速进步,原本信誓旦旦想达到目标的决心开始衰退,到最后,我们完全停了下来,不再重新开始了。</p><p><strong>人们往往高估自己在短时间内做成事情的能力,而又往往低估自己可以在长时间内做成事情的能力。</strong></p><p>当然,这些经历也并不是全没用处,至少让我发现我不适合做什么,我身上有那些弱点,该怎么去克服。</p><p>毕竟人生有些错误,有些弯路,总是是无法避免的,总是要去经历的。年轻的时候,把能犯的错误都犯了,这时的错误,成本低,船小好掉头。</p><p>所以,30岁的时候(其实,25岁的时候就该开始思考了,好吧,忘记了),应该时刻思考,35岁的自己想要成为怎样的人,然后从现在就去做,做好投资5年的准备。</p><p>当你真的用心去做的时候,你会发现,可能几个月后,一年后就会产生效果。如果没有产生效果,记得坚持下去。</p><p>那些杰出人物,都是通过年复一年的练习,在漫长而艰苦的过程中一步一步改进,终于练就了他们杰出的能力。</p><p><strong>对大多数人而言,没有捷径可走。</strong></p><p>我现在一直反思,很多事情,为什么我没有做成。因为我总想找捷径,总想短期就获得回报。直到最终发现,总想找捷径才是最大的弯路。</p><p>做人做事,眼光放长远一些,以五年为一个单位来规划自己的学习。</p><p>拿CPA、CFA证书来说,能考下来的人,基本都需要3—5年的时间,当然,更多的人是坚持一年就放弃了。</p><p>拿写作来说,现在那些大V,大多都默默的写了好几年,才有现在的成就。</p><p>30岁,开始做一件事情,不能因为目前每天没有回报就不去做。<strong>而应该思考的是,坚持做5年,有没有效果。</strong></p><p>这也是为什么对18岁的人而言,上大学、读研是最好的投资,因为投资时间足够长,且短期看不到回报,基本上都是4年甚至6、7年才能看到回报。</p><p><strong>对30岁年龄的人更是一样,尽快找到那个让你投资5年的事情,然后专注去做,坚持下去。</strong></p><p>虽然我已经过了30岁,但我现在尝试做的一些事情,都会考虑坚持5年。</p><p><strong>就投资而言,我现在买的一些股票和基金,基本都做好了持股5年以上的准备。</strong></p>]]></content>
<categories>
<category> 感悟 </category>
</categories>
<tags>
<tag> 人生 </tag>
<tag> 感悟 </tag>
</tags>
</entry>
<entry>
<title>聚合支付的点滴思考</title>
<link href="/2022/03/15/ju-he-zhi-fu-de-dian-di-si-kao/"/>
<url>/2022/03/15/ju-he-zhi-fu-de-dian-di-si-kao/</url>
<content type="html"><![CDATA[<p>2021年10月13日有一个新政策发布, 根据《中国人民银行关于加强支付受理终端及相关业务管理的通知(银发〔2021〕259号)》新法其中提到条码支付被纳入监管,对个人收款条码的使用规范做出具体规定,并已于2022年3月1日起施行。<img src="https://s2.loli.net/2022/03/15/HAit75dkf6DsSc3.png" alt="图片"></p><p>简单来说,<strong>个人收款码无法再用于商业用途</strong>。</p><p><img src="https://s2.loli.net/2022/03/15/wfFa8YhTsu4Q236.png" alt="图片"></p><p>这个时候就显得聚合支付的重要性了。</p><h2 id="什么是聚合支付"><a href="#什么是聚合支付" class="headerlink" title="什么是聚合支付"></a>什么是聚合支付</h2><p>聚合支付,也称“融合支付”,是指只从事“支付、结算、清算”服务之外的“支付服务”。简单来说就是把微信支付的收款码和支付宝支付收款码聚合在一起形成一个二维码,微信扫描二维码就会跳转到微信支付,而支付宝扫码就会跳转到支付宝支付。</p><h2 id="聚合支付发展过程"><a href="#聚合支付发展过程" class="headerlink" title="聚合支付发展过程"></a>聚合支付发展过程</h2><p>2014年开始,移动支付逐渐形成多主体竞争局面,二维码扣扫行为出现,多样化的支付场景催生了聚合支付。</p><p>2016年支付清算协会向支付机构下发《条码支付业务规范》(征求意见稿),二维码支付获监管机构认可,此时支付宝及微信加速线下渗透,聚合支付产品更为多样,且市场推广都较高,聚合支付进入规模爆发期,资本纷纷入局。</p><p>据零壹智库不完全统计,已备案机构在2015年和2016年共发生融资43笔,披露的融资总额超87亿元。</p><p>2017年下半年开始,监管趋严,但也意味着聚合支付终被监管机构认可。2018年至今,聚合支付加速洗牌,2020年备案制一出,行业迎来大清洗,进入合规化良性发展时期。</p><p><strong>图1:聚合支付发展历程</strong></p><p><img src="https://s2.loli.net/2022/03/15/bmt3clILCZprGyu.jpg" alt="bmt3clILCZprGyu"></p><p><strong>资料来源:公开资料整理,零壹智库</strong></p><p>据易观千帆数据显示,2014年我国聚合支付市场交易规模仅为0.1万亿,2015年飙升到了1.5万亿,同比增长1400%,这一时期O2O的发展已经到了繁荣且多样化阶段,移动互联网的兴起,移动支付多样化,场景碎片化,给聚合支付带来了机遇。</p><p>2016年聚合支付市场交易规模继续增长到8万亿,同比增长433.3%,增速仍维持高位。到2017年监管趋严,增速显著下降,但移动支付规模持续增长,经过多年的发展,聚合支付渗透率也在不断提高,聚合支付交易规模依然保持增长态势。</p><p><strong>图2:聚合支付市场交易规模</strong></p><p><img src="https://s2.loli.net/2022/03/15/Bgu3DyLX8QYTo6q.jpg" alt="Bgu3DyLX8QYTo6q"></p><p><strong>数据来源:易观千帆,零壹智库</strong></p><h2 id="为什么要用聚合支付"><a href="#为什么要用聚合支付" class="headerlink" title="为什么要用聚合支付"></a>为什么要用聚合支付</h2><p>前面也说了由于法律的实施,个人收款码无法用于商业用途,同时在平时商户收款过程中,很多时候会有三个码,一个微信支付的收款码,一个支付宝支付的收款码,一个银联支付的收款码,不美观且不方便,用一个收款码代替三个收款码,更美观且更智能。</p><h2 id="如何搭建聚合支付系统?"><a href="#如何搭建聚合支付系统?" class="headerlink" title="如何搭建聚合支付系统?"></a>如何搭建聚合支付系统?</h2><p>零方聚合支付系统,可以完美解决聚合支付的痛点,支持各个银行。包含了微信支付和支付宝支付。商户只要在后台申请二维码之后,就可以获得一个聚合支付后的二维码,可以完美的聚合在一起。通过微信和支付宝服务商的API支付接口,来聚合微信和支付宝,达到便捷的效果。</p><p>当商户收款后,接口服务商会首先收到款,然后可以通过提现接口把钱提现给商户,一步到位。</p><p>同时推出代理商功能,可以招聘代理帮你推广,推广的佣金和支付的手续费可以自定义,可以让代理员地推,<strong>每推一个商户,只要有收款,都会产生佣金。实现躺着赚钱!</strong></p><p>废话不多说,来看看系统功能清单。</p><p><img src="https://s2.loli.net/2022/03/15/V9BcmnNsviuTwko.png" alt="V9BcmnNsviuTwko"></p><p>首先是首页大盘,可以看到一切统计数据。</p><p><img src="https://s2.loli.net/2022/03/15/f3NkZuFrDBbS1yJ.png" alt="图片"></p><p>下图分别是微信和支付宝扫码之后的样式。</p><p><img src="https://s2.loli.net/2022/03/15/OW2kHPahuIbQLsZ.jpg" alt="图片"></p><p>添加代理商,帮你推广二维码,躺着赚钱!</p><p><img src="https://s2.loli.net/2022/03/15/Zuyi7C3tJdBOeTL.png" alt="图片"></p><p>如何申请聚合支付二维码?</p><p>下图是商户的注册功能和申请二维码的功能,可以点击创建收款码,填写收款页面的名称,即付款给“xxx”,即可创建聚合支付收款二维码。</p><p><img src="https://s2.loli.net/2022/03/15/jFasNOoWd82CUGS.png" alt="图片"></p><p>手机也可以登录商户后台</p><p><img src="https://s2.loli.net/2022/03/15/gnoVdEBmuf3vhja.jpg" alt="图片"></p><p>支付后,还可以配置广告,还可以跳转。</p><p><img src="https://s2.loli.net/2022/03/15/DKoVie4gm9nafMu.png" alt="图片"></p><p>订单详情</p><p><img src="https://s2.loli.net/2022/03/15/lfP9Hh7NKaDdcBZ.png" alt="lfP9Hh7NKaDdcBZ"></p><p>支付后的广告配置。</p><p><img src="https://s2.loli.net/2022/03/15/cU6O72ztD1BsQPq.png" alt="图片"></p><p>支持配置支付二维码样式</p><p><img src="https://s2.loli.net/2022/03/15/8onrpKyih7JQeUa.png" alt="图片"></p><p>可以配置聚合支付收款设备,云喇叭,会有语音收款提示。</p><p><img src="https://s2.loli.net/2022/03/15/XlpiUNAczDv7qjL.png" alt="图片"></p><h2 id="盈利模式的探索"><a href="#盈利模式的探索" class="headerlink" title="盈利模式的探索"></a>盈利模式的探索</h2><ol><li><p><strong>商户交易流水分润</strong></p><p>微信、支付宝、银联为了推广自己的产品,会给聚合支付服务商一个较低的交易流水费率A(比如0.38%)。若是商户自己去申请收款码,则交易流水费率B会高一些。</p><p>费率A减去费率B(比如0.6%),就是聚合支付服务商能赚的差价(0.22%)。这个差价其实也不高,好过没有。如果签约的商户数量多、交易订单多,那么就可以细水长流赚得盆满钵满。</p></li><li><p><strong>产品研发、升级和维护</strong></p><p>服务商可以为客户提供技术支持,比如开发收银软件、扫码点餐小程序</p></li><li><p><strong>提供增值服务</strong></p><p>比如:顾客支付成功后就成为店铺会员、支付成功页面展示广告、门店粉丝经营、门店优惠资讯推荐等。</p><p>毕竟做聚合支付的,不能只做单一的支付工具,否则无法适应市场竞争,只有满足商户多元化的需求,才能让企业续命和做大做强。</p></li><li><p><strong>硬件设备差价</strong></p><p>商户在收款时,除了使用二维码贴纸这个情况不需要用到硬件设备,其余都是需要的。比如,扫码枪、小白盒、蓝牙音箱、刷脸机等等。</p><p>这些设备有些可以由商家自行网购,有些必须从服务商购买,因为个别设备是需要对接技术接口才能使用的,而不是服务商黑心。举个例子,比如刷脸机,因为刷脸需要人脸识别,而人脸识别是非常非常敏感的个人隐私,因此必须要使用微信或支付宝生产的刷脸机,以保证人脸隐私安全。同时,微信和支付宝也会有补贴。</p></li><li><p><strong>代理商推广流水分润</strong></p><p>代理商帮助商户接入聚合支付收款,随后商户只要使用这个码进行收款,代理商便可获得交易流水分润。这是一项长期的收入,也就是前面所说到的管道收益。简单介绍一下管道收益的意思:即使你不在工作,没有在付出,也能获得收入,得到回报。举个例子,假设小王加入了并成为代理商,他帮助一个商户接入了聚合支付,这个商户产生了1万元的交易流水,代理商至少可以获得15-20甚至更高的分润。那么如果代理商有100个商户,一天就可获得分润1500-2000元甚至更多,这只是打个最基础的比方,假设代理商有200、300、或者500以上的商户数,那么收入就会更高。</p></li></ol>]]></content>
<categories>
<category> 聚合支付 </category>
</categories>
<tags>
<tag> 聚合支付 </tag>
<tag> 盈利 </tag>
<tag> 模式 </tag>
</tags>
</entry>
<entry>
<title>macOS下安装Zsh并使用oh-my-zsh打造高效便捷的shell环境</title>
<link href="/2022/03/14/macos-xia-an-zhuang-zsh-bing-shi-yong-oh-my-zsh-da-zao-gao-xiao-bian-jie-de-shell-huan-jing/"/>
<url>/2022/03/14/macos-xia-an-zhuang-zsh-bing-shi-yong-oh-my-zsh-da-zao-gao-xiao-bian-jie-de-shell-huan-jing/</url>
<content type="html"><![CDATA[<h2 id="macOS-Zsh-使用-oh-my-zsh-打造高效便捷的-shell-环境"><a href="#macOS-Zsh-使用-oh-my-zsh-打造高效便捷的-shell-环境" class="headerlink" title="macOS Zsh 使用 oh-my-zsh 打造高效便捷的 shell 环境"></a>macOS Zsh 使用 oh-my-zsh 打造高效便捷的 shell 环境</h2><blockquote><h2 id="Zsh-完全兼容-bash,支持强大的智能命令补全功能,支持大量的界面主题和插件,功能和效率都极大的增强和提高。"><a href="#Zsh-完全兼容-bash,支持强大的智能命令补全功能,支持大量的界面主题和插件,功能和效率都极大的增强和提高。" class="headerlink" title="Zsh 完全兼容 bash,支持强大的智能命令补全功能,支持大量的界面主题和插件,功能和效率都极大的增强和提高。"></a>Zsh 完全兼容 bash,支持强大的智能命令补全功能,支持大量的界面主题和插件,功能和效率都极大的增强和提高。</h2></blockquote><p>在 Unix/Linux 的世界里,人机交互的工具就是 shell 了,由于各个发行版的系统默认 shell 都是 bash,所以 bash 的知名度是最高的。其实还有一款效率远超 bash 的 shell,叫做 zsh。zsh 同样历史悠久,发布于 1990 年,只比 bash 晚一年,而且 zsh 相比 bash 有很多功能上、性能上的改进。想要了解两者具体有那些差别,可以查看<a href="https://www.educba.com/zsh-vs-bash/">这篇文章</a>。</p><p>zsh 虽然很优秀,但在初期配置上太过繁琐,流行率一直不高(SYSIN),直到 github 上 <a href="https://github.com/ohmyzsh/ohmyzsh">oh-my-zsh</a> 项目的出现,使大家使用 zsh 的便捷性大大提高,从 macOS Catalina 版开始默认使用 zsh,使得 zsh 得到了更加广泛的关注。</p><p>很重要的一点,zsh 完全兼容 bash,如果你的 bash 脚本开头是以 !#/bin/bash 的话,在 zsh 下还是完全兼容 bash 的。</p><p>Mac 系统内置了几种 shell:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> /etc/shells<span class="token comment"># List of acceptable shells for chpass(1).</span><span class="token comment"># Ftpd will not allow users to connect who are not using</span><span class="token comment"># one of these shells.</span>/bin/bash/bin/csh/bin/dash/bin/ksh/bin/sh/bin/tcsh/bin/zsh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="1-使用-zsh-作为默认-shell"><a href="#1-使用-zsh-作为默认-shell" class="headerlink" title="1. 使用 zsh 作为默认 shell"></a>1. 使用 zsh 作为默认 shell</h2><p>从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。您还可以在较低版本的 macOS 中将 zsh 设置为默认 Shell。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">chsh -s /bin/zsh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>参看:<a href="https://support.apple.com/zh-cn/HT208050">在 Mac 上将 zsh 用作默认 Shell</a></p><h2 id="2-安装-oh-my-zsh"><a href="#2-安装-oh-my-zsh" class="headerlink" title="2. 安装 oh-my-zsh"></a>2. 安装 oh-my-zsh</h2><h3 id="自动安装"><a href="#自动安装" class="headerlink" title="自动安装"></a>自动安装</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sh</span> -c <span class="token string">"<span class="token variable"><span class="token variable">$(</span><span class="token function">curl</span> -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh<span class="token variable">)</span></span>"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="手动安装"><a href="#手动安装" class="headerlink" title="手动安装"></a>手动安装</h3><p>下载 oh-my-zsh</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>备份原有 ~/.zshrc(如果有)</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cp</span> ~/.zshrc ~/.zshrc.bak<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>从模板创建 zsh 配置文件</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cp</span> ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="3-更改-zsh-主题"><a href="#3-更改-zsh-主题" class="headerlink" title="3. 更改 zsh 主题"></a>3. 更改 zsh 主题</h2><p>主题样式<a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes">这里</a>查看。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vi</span> ~/.zshrc<span class="token comment"># 找到</span><span class="token assign-left variable">ZSH_THEME</span><span class="token operator">=</span><span class="token string">"robbyrussell"</span><span class="token comment"># 例如修改为</span><span class="token assign-left variable">ZSH_THEME</span><span class="token operator">=</span><span class="token string">"ys"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>快速修改:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sed</span> -i <span class="token string">'/^ZSH_THEME=.*/c ZSH_THEME="ys"'</span> ~/.zshrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>注:主题文件在 ~/.oh-my-zsh/themes 目录</p><h2 id="4-命令自动补全"><a href="#4-命令自动补全" class="headerlink" title="4. 命令自动补全"></a>4. 命令自动补全</h2><p><strong>默认 oh-my-zsh 命令自动补全功能如下:</strong></p><ul><li>自动列出目录</li></ul><p>输入 cd 按 tab 键,目录将自动列出,在按 tab 可以切换</p><ul><li>自动目录名简写补全</li></ul><p>要访问 /usr/local/bin 这个长路径,只需要 cd /u/l/b 按 tab 键自动补全</p><ul><li>自动大小写更正</li></ul><p>要访问 Desktop 文件夹,只需要 cd de 按 tab 键自动补全,或者查看 README.md,只需要 cat rea 自动更正补全</p><ul><li>自动命令补全</li></ul><p>输入 kubectl 按 tab 键即可看到可用命令</p><ul><li>自动补全命令参数</li></ul><p>输入 kill 按 tab 键会自动显示出进程的 process id</p><p><strong>小技巧:</strong></p><p>可以忽略 <code>cd</code> 命令,输入 <code>..</code> 或者 <code>...</code> 和当前目录名都可以跳转。</p><p>上述功能不需要额外的插件。</p><p>另外还有一些插件来增强命令补全,可根据需要启用:</p><p><strong>zsh-autosuggestions:作用是根据历史输入命令的记录即时的提示,然后按键盘 → 即可补全。</strong></p><p>(个人不推荐这个插件。)</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/sangrealest/zsh-autosuggestions.git ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>编辑 ~/.zshrc,找到 plugins=(git) 这一行,修改为:</p><blockquote><p>plugins=(git zsh-autosuggestions)</p></blockquote><p>退出终端重新打开生效。</p><p><strong>增强的实时自动命令补全插件:<a href="https://mimosa-pudica.net/zsh-incremental.html">Incremental completion on zsh</a></strong></p><p>(该插件对性能似乎有一点点影响,请根据需要启用(SYSIN)。)</p><p>作用如图:</p><p><img src="https://mimosa-pudica.net/img/zsh.gif" alt="incr"></p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> <span class="token variable">$ZSH_CUSTOM</span>/plugins/incr<span class="token function">curl</span> -fsSL https://mimosa-pudica.net/src/incr-0.2.zsh -o <span class="token variable">$ZSH_CUSTOM</span>/plugins/incr/incr.zsh<span class="token builtin class-name">echo</span> <span class="token string">'source $ZSH_CUSTOM/plugins/incr/incr.zsh'</span> <span class="token operator">>></span> ~/.zshrc<span class="token builtin class-name">source</span> ~/.zshrc<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h2 id="5-别名-alias"><a href="#5-别名-alias" class="headerlink" title="5. 别名 alias"></a>5. 别名 alias</h2><p>我们看下 git 的别名:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> ~/.oh-my-zsh/plugins/git/git.plugin.zsh<span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">g</span><span class="token operator">=</span><span class="token string">'git'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">ga</span><span class="token operator">=</span><span class="token string">'git add'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gaa</span><span class="token operator">=</span><span class="token string">'git add --all'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gapa</span><span class="token operator">=</span><span class="token string">'git add --patch'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gau</span><span class="token operator">=</span><span class="token string">'git add --update'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gav</span><span class="token operator">=</span><span class="token string">'git add --verbose'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gap</span><span class="token operator">=</span><span class="token string">'git apply'</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">gapt</span><span class="token operator">=</span><span class="token string">'git apply --3way'</span><span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token punctuation">..</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>自定义别名,在<code>~/.zshrc</code>中,最下面直接写即可。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># Example aliases</span><span class="token comment"># alias zshconfig="mate ~/.zshrc"</span><span class="token comment"># alias ohmyzsh="mate ~/.oh-my-zsh"</span><span class="token builtin class-name">alias</span> <span class="token assign-left variable">ll</span><span class="token operator">=</span><span class="token string">'ls -lahFT'</span><span class="token builtin class-name">echo</span> <span class="token string">'alias ll="ls -lahFT"'</span> <span class="token operator">>></span> ~/.zshrc<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>更强大的 alias 命令,比如下面命令,当你在 zsh 环境下输入 hello.py 即可直接用 vim 打开文件编辑,一个 tgz 的文件即可自动解压缩。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">alias</span> -s <span class="token assign-left variable">py</span><span class="token operator">=</span>vim<span class="token builtin class-name">alias</span> -s <span class="token assign-left variable">conf</span><span class="token operator">=</span>vim<span class="token builtin class-name">alias</span> -s <span class="token assign-left variable">tgz</span><span class="token operator">=</span><span class="token string">'tar zxvf'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="6-语法高亮插件"><a href="#6-语法高亮插件" class="headerlink" title="6. 语法高亮插件"></a>6. 语法高亮插件</h2><p>插件名称:zsh-syntax-highlighting</p><p><strong>作用:命令错误会显示红色,直到你输入正确才会变绿色</strong>,另外路径正确会显示下划线。</p><p>安装:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="token variable">${ZSH_CUSTOM<span class="token operator">:-</span>~<span class="token operator">/</span>.oh-my-zsh<span class="token operator">/</span>custom}</span>/plugins/zsh-syntax-highlighting<span class="token comment">##国内:</span><span class="token comment">#git clone https://gitee.com/null_454_5218/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>配置启用插件:<br>编辑 ~/.zshrc<br>以下部分加入插件的名字</p><blockquote><p>plugins=( [plugins…] zsh-syntax-highlighting) </p></blockquote><blockquote><p><code>source ~/.zshrc</code> 生效。</p></blockquote><h2 id="7-相关网站"><a href="#7-相关网站" class="headerlink" title="7. 相关网站"></a>7. 相关网站</h2><ul><li><a href="https://www.zsh.org/">Zsh 官网</a></li><li><a href="https://ohmyz.sh/">oh-my-zsh 官网</a></li><li><a href="https://github.com/ohmyzsh/ohmyzsh">oh-my-zsh github</a></li><li><a href="https://github.com/ohmyzsh/ohmyzsh/wiki/themes">oh-my-zsh 主题样式</a></li></ul>]]></content>
<categories>
<category> zsh </category>
</categories>
<tags>
<tag> zsh </tag>
<tag> shell </tag>
<tag> mac </tag>
<tag> oh-my-zsh </tag>
<tag> macOS </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2022/03/14/hello-world/"/>
<url>/2022/03/14/hello-world/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
<entry>
<title>基于Koa2框架的项目搭建及Docker部署</title>
<link href="/2022/03/14/ji-yu-koa2-kuang-jia-de-xiang-mu-da-jian-ji-docker-bu-shu/"/>
<url>/2022/03/14/ji-yu-koa2-kuang-jia-de-xiang-mu-da-jian-ji-docker-bu-shu/</url>
<content type="html"><![CDATA[<p>Koa是基于 Node.js 平台的下一代 web 开发框架,由express原班人马打造,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。</p><p>此文是简单介绍使用kos2进行项目的基本搭建以及基于Docker打包发布镜像 </p><h2 id="搭建环境"><a href="#搭建环境" class="headerlink" title="搭建环境"></a>搭建环境</h2><ol><li><p>因为此框架是基于node.js的,安装node是必须的进行的第一步,这里不再详细介绍</p></li><li><p>安装koa(我们使用淘宝镜像进行安装)</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> koa --save<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li><p>安装koa2项目生成器并创建项目</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> koa-generator -gkoa2 myPro<span class="token builtin class-name">cd</span> myPro<span class="token function">npm</span> <span class="token function">install</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>koa2 myPro用来生成项目的基本的项目架构</p><p><img src="https://s2.loli.net/2022/03/14/IsOA28lea5xZvyV.png" alt="img"></p></blockquote></li><li><p>启动项目服务</p><blockquote><p>npm start </p><p>访问<a href="http://localhost:3000/">http://localhost:3000/</a></p><p><img src="https://s2.loli.net/2022/03/14/NcGsxJh7kKQO6gP.png" alt="img"></p></blockquote></li></ol><p>到这里,项目初始化成功。</p><h2 id="Docker如何部署koa项目"><a href="#Docker如何部署koa项目" class="headerlink" title="Docker如何部署koa项目"></a>Docker如何部署koa项目</h2><ol><li>创建Dockerfile文件</li></ol><p>Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker通过docker build执行Dockerfile中的一系列命令自动构建image.<br> 表示过滤该类型的文件。类似git的.gitignore</p><blockquote><p>在.dockerignore文件里面写入代码:</p></blockquote><pre class="line-numbers language-none"><code class="language-none"># Logslogs*.lognpm-debug.log*# Runtime datapids*.pid*.seed# Directory for instrumented libs generated by jscoverage/JSCoverlib-cov# Coverage directory used by tools like istanbulcoverage# nyc test coverage.nyc_output# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files).grunt# node-waf configuration.lock-wscript# Compiled binary addons (http://nodejs.org/api/addons.html)build/Release# Dependency directoriesnode_modulesjspm_packages# Optional npm cache directory.npm# Optional REPL history.node_repl_history.idea.node_modulesnode_modules.vscode<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>在Dockerfile文件中写入一下代码:</p></blockquote><pre class="line-numbers language-none"><code class="language-none">#制定node镜像的版本FROM node:12-alpine#声明作者MAINTAINER FeynmanLoo#移动当前目录下面的文件到app目录下ADD . /app/#进入到app目录下面,类似cdWORKDIR /app#安装依赖RUN npm install#对外暴露的端口EXPOSE 3000#程序启动脚本CMD ["npm", "start"]<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><ol start="2"><li><p>构建镜像</p><p>使用build命令构造镜像,注意后面那个.不能少。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">docker</span> build -t docker_demo <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><blockquote><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust">robin<span class="token punctuation">:</span>docker_demo robin$ docker build <span class="token operator">-</span>t docker_demo <span class="token punctuation">.</span><span class="token class-name">Sending</span> build context to <span class="token class-name">Docker</span> daemon <span class="token number">39</span><span class="token punctuation">.</span>94kB<span class="token class-name">Step</span> <span class="token number">1</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">FROM</span> node<span class="token punctuation">:</span><span class="token number">8.9</span><span class="token operator">-</span>alpine<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> 406f227b21f5<span class="token class-name">Step</span> <span class="token number">2</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">MAINTAINER</span> robin<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> <span class="token class-name">Using</span> cache<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> 78d6cdbcfee2<span class="token class-name">Step</span> <span class="token number">3</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">ADD</span> <span class="token punctuation">.</span> <span class="token operator">/</span>app<span class="token operator">/</span><span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> 2cb30678612d<span class="token class-name">Step</span> <span class="token number">4</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">WORKDIR</span> <span class="token operator">/</span>app<span class="token class-name">Removing</span> intermediate container e51377081039<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> c2b7d0f37d2d<span class="token class-name">Step</span> <span class="token number">5</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">RUN</span> npm install<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> <span class="token class-name">Running</span> <span class="token keyword">in</span> da0c3946ca8dnpm notice created a lockfile <span class="token keyword">as</span> package<span class="token operator">-</span>lock<span class="token punctuation">.</span>json<span class="token punctuation">.</span> <span class="token class-name">You</span> should commit this file<span class="token punctuation">.</span>added <span class="token number">38</span> packages <span class="token keyword">in</span> <span class="token number">3</span><span class="token punctuation">.</span>323s<span class="token class-name">Removing</span> intermediate container da0c3946ca8d<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> eecee87f10e2<span class="token class-name">Step</span> <span class="token number">6</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">EXPOSE</span> <span class="token number">3000</span><span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> <span class="token class-name">Running</span> <span class="token keyword">in</span> f3973cc168a4<span class="token class-name">Removing</span> intermediate container f3973cc168a4<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> 2671a4c6deb4<span class="token class-name">Step</span> <span class="token number">7</span><span class="token operator">/</span><span class="token number">7</span> <span class="token punctuation">:</span> <span class="token constant">CMD</span> <span class="token punctuation">[</span><span class="token string">"npm"</span><span class="token punctuation">,</span> <span class="token string">"start"</span><span class="token punctuation">]</span><span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> <span class="token class-name">Running</span> <span class="token keyword">in</span> dec529f754aa<span class="token class-name">Removing</span> intermediate container dec529f754aa<span class="token operator">-</span><span class="token operator">-</span><span class="token punctuation">-></span> 6ec73793d353<span class="token class-name">Successfully</span> built 6ec73793d353<span class="token class-name">Successfully</span> tagged docker_demo<span class="token punctuation">:</span>latest<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></blockquote></li></ol><p>等待镜像构造完成。然后使用 images命令查看镜像。</p><p><img src="https://s2.loli.net/2022/03/14/D8AuKzYdF5nhycI.jpg" alt="D8AuKzYdF5nhycI"></p><p>此时可以看到images已经构造完成。现在开始启动images,并测试。</p><blockquote><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#启动镜像 -d表示后台执行,-p 9000:3000表示指定本地的9000端口隐射到容器内的3000端口,docker_demo为镜像名称</span><span class="token function">docker</span> run -d -p <span class="token number">9000</span>:3000 docker_demo<span class="token comment">#查看容器</span><span class="token function">docker</span> <span class="token function">ps</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></blockquote><p><img src="https://s2.loli.net/2022/03/14/XOPKFAQYVRvMm3i.jpg" alt="XOPKFAQYVRvMm3i"></p><p>此时浏览器打开<a href="https://links.jianshu.com/go?to=http://localhost:9000/">http://localhost:9000/</a>,如果如图所示。表示容器运行正常。</p><p><img src="https://s2.loli.net/2022/03/14/vGBfboaACP8mV1O.jpg" alt="vGBfboaACP8mV1O"></p><p>如果此时本地无法打开。可以使用log命令查看日志。根据日志修改对应出现的对方。</p><p>到这里,整个基于Koa2框架的项目搭建及Docker部署,到这里结束。</p>]]></content>
<categories>
<category> koa </category>
</categories>
<tags>
<tag> koa </tag>
<tag> nodejs </tag>
<tag> node </tag>
<tag> docker </tag>
</tags>
</entry>
<entry>
<title>红包算法</title>
<link href="/2022/03/11/hong-bao-suan-fa/"/>
<url>/2022/03/11/hong-bao-suan-fa/</url>
<content type="html"><![CDATA[<h2 id="C-实现红包算法"><a href="#C-实现红包算法" class="headerlink" title="C# 实现红包算法"></a>C# 实现红包算法</h2><p><strong>二倍均值法(公平版)</strong></p><p>发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?</p><ol><li>所有人抢到金额之和等于红包金额,不能超过,也不能少于。</li><li>每个人至少抢到一分钱。</li><li>要保证所有人抢到金额的几率相等。</li></ol><p>假设剩余红包金额为M,剩余人数为N,那么有如下公式:</p><blockquote><p>每次抢到的金额 = 随机区间 (0, M / N × 2)</p></blockquote><p>这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。举个例子:</p><blockquote><p>假设有10个人,红包总额100元。100/10×2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。90/9×2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。假设第二个人随机到10元,那么剩余金额是90-10 = 80 元。80/8×2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。以此类推,每一次随机范围的均值是相等的。</p></blockquote><pre class="line-numbers language-c#" data-language="c#"><code class="language-c#">static void Main(string[] args){ for (int i = 0; i < 10; i++) { var list = DivideRedPackage(100* 100, 10); Console.WriteLine(string.Join(",", list)); int count = 0; foreach (var item in list) { count += item; } Console.WriteLine(count); } System.Console.ReadKey();}/// <summary>/// 产生红包数组/// </summary>/// <param name="cashCount">红包总金额,单位分</param>/// <param name="peopleNumber">红包人数</param>/// <returns></returns>static List<int> DivideRedPackage(int cashCount, int peopleNumber){ List<int> redPackageList = new List<int>(); if (cashCount <= peopleNumber) { for (int i = 0; i < cashCount; i++) { redPackageList.Add(1); } return redPackageList; } Random random = new Random(GetRandomSeed()); int restCash = cashCount, restPeople = peopleNumber; for (int i = 0; i < peopleNumber - 1; i++) { var cash = random.Next(1, restCash / restPeople * 2); restCash -= cash; restPeople--; redPackageList.Add(cash); } redPackageList.Add(restCash); return redPackageList;}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>例如,产生的结果如下:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token number">1960,189</span>,234,1763,1211,1236,1340,53,1652,362<span class="token number">10000</span><span class="token number">1032,1380</span>,456,1885,608,857,1541,452,1273,516<span class="token number">10000</span><span class="token number">976,955</span>,749,936,1990,1177,781,325,527,1584<span class="token number">10000</span><span class="token number">794,935</span>,272,216,2034,522,455,2313,2260,199<span class="token number">10000</span><span class="token number">1376,1539</span>,1292,614,443,1874,889,544,821,608<span class="token number">10000</span><span class="token number">914,15</span>,877,1738,604,932,321,983,3106,510<span class="token number">10000</span><span class="token number">659,791</span>,800,1066,788,908,991,2473,495,1029<span class="token number">10000</span><span class="token number">1256,733</span>,1385,667,1192,1237,455,105,2121,849<span class="token number">10000</span><span class="token number">1941,1173</span>,567,1280,1558,618,183,644,133,1903<span class="token number">10000</span><span class="token number">1313,735</span>,1198,1173,1288,522,1879,1155,59,678<span class="token number">10000</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>上述示例中需注意,Random是一个伪随机数生成器,在大多数 Windows 系统上,Random 类 (System) | Microsoft Docs 15 毫秒内创建的对象可能具有相同的种子值。</p><p>因此,如果New Random在循环中使用,就必须提供随机的种子值。</p><p>我们可以使用RNGCryptoServiceProvider 类 (System.Security.Cryptography) | Microsoft Docs类产生随机树种子。</p><p>具体代码如下:</p><pre class="line-numbers language-c#" data-language="c#"><code class="language-c#">/// <summary>/// 产生加密的随机数种子值/// </summary>/// <returns></returns>static int GetRandomSeed(){ byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(bytes); return BitConverter.ToInt32(bytes, 0);}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>线段切割法(手速版)</strong></p><p>算法思路如下:</p><blockquote><p>线段分割法就是把红包总金额想象成一条线段,而每个人抢到的金额,则是这条主线段所拆分出的子线段。<br>当N个人一起抢红包的时候,就需要确定N-1个切割点。<br>因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。<br>随机的范围区间是(1, M)。当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。</p></blockquote><p>需要注意一下两点:</p><ol><li>每个人至少抢到一分钱。</li><li>分割的线段如果重复需要重新切割</li></ol><p>具体代码如下:</p><pre class="line-numbers language-c#" data-language="c#"><code class="language-c#">class Program{ static List<int> DivideRedPackage(int cashCount, int peopleNumber) { List<int> redPackageList = new List<int>(); if (cashCount <= peopleNumber) { for (int i = 0; i < cashCount; i++) { redPackageList.Add(1); } return redPackageList; } Random random = new Random(GetRandomSeed()); int restPeople = peopleNumber; List<int> lineList = new List<int>(); while (restPeople > 1) { var line = random.Next(1, cashCount); if (lineList.Contains(line) == false) { lineList.Add(line); restPeople--; } } lineList.Sort(); redPackageList.Add(lineList[0]); for (int i = 0; i < peopleNumber - 2; i++) { var cash = lineList[i + 1] - lineList[i]; redPackageList.Add(cash); } redPackageList.Add(cashCount - lineList[lineList.Count - 1]); return redPackageList; } static int GetRandomSeed() { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(bytes); return BitConverter.ToInt32(bytes, 0); } static void Main(string[] args) { for (int i = 0; i < 10; i++) { var list = DivideRedPackage(100 * 100, 10); Console.WriteLine(string.Join(",", list)); int count = 0; foreach (var item in list) { count += item; } Console.WriteLine(count); } System.Console.ReadKey(); }}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出结果如下:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token number">409,2233</span>,1843,546,983,679,1621,460,369,857<span class="token number">10000</span><span class="token number">50,472</span>,281,603,577,1007,3929,38,591,2452<span class="token number">10000</span><span class="token number">194,1241</span>,675,209,3507,1714,1199,596,313,352<span class="token number">10000</span><span class="token number">2127,578</span>,16,2413,1332,586,91,260,465,2132<span class="token number">10000</span><span class="token number">1015,1421</span>,963,626,3031,955,171,1112,60,646<span class="token number">10000</span><span class="token number">118,352</span>,1062,1128,8,374,1879,1707,1755,1617<span class="token number">10000</span><span class="token number">2805,592</span>,391,90,1468,392,2201,40,1426,595<span class="token number">10000</span><span class="token number">145,251</span>,2910,59,1065,235,2761,997,1564,13<span class="token number">10000</span><span class="token number">814,1725</span>,1886,39,696,202,44,992,3099,503<span class="token number">10000</span><span class="token number">828,1281</span>,2402,579,380,2246,154,855,564,711<span class="token number">10000</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
<categories>
<category> 算法 </category>
</categories>
<tags>
<tag> 红包 </tag>
<tag> 算法 </tag>
</tags>
</entry>
</search>