Skip to content

Commit 26a614f

Browse files
author
humphreyli
committed
Site updated: 2024-11-15 19:27:59
1 parent d6cf9c1 commit 26a614f

File tree

13 files changed

+23
-13
lines changed

13 files changed

+23
-13
lines changed

about/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ <h1 id="联系方式"><a href="#联系方式" class="headerlink" title="联系
368368
</li>
369369
<li><p>微信:JR_DEC</p>
370370
</li>
371-
<li><p>邮箱:<a href="mailto:&#106;&#114;&#108;&#x65;&#101;&#x31;&#50;&#48;&#x34;&#64;&#49;&#x36;&#x33;&#46;&#99;&#111;&#x6d;">&#106;&#114;&#108;&#x65;&#101;&#x31;&#50;&#48;&#x34;&#64;&#49;&#x36;&#x33;&#46;&#99;&#111;&#x6d;</a></p>
371+
<li><p>邮箱:<a href="mailto:&#x6a;&#114;&#108;&#x65;&#x65;&#x31;&#x32;&#x30;&#52;&#x40;&#x31;&#54;&#51;&#46;&#99;&#111;&#109;">&#x6a;&#114;&#108;&#x65;&#x65;&#x31;&#x32;&#x30;&#52;&#x40;&#x31;&#54;&#51;&#46;&#99;&#111;&#109;</a></p>
372372
</li>
373373
</ul>
374374
<h1 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h1><ul>

atom.xml

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

local-search.xml

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

p/11ded0a8.html

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@
2626
<meta property="og:site_name" content="jrlee&#39;s blog">
2727
<meta property="og:description" content="函数是go语言中最基础的代码块,通常将需要当做一个整体执行的任务抽象成一个函数,例如前面用到的len、cap和append等都是系统定义好的函数。">
2828
<meta property="og:locale" content="zh_CN">
29+
<meta property="og:image" content="http://example.com/p/11ded0a8/1.png">
30+
<meta property="og:image" content="http://example.com/p/11ded0a8/2.png">
31+
<meta property="og:image" content="http://example.com/p/11ded0a8/3.png">
32+
<meta property="og:image" content="http://example.com/p/11ded0a8/4.png">
2933
<meta property="article:published_time" content="2024-11-15T11:18:14.000Z">
3034
<meta property="article:modified_time" content="2024-11-15T11:25:59.295Z">
3135
<meta property="article:author" content="jrlee">
3236
<meta property="article:tag" content="Golang入门">
3337
<meta name="twitter:card" content="summary_large_image">
38+
<meta name="twitter:image" content="http://example.com/p/11ded0a8/1.png">
3439

3540

3641
<meta name="referrer" content="no-referrer-when-downgrade">
@@ -357,7 +362,7 @@ <h1 id="函数声明"><a href="#函数声明" class="headerlink" title="函数
357362

358363
<p>如上所示,声明一个函数addAndSub,该函数有两个返回值,一个是两数之和,一个是两数之差,当有多个返回值时,返回值列表写法可以和参数列表写法一致,在返回值列表中声明了的返回值明,在函数体中可以直接使用,例如变量add和sub在函数体中可以不用重新声明,直接使用即可,返回列表同样还可以只写返回类型,不写具体的变量名,例如<code>func addAndSub(n1 int, n2 int) (int,int)</code>,表示返回两个整形。</p>
359364
<p>运行结果:</p>
360-
365+
<img src="/p/11ded0a8/1.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
361366

362367
<h1 id="函数调用"><a href="#函数调用" class="headerlink" title="函数调用"></a>函数调用</h1><p>函数调用很好理解,例如上面的addAndSub函数,在main函数中调用时直接写函数名即可,需要注意以下几点:</p>
363368
<ol>
@@ -373,22 +378,22 @@ <h1 id="值传递和引用传递"><a href="#值传递和引用传递" class="hea
373378
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;fmt&quot;</span><br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-comment">// 定义局部变量</span><br> num := <span class="hljs-number">1</span><br> fmt.Println(<span class="hljs-string">&quot;改变前num的值:&quot;</span>, num)<br> <span class="hljs-comment">// 将实际参数传递给函数change</span><br> change(num)<br> fmt.Println(<span class="hljs-string">&quot;改变后num的值:&quot;</span>, num)<br>&#125;<br><br><span class="hljs-comment">// 定义一个函数,将传递进来的参数的值变为10</span><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">change</span><span class="hljs-params">(num <span class="hljs-type">int</span>)</span></span> &#123;<br> num = <span class="hljs-number">10</span><br>&#125;<br></code></pre></td></tr></table></figure>
374379

375380
<p>运行结果:</p>
376-
381+
<img src="/p/11ded0a8/2.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
377382

