最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單聊聊Golang中defer預計算參數

 更新時間:2022年03月25日 16:53:18   作者:藍色記憶  
在golang當中defer代碼塊會在函數調用鏈表中增加一個函數調用,下面這篇文章主要給大家介紹了關于Golang中defer預計算參數的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

什么是defer

defer用來聲明一個延遲函數,把這個函數放入到一個棧上, 當外部的包含方法return之前,返回參數到調用方法之前調用,也可以說是運行到最外層方法體的"}"時調用。我們經常用他來做一些資源的釋放,比如關閉io操作

func doSomething(fileName string) {
    file,err := os.Open(fileName)
    if err != nil {
    panic(err)
    }
    defer file.Close()
}

defer 可以保證方法可以在外圍函數返回之前調用。有點像其他言的 try finally

try{
}finally{
}

Go語言defer預計算參數

Go 語言中所有的函數調用都是傳值的,雖然 defer 是關鍵字,但是也繼承了這個特性。假設我們想要計算 main 函數運行的時間,可能會寫出以下的代碼:

package main
import (
	"fmt"
	"time"
)

func main() {
	startedAt := time.Now()
	defer fmt.Println(time.Since(startedAt))
	time.Sleep(time.Second) //休眠一秒
} 

結果是:

D:\workspace\go\src\test>go run main.go
0s 

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

我們再來看個簡單例子來說明上述解釋:

package main
import (
	"fmt"
)

func main() {
	i := 1
	defer fmt.Println(test(i))
	i = 100
}

func test(i int) int {
	i = i + 1
	return i
} 

D:\workspace\go\src\test>go run main.go
2 

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

我們再來看一個例子與匿名函數結合:

package main
import (
	"fmt"
)

func main() {
	i := 1
	defer func() {
		fmt.Println(test(i))
	}()
	i = 100
}

func test(i int) int {
	i = i + 1
	return i
} 

結果:

D:\workspace\go\src\test>go run main.go
101  

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

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

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

package main
import (
	"fmt"
	"time"
)

func main() {
	startedAt := time.Now()
	defer func() {
		fmt.Println(time.Since(startedAt))
	}()
	time.Sleep(time.Second) //休眠一秒
} 

結果:

D:\workspace\go\src\test>go run main.go
1.0152825s

總結

到此這篇關于Golang中defer預計算參數的文章就介紹到這了,更多相關Go defer預計算參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang?官方依賴注入工具wire示例詳解

    Golang?官方依賴注入工具wire示例詳解

    這篇文章主要為大家介紹了Golang?官方依賴注入工具wire示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 詳解Gotorch多機定時任務管理系統(tǒng)

    詳解Gotorch多機定時任務管理系統(tǒng)

    遵循著“學一門語言最好的方式是使用它”的理念,想著用Go來實現些什么,剛好有一個比較讓我煩惱的問題,于是用Go解決一下,即使不在生產環(huán)境使用,也可以作為Go語言學習的一種方式。
    2021-05-05
  • Go Web框架gin的入門教程

    Go Web框架gin的入門教程

    本篇文章主要介紹了Go Web框架gin的入門教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    這篇文章主要給大家介紹了關于golang中不允許循環(huán)import問題("import cycle not allowed")的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08
  • go開源Hugo站點渲染之模板詞法解析

    go開源Hugo站點渲染之模板詞法解析

    這篇文章主要為大家介紹了go開源Hugo站點渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 淺談goland導入自定義包時出錯(一招解決問題)

    淺談goland導入自定義包時出錯(一招解決問題)

    這篇文章主要介紹了淺談goland導入自定義包時出錯(一招解決問題),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言函數的延遲調用(Deferred Code)詳解

    Go語言函數的延遲調用(Deferred Code)詳解

    本文將介紹Go語言函數和方法中的延遲調用,正如名稱一樣,這部分定義不會立即執(zhí)行,一般會在函數返回前再被調用,我們通過一些示例來了解一下延遲調用的使用場景
    2022-07-07
  • go語言中context的使用說明

    go語言中context的使用說明

    Go語言中的Context是用于在多個函數或goroutine之間傳遞取消信號、超時控制、截止時間和請求范圍數據的重要概念,它提供了更好的控制和管理,適用于并發(fā)編程中需要傳遞狀態(tài)或進行資源清理的場景
    2024-12-12
  • Go實現快速生成固定長度的隨機字符串

    Go實現快速生成固定長度的隨機字符串

    這篇文章主要為大家詳細介紹了怎樣在Go中簡單快速地生成固定長度的隨機字符串,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以學習一下
    2022-10-10
  • golang 定時任務方面time.Sleep和time.Tick的優(yōu)劣對比分析

    golang 定時任務方面time.Sleep和time.Tick的優(yōu)劣對比分析

    這篇文章主要介紹了golang 定時任務方面time.Sleep和time.Tick的優(yōu)劣對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05

最新評論

碌曲县| 永新县| 祁连县| 遂平县| 浦北县| 石阡县| 鄂尔多斯市| 宁强县| 普陀区| 常德市| 武冈市| 榆中县| 桦甸市| 十堰市| 临清市| 乌鲁木齐县| 扎囊县| 白银市| 凌云县| 辉南县| 垦利县| 蓬安县| 彭泽县| 罗源县| 新余市| 桃江县| 澳门| 芷江| 松江区| 尚志市| 吉首市| 迁西县| 溆浦县| 晋州市| 富顺县| 阜南县| 皮山县| 长乐市| 洪湖市| 四会市| 铁岭县|