1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      go語言外部參數(shù) go編譯參數(shù)

      簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)

      什么是defer

      創(chuàng)新互聯(lián)建站2013年至今,先為平房等服務(wù)建站,平房等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為平房企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

      defer 可以保證方法可以在外圍函數(shù)返回之前調(diào)用。有點(diǎn)像其他言的 try finally

      Go語言defer預(yù)計(jì)算參數(shù)

      Go 語言中所有的函數(shù)調(diào)用都是傳值的,雖然 defer 是關(guān)鍵字,但是也繼承了這個(gè)特性。假設(shè)我們想要計(jì)算 main 函數(shù)運(yùn)行的時(shí)間,可能會(huì)寫出以下的代碼:

      結(jié)果是:

      運(yùn)行結(jié)果并不符合我們的預(yù)期,這個(gè)現(xiàn)象背后的原因是什么呢?經(jīng)過分析,我們會(huì)發(fā)現(xiàn)調(diào)用 defer 關(guān)鍵字會(huì)立刻拷貝函數(shù)中引用的外部參數(shù),所以 time.Since(startedAt) 的結(jié)果不是在 main 函數(shù)退出之前計(jì)算的,而是在 defer 關(guān)鍵字調(diào)用時(shí)計(jì)算的【defer入棧的時(shí)候】,最終導(dǎo)致上述代碼輸出 0s

      我們?cè)賮砜磦€(gè)簡(jiǎn)單例子來說明上述解釋:

      當(dāng)代碼運(yùn)行到defer fmt.Println(test(i))的時(shí)候,會(huì)把defer右邊最外層函數(shù)的參數(shù)計(jì)算完畢,并傳遞進(jìn)函數(shù)里,但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回。我們先看會(huì)把defer右邊最外層函數(shù)的參數(shù)計(jì)算完畢,并傳遞進(jìn)函數(shù)里這句話,對(duì)應(yīng)例子就是先把test(i)算出來,此時(shí)i=1,計(jì)算test(1)得2,然后fmt.Println(2)入棧,等到最后程序運(yùn)行完了再運(yùn)行defer結(jié)果就是2(但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回)。

      我們?cè)賮砜匆粋€(gè)例子與匿名函數(shù)結(jié)合:

      結(jié)果:

      使用匿名函數(shù),結(jié)果是101,相當(dāng)于i給到test方法的是100,那為什么呢?還是那句話:但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回

      也就是說他會(huì)把整個(gè){ fmt.Println(test(i)) }()函數(shù)體入棧,等到最后程序運(yùn)行完了再運(yùn)行defer,此時(shí)的i是100,運(yùn)行test后就是101了。

      所以你要解決第一個(gè)打印為0s的問題,你就可以使用匿名函數(shù)來解決,如下:

      結(jié)果:

      Go 函數(shù)參數(shù)傳遞詳解

      前言:go語言函數(shù)參數(shù)為值拷貝(指針參數(shù)為指針拷貝)。

      在go語言中,函數(shù)也作為一種數(shù)據(jù)類型,所以函數(shù)也可以作為函數(shù)的參數(shù)來使用。

      其中slice是為地址數(shù)組指針的拷貝??,持續(xù)更新中 ....

      怎么樣使用Go語言中函數(shù)的參數(shù)傳遞與調(diào)用

      按值傳遞函數(shù)參數(shù),是拷貝參數(shù)的實(shí)際值到函數(shù)的形式參數(shù)的方法調(diào)用。在這種情況下,參數(shù)在函數(shù)內(nèi)變化對(duì)參數(shù)不會(huì)有影響。

      默認(rèn)情況下,Go編程語言使用調(diào)用通過值的方法來傳遞參數(shù)。在一般情況下,這意味著,在函數(shù)內(nèi)碼不能改變用來調(diào)用所述函數(shù)的參數(shù)。考慮函數(shù)swap()的定義如下。

      代碼如下:

      /* function definition to swap the values */

      func swap(int x, int y) int {

      var temp int

      temp = x /* save the value of x */

      x = y /* put y into x */

      y = temp /* put temp into y */

      return temp;

      }

      現(xiàn)在,讓我們通過使實(shí)際值作為在以下示例調(diào)用函數(shù)swap():

      代碼如下:

      package main

      import "fmt"

      func main() {

      /* local variable definition */

      var a int = 100

      var b int = 200

      fmt.Printf("Before swap, value of a : %d\n", a )

      fmt.Printf("Before swap, value of b : %d\n", b )

      /* calling a function to swap the values */

      swap(a, b)

      fmt.Printf("After swap, value of a : %d\n", a )

      fmt.Printf("After swap, value of b : %d\n", b )

      }

      func swap(x, y int) int {

      var temp int

      temp = x /* save the value of x */

      x = y /* put y into x */

      y = temp /* put temp into y */

      return temp;

      }

      讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生以下結(jié)果:

      Before swap, value of a :100

      Before swap, value of b :200

      After swap, value of a :100

      After swap, value of b :200

      這表明,參數(shù)值沒有被改變,雖然它們已經(jīng)在函數(shù)內(nèi)部改變。

      通過傳遞函數(shù)參數(shù),即是拷貝參數(shù)的地址到形式參數(shù)的參考方法調(diào)用。在函數(shù)內(nèi)部,地址是訪問調(diào)用中使用的實(shí)際參數(shù)。這意味著,對(duì)參數(shù)的更改會(huì)影響傳遞的參數(shù)。

      要通過引用傳遞的值,參數(shù)的指針被傳遞給函數(shù)就像任何其他的值。所以,相應(yīng)的,需要聲明函數(shù)的參數(shù)為指針類型如下面的函數(shù)swap(),它的交換兩個(gè)整型變量的值指向它的參數(shù)。

      代碼如下:

      /* function definition to swap the values */

      func swap(x *int, y *int) {

      var temp int

      temp = *x /* save the value at address x */

      *x = *y /* put y into x */

      *y = temp /* put temp into y */

      }

      現(xiàn)在,讓我們調(diào)用函數(shù)swap()通過引用作為在下面的示例中傳遞數(shù)值:

      代碼如下:

      package main

      import "fmt"

      func main() {

      /* local variable definition */

      var a int = 100

      var b int= 200

      fmt.Printf("Before swap, value of a : %d\n", a )

      fmt.Printf("Before swap, value of b : %d\n", b )

      /* calling a function to swap the values.

      * a indicates pointer to a ie. address of variable a and

      * b indicates pointer to b ie. address of variable b.

      */

      swap(a, b)

      fmt.Printf("After swap, value of a : %d\n", a )

      fmt.Printf("After swap, value of b : %d\n", b )

      }

      func swap(x *int, y *int) {

      var temp int

      temp = *x /* save the value at address x */

      *x = *y /* put y into x */

      *y = temp /* put temp into y */

      }

      讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生以下結(jié)果:

      Before swap, value of a :100

      Before swap, value of b :200

      After swap, value of a :200

      After swap, value of b :100

      這表明變化的功能以及不同于通過值調(diào)用的外部體現(xiàn)的改變不能反映函數(shù)之外。


      分享文章:go語言外部參數(shù) go編譯參數(shù)
      分享鏈接:http://www.ef60e0e.cn/article/hhdsgj.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        河北区| 米脂县| 醴陵市| 茶陵县| 鄱阳县| 天气| 崇礼县| 梅河口市| 聊城市| 秦安县| 文昌市| 澄江县| 思茅市| 高州市| 稻城县| 永定县| 雅江县| 伽师县| 区。| 定南县| 辽宁省| 仙居县| 特克斯县| 临沂市| 房产| 乡城县| 富源县| 深泽县| 岚皋县| 柘荣县| 阿拉善右旗| 宝山区| 惠安县| 大余县| 南京市| 新龙县| 普洱| 响水县| 河北区| 车险| 黄冈市|