378383
<p>由上可见,由于函数change是值传递,所以在函数内部对参数的改变并不会影响到实际参数,<strong>而且在go语言中默认使用的就是值传递。</strong></p>
379384
<p>引用传递示例:</p>
380385
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;fmt&quot;</span><br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-comment">// 定义局部变量</span><br> num := <span class="hljs-number">1</span><br> fmt.Println(<span class="hljs-string">&quot;改变前num的值:&quot;</span>, num)<br> <span class="hljs-comment">// 将实际参数传递给函数change</span><br> change(&amp;num)<br> fmt.Println(<span class="hljs-string">&quot;改变后num的值:&quot;</span>, num)<br>&#125;<br><br><span class="hljs-comment">// 定义一个函数,将传递进来的参数的值变为10</span><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">change</span><span class="hljs-params">(num *<span class="hljs-type">int</span>)</span></span> &#123;<br> *num = <span class="hljs-number">10</span><br>&#125;<br></code></pre></td></tr></table></figure>
381386

382387
<p>运行结果:</p>
383-
388+
<img src="/p/11ded0a8/3.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
384389

385390
<p>当使用引用传递时,函数的参数类型为<code>*int</code>,在main函数中调用该函数时,传递的是实际参数在内存中的存放地址,因此在change函数中对参数的改变会影响到实际参数。</p>
386391
<h1 id="延迟调用"><a href="#延迟调用" class="headerlink" title="延迟调用"></a>延迟调用</h1><p>在go语言函数中,可以对函数进行延迟调用,延迟调用需要使用到<code>defer</code>关键字,在函数调用前面加上该关键字,则该函数不会立即被调用,而是会延迟调用。</p>
387392
<p>代码示例:</p>
388393
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;fmt&quot;</span><br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-keyword">defer</span> delay()<br> fmt.Println(<span class="hljs-string">&quot;主函数执行...&quot;</span>)<br>&#125;<br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">delay</span><span class="hljs-params">()</span></span> &#123;<br> fmt.Println(<span class="hljs-string">&quot;延迟调用...&quot;</span>)<br>&#125;<br></code></pre></td></tr></table></figure>
389394

390395
<p>运行结果:</p>
391-
396+
<img src="/p/11ded0a8/4.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
392397

393398
<p>如上所示,定义了一个函数<code>delay</code>,虽然该函数在main主函数中的第一行就被调用了,但是该函数中的打印却是在主函数打印出<code>主函数执行</code>后才进行打印,这就是延迟调用,延迟调用会等待主函数都执行完成之后再执行。</p>
394399
<p><strong>如果一个主函数中同时有多个延迟调用,那么最后的执行顺序会按照代码的顺序逆序执行。</strong>例如以下代码:</p>

p/11ded0a8/1.png

25.5 KB
Loading

p/11ded0a8/2.png

39.6 KB
Loading

p/11ded0a8/3.png

32.4 KB
Loading
File renamed without changes.

p/9b186663.html

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@
2626
<meta property="og:site_name" content="jrlee&#39;s blog">
2727
<meta property="og:description" content="相比于Java,在Go语言中没有类的概念,但是多了结构体。结构体与Java中的类很像,是表示一系列同一类型或不同类型的数据构成的数据集合。">
2828
<meta property="og:locale" content="zh_CN">
29+
<meta property="og:image" content="http://example.com/p/9b186663/1.png">
30+
<meta property="og:image" content="http://example.com/p/9b186663/2.png">
31+
<meta property="og:image" content="http://example.com/p/9b186663/3.png">
32+
<meta property="og:image" content="http://example.com/p/9b186663/4.png">
2933
<meta property="article:published_time" content="2024-11-15T11:22:02.000Z">
3034
<meta property="article:modified_time" content="2024-11-15T11:25:31.531Z">
3135
<meta property="article:author" content="jrlee">
3236
<meta property="article:tag" content="Golang入门">
3337
<meta name="twitter:card" content="summary_large_image">
38+
<meta name="twitter:image" content="http://example.com/p/9b186663/1.png">
3439

3540

3641
<meta name="referrer" content="no-referrer-when-downgrade">
@@ -362,14 +367,14 @@ <h1 id="结构体声明"><a href="#结构体声明" class="headerlink" title="
362367
<li>该方法只声明了一个结构体,没有给成员变量赋值,则结构体中所有变量均为默认值。</li>
363368
</ol>
364369
<p>运行结果:</p>
365-
370+
<img src="/p/9b186663/1.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
366371

