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

簡單聊聊Golang中defer預計算參數(shù)

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

什么是defer

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

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

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

try{
}finally{
}

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

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

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 

運行結果并不符合我們的預期,這個現(xiàn)象背后的原因是什么呢?經過分析,我們會發(fā)現(xiàn)調用 defer 關鍵字會立刻拷貝函數(shù)中引用的外部參數(shù),所以 time.Since(startedAt) 的結果不是在 main 函數(shù)退出之前計算的,而是在 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右邊最外層函數(shù)的參數(shù)計算完畢,并傳遞進函數(shù)里,但不會執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回。我們先看會把defer右邊最外層函數(shù)的參數(shù)計算完畢,并傳遞進函數(shù)里這句話,對應例子就是先把test(i)算出來,此時i=1,計算test(1)得2,然后fmt.Println(2)入棧,等到最后程序運行完了再運行defer結果就是2(但不會執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回)。

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

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  

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

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

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

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預計算參數(shù)的文章就介紹到這了,更多相關Go defer預計算參數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

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

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

    Go Web框架gin的入門教程

    本篇文章主要介紹了Go Web框架gin的入門教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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語言函數(shù)的延遲調用(Deferred Code)詳解

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

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

    go語言中context的使用說明

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

    Go實現(xiàn)快速生成固定長度的隨機字符串

    這篇文章主要為大家詳細介紹了怎樣在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

最新評論

固安县| 江都市| 长治市| 肇州县| 宜都市| 贺州市| 永福县| 竹溪县| 舒兰市| 曲周县| 贵定县| 广东省| 枞阳县| 普陀区| 鄯善县| 松阳县| 张家川| 重庆市| 桃园市| 微山县| 青川县| 溧水县| 忻城县| 静安区| 卫辉市| 三台县| 延川县| 容城县| 通山县| 郁南县| 永宁县| 新源县| 古交市| 长治县| 海兴县| 桃园市| 喀什市| 子洲县| 措美县| 吉隆县| 岳阳县|