Go語言系列開發之延遲呼叫和作用域

2021-09-29 00:03:21 字數 1714 閱讀 4232

好了,話不多說,我們開始今天的分享,今天分享的主題是關於go語言系列中的延遲呼叫和作用域相關的知識。

延遲呼叫defer

在go語言中關鍵字 defer ⽤於延遲乙個函式或者方法(或者當前所建立的匿名函式)的執行。注意,defer語句只能出現在函式或方法的內部。所以我們常用作關閉流處理或則需要進行延期處理的操作。

func main()
defer語句經常被用於處理成對的操作,如開啟、關閉、連線、斷開連線、加鎖、釋放鎖。通過defer機制,不論函式邏輯多複雜,都能保證在任何執行路徑下,資源被釋放。釋放資源的defer應該直接跟在請求資源的語句後。

多個defer執行順序

如果乙個函式中有多個defer語句,它們會以lifo(後進先出)的順序執行。哪怕函式或某個延遲呼叫發生錯誤,這些呼叫依舊會被執⾏。

func test(x int) 

func main()

defer和匿名函式結合使用

小棧君這邊直接為大家舉例說明在匿名函式中使用defer 會有怎樣的效果呢?

func main() (a)

a += 10

b += 100

fmt.printf("a = %d, b = %d\n", a, b)

/*執行結果:

a = 20, b = 120

defer: 10 120

*/}

所以在執行結果上看,使用了defer會先進行傳值,然後是最後才會計算出來

獲取命令列引數

package main

import (

"fmt"

"os"

)func main()

fmt.println("小棧君告訴你實際傳參==》", agers)

}

執行結果如下:

作用域作用域為已宣告識別符號所表示的常量、型別、變數、函式或包在源**中的作用範圍。就好比是你在行車過程中所能夠行使的範圍一樣。

區域性變數

在函式體內宣告的變數、引數和返回值變數就是區域性變數,它們的作用域只在函式體內:

func test(a, b int) 

func main()

//i = 20 //err, i不屬於此作用域

if a := 3; a == 3

//a = 4 //err,a只能if內部使用

}

全域性變數

在函式體外宣告的變數稱之為全域性變數,全域性變數可以在整個包甚至外部包(被匯出後)使用。

var a int //全域性變數的宣告

func test() 

func main()

不同作用域同名變數

在不同作用域可以宣告同名的變數,其訪問原則為:在同乙個作用域內,就近原則訪問最近的變數,如果此作用域沒有此變數宣告,則訪問全域性變數,如果全域性變數也沒有,則報錯。

var a int //全域性變數的宣告

func test01(a float32) 

func main()

fmt.printf("a type = %t\n", a) //a type = uint8

test01(3.14)

test02()

} func test02()

Go語言系列開發之延遲呼叫和作用域

好了,話不多說,我們開始今天的分享,今天分享的主題是關於go語言系列中的延遲呼叫和作用域相關的知識。延遲呼叫defer 在go語言中關鍵字 defer 於延遲乙個函式或者方法 或者當前所建立的匿名函式 的執行。注意,defer語句只能出現在函式或方法的內部。所以我們常用作關閉流處理或則需要進行延期處...

Go語言入門 延遲呼叫 defer

func functionname parameterlist returntypes 語句defer想當前函式註冊乙個稍微執行的函式呼叫,它會在主調函式或者方法返回之前但是其返回值 當返回值存在 計算後執行。存在多個defer語句採用後進先出lifo last in first out 的順序執行...

Go語言優雅設計之 defer 延遲

defer是go語言中的乙個關鍵字,意為 延遲 可以在乙個函式中新增多個defer語句,這些被定義的defer語句會在函式返回時逆序執行。理解和熟練掌握defer的使用會讓我們 更加優雅簡潔。下面舉一例子作簡要介紹 需求 寫一段 開啟乙個檔案並進行某些操作,完成後關閉檔案。不用defer的寫法 fu...