367372
<h1 id="访问结构体成员"><a href="#访问结构体成员" class="headerlink" title="访问结构体成员"></a>访问结构体成员</h1><p>在上述的代码中,都是直接输出整个结构体,如果需要访问到结构体中的某一个成员变量,或者改变已经声明好的某个成员变量的值,就需要使用到<code>.</code>操作符。</p>
368373
<p>代码示例:</p>
369374
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;fmt&quot;</span><br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-comment">// 声明结构体并赋值</span><br> stu := Student&#123;<span class="hljs-string">&quot;张三&quot;</span>, <span class="hljs-number">18</span>, <span class="hljs-string">&quot;男&quot;</span>, <span class="hljs-string">&quot;大一&quot;</span>&#125;<br> <span class="hljs-comment">// 打印结构体的值</span><br> fmt.Println(<span class="hljs-string">&quot;学生姓名:&quot;</span>, stu.Name)<br> fmt.Println(<span class="hljs-string">&quot;学生年龄:&quot;</span>, stu.Age)<br> fmt.Println(<span class="hljs-string">&quot;学生性别:&quot;</span>, stu.Gender)<br> fmt.Println(<span class="hljs-string">&quot;学生年级:&quot;</span>, stu.Grade)<br> <span class="hljs-comment">// 修改结构体中的值</span><br> stu.Name = <span class="hljs-string">&quot;李四&quot;</span><br> stu.Age = <span class="hljs-number">19</span><br> stu.Gender = <span class="hljs-string">&quot;女&quot;</span><br> stu.Grade = <span class="hljs-string">&quot;大二&quot;</span><br> <span class="hljs-comment">// 打印修改后的结构体的值</span><br> fmt.Println(<span class="hljs-string">&quot;-----------------&quot;</span>)<br> fmt.Println(<span class="hljs-string">&quot;学生姓名:&quot;</span>, stu.Name)<br> fmt.Println(<span class="hljs-string">&quot;学生年龄:&quot;</span>, stu.Age)<br> fmt.Println(<span class="hljs-string">&quot;学生性别:&quot;</span>, stu.Gender)<br> fmt.Println(<span class="hljs-string">&quot;学生年级:&quot;</span>, stu.Grade)<br>&#125;<br><br><span class="hljs-comment">// 定义结构体Student</span><br><span class="hljs-keyword">type</span> Student <span class="hljs-keyword">struct</span> &#123;<br> Name <span class="hljs-type">string</span><br> Age <span class="hljs-type">int</span><br> Gender <span class="hljs-type">string</span><br> Grade <span class="hljs-type">string</span><br>&#125;<br></code></pre></td></tr></table></figure>
370375

371376
<p>运行结果:</p>
372-
377+
<img src="/p/9b186663/2.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
373378

374379
<p>如上所示,使用<code>.</code>操作符可以很方便的访问或者修改结构体中的某一个成员变量。</p>
375380
<h1 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h1><p>在之前的文章中学习过go语言中的函数,其实在go语言中既有函数又有方法,方法就是规定了接受者的函数,接受者就是在函数名称前面多了一个参数,表示将该方法绑定到这个参数对应的类型上,绑定之后该方法就只能被这个参数对应的类型的变量才能够调用。</p>
@@ -381,7 +386,7 @@ <h1 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</
381386

382387
<p>在上述代码中定义了一个print方法,该方法的接受者为Student类型,则该方法与Student类型绑定,也就只能Student类型的变量才能够调用,所以在main中使用<code>stu.print()</code>调用该方法不会有问题,但是在main中无法直接调用该方法,并且使用stu调用该方法时,在方法内部可以拿到stu的成员变量的值。</p>
383388
<p>运行结果: </p>
384-
389+
<img src="/p/9b186663/3.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
385390

386391
<h1 id="结构体指针"><a href="#结构体指针" class="headerlink" title="结构体指针"></a>结构体指针</h1><p>结构体作为一种类型,同样有其对应的指针类型,例如上述例子中的结构体Student,就有其对应的指针类型<code>*Student</code>,可声明一个指针用于存储结构体变量的地址。</p>
387392
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">var</span> stuPointer *Student<br></code></pre></td></tr></table></figure>
@@ -394,7 +399,7 @@ <h1 id="结构体指针"><a href="#结构体指针" class="headerlink" title="
394399
<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;fmt&quot;</span><br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-comment">// 声明结构体并赋值</span><br> stu := Student&#123;<span class="hljs-string">&quot;张三&quot;</span>, <span class="hljs-number">18</span>, <span class="hljs-string">&quot;男&quot;</span>, <span class="hljs-string">&quot;大一&quot;</span>&#125;<br> <span class="hljs-comment">// 定义结构体指针</span><br> <span class="hljs-keyword">var</span> stuPointer *Student<br> <span class="hljs-comment">// 将结构体地址赋值给指针</span><br> stuPointer = &amp;stu<br> <span class="hljs-comment">// 结构体指针通过点(.)操作符访问成员变量</span><br> fmt.Println(<span class="hljs-string">&quot;姓名:&quot;</span>, stuPointer.Name)<br> fmt.Println(<span class="hljs-string">&quot;年龄:&quot;</span>, stuPointer.Age)<br> fmt.Println(<span class="hljs-string">&quot;性别:&quot;</span>, stuPointer.Gender)<br> fmt.Println(<span class="hljs-string">&quot;年级:&quot;</span>, stuPointer.Grade)<br>&#125;<br><br><span class="hljs-keyword">type</span> Student <span class="hljs-keyword">struct</span> &#123;<br> Name <span class="hljs-type">string</span><br> Age <span class="hljs-type">int</span><br> Gender <span class="hljs-type">string</span><br> Grade <span class="hljs-type">string</span><br>&#125;<br></code></pre></td></tr></table></figure>
395400

396401
<p>运行结果:</p>
397-
402+
<img src="/p/9b186663/4.png" srcset="/img/loading.gif" lazyload class="" title="运行结果">
398403

399404
<p>同样可以使用结构体指针加<code>.</code>操作符修改成员变量。</p>
400405

p/9b186663/1.png

33.8 KB
Loading

0 commit comments

Comments
 (0)