<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 延遲函數可能操作主函數的具名返回值 定義defer的函數,即主函數可能有返回值,返回值有沒有名字沒有關系,defer所作用的函數,即延遲函數可能會影響到返回值 ### 1 函數返回過程 有一個事實必須要了解,關鍵字*return*不是一個原子操作,實際上*return*只代理匯編指令*ret*,即將跳轉程序執行。比如語句`return i`,實際上分兩步進行,即將i值存入棧中作為返回值,然后執行跳轉,而defer的執行時機正是跳轉前,所以說defer執行時還是有機會操作返回值的。 舉個實際的例子進行說明這個過程: ~~~go func deferFuncReturn() (result int) { i := 1 defer func() { result++ }() return i } ~~~ 該函數的return語句可以拆分成下面兩行: ~~~go result = i return ~~~ 而延遲函數的執行正是在return之前,即加入defer后的執行過程如下: ~~~go result = i result++ return ~~~ 所以上面函數實際返回i++值。 ### 2 主函數擁有匿名返回值,返回字面值 一個主函數擁有一個匿名的返回值,返回時使用字面值,比如返回”1”、”2”、”Hello”這樣的值,這種情況下defer語句是無法操作返回值的。 一個返回字面值的函數,如下所示: ~~~go func foo() int { var i int defer func() { i++ }() return 1 } ~~~ 上面的return語句,直接把1寫入棧中作為返回值,延遲函數無法操作該返回值,所以就無法影響返回值 ### 3 主函數擁有匿名返回值,返回變量 一個主函數擁有一個匿名的返回值,返回使用本地或全局變量,這種情況下defer語句可以引用到返回值,但不會改變返回值。 一個返回本地變量的函數,如下所示: ~~~go func foo() int { var i int defer func() { i++ }() return i } ~~~ 上面的函數,返回一個局部變量,同時defer函數也會操作這個局部變量。對于匿名返回值來說,可以假定仍然有一個變量存儲返回值,假定返回值變量為”anony”,上面的返回語句可以拆分成以下過程: ~~~go anony = i i++ return ~~~ 由于i是整型,會將值拷貝給anony,所以defer語句中修改i值,對函數返回值不造成影響 ### 4 主函數擁有具名返回值 主函聲明語句中帶名字的返回值,會被初始化成一個局部變量,函數內部可以像使用局部變量一樣使用該返回值。如果defer語句操作該返回值,可能會改變返回結果。 一個影響函返回值的例子: ~~~go func foo() (ret int) { defer func() { ret++ }() return 0 } ~~~ 上面的函數拆解出來,如下所示: ~~~go ret = 0 ret++ return ~~~ 函數真正返回前,在defer中對返回值做了+1操作,所以函數最終返回1
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看