go語言中的defer關(guān)鍵字
我是誰
defer - 顧名思義翻譯過來叫 延遲, 所以我們通常稱呼 defer func() 這樣 defer 后面緊跟的函數(shù)為 延遲函數(shù).
作者注: 不過從實(shí)際應(yīng)用來講, 延遲函數(shù)通常用來做一些函數(shù)最終返回前的一些收尾工作, 所以稱呼為收尾函數(shù)其實(shí)更貼切.
三圍幾何
defer 有其獨(dú)特的一面, 了解其個(gè)性, 才能更好的下手。
延遲性
顧名思義, 既然叫延遲函數(shù), 那么肯定具備延遲性.
我們來看看怎么個(gè)延遲法,
defer_defer.go
// defer_defer.go
package main
import (
"fmt"
)
func main() {
foo()
}
func foo() {
fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
}
// go run defer_defer.go
// 1
// 3
// 2
可以看到 defer 定義的延遲函數(shù)最后才執(zhí)行.
再來個(gè)例子, 如果一個(gè)函數(shù)內(nèi)出現(xiàn)多個(gè)延遲函數(shù), 延遲函數(shù)的執(zhí)行順序又是怎么樣的呢?
defer_filo.go
// defer_filo.go
package main
import (
"fmt"
)
func main() {
foo()
}
func foo() {
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
}
// go run defer_filo.go
// 3
// 2
// 1可以看到先定義的延遲函數(shù)后執(zhí)行, 后定義的延遲函數(shù)先執(zhí)行, 符合棧 (stack) 的先進(jìn)后出 (FILO) 原則.
影響性
直接看代碼,
defer_impact.go
// defer_impact.go
package main
import (
"fmt"
)
func main() {
fmt.Println(foo())
}
func foo() (result int) {
defer func() {
result++
}()
return 0
}
// go run defer_defer.go
// 1結(jié)果是不是跟想象有點(diǎn)不一樣? 上述 foo() 可以改寫為下:
func foo() (result int) {
result = 0
result++
return
}go 中的 return 語句不是原子操作.
go 中 return 語句的操作過程為:
- 設(shè)置返回值
- 執(zhí)行延遲函數(shù)
- 真正
return
所以延遲函數(shù)會(huì)影響主函數(shù)的返回值, 當(dāng)然還要區(qū)分具名返回值/匿名返回值, 后話再說.
確定性
延遲函數(shù)的參數(shù)值, 在延遲函數(shù)首次出現(xiàn)時(shí)就確定了, 不受后續(xù)操作的影響.
我們來個(gè)例子:
defer_parameters.go
// defer_parameters.go
package main
import (
"fmt"
)
func main() {
foo()
}
func foo() {
number := 1
defer fmt.Println(number)
number = 2
return
}
// go run defer_parameters.go
// 1能做啥
- 打開數(shù)據(jù)鏈接, 要記得關(guān)閉, 可以用
defer - 操作完內(nèi)存資源, 要記得釋放, 可以用
defer - 想改變主函數(shù)的具名返回值, 可以用
defer- 通常不會(huì)這么干 - 想奇淫技巧, 可以用
defer- 偶爾 show 偶爾爽, 一直 show 一直爽 - 想搞事情, 可以用
defer- 請自行確保生命和財(cái)產(chǎn)安全 - ...
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)
golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
Golang的循環(huán)中break和continue語句的用法講解
這篇文章主要介紹了Golang的循環(huán)中break和continue語句的用法講解,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
go語言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)
本文主要介紹了go語言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

