Hello,各位小伙伴大家好,我是小堆疊君,最近一段時間我們將繼續分享關于go語言基礎系列,當然后期小堆疊君已經在籌劃關于java、Python,資料分析、人工智能和大資料等相關系列文章,希望能和大家一起學習進步,相互提高,
好了,話不多說,我們開始今天的分享,今天分享的主題是關于go語言系列中的延遲呼叫和作用域相關的知識,
延遲呼叫defer
在go語言中關鍵字 defer ?于延遲一個函式或者方法(或者當前所創建的匿名函式)的執行,注意,defer陳述句只能出現在函式或方法的內部,所以我們常用作關閉流處理或則需要進行延期處理的操作,
func main() {
defer fmt.Println("小堆疊君在測驗defer") //main結束前呼叫
fmt.Println("this is a test")
/*
運行結果:
this is a test
小堆疊君在測驗defer
*/
}
defer陳述句經常被用于處理成對的操作,如打開、關閉、連接、斷開連接、加鎖、釋放鎖,通過defer機制,不論函式邏輯多復雜,都能保證在任何執行路徑下,資源被釋放,釋放資源的defer應該直接跟在請求資源的陳述句后,
多個defer執行順序
如果一個函式中有多個defer陳述句,它們會以LIFO(后進先出)的順序執行,哪怕函式或某個延遲呼叫發生錯誤,這些呼叫依舊會被執?,
func test(x int) {
fmt.Println(10 / x)//x為0時,產生例外
}
func main() {
defer fmt.Println("111")
defer fmt.Println("222")
defer test(0)
defer fmt.Println("333")
/*
運行結果:
333
222
111
panic: runtime error: integer divide by zero
*/
}
defer和匿名函式結合使用
小堆疊君這邊直接為大家舉例說明在匿名函式中使用defer 會有怎樣的效果呢?
func main() {
a, b := 10, 20
defer func(x int) { // a以值傳遞方式傳給x
fmt.Println("defer:", x, b) // b 閉包參考
}(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() {
// IT小堆疊君
agers := os.Args
// 如果用戶輸入不正確或個數不對 則提醒
if agers != nil && len(agers) < 2 {
fmt.Println("小堆疊君提醒你,您輸入的位數不正確~")
return
}
fmt.Println("小堆疊君告訴你實際傳參==》", agers)
}
運行結果如下:

作用域
作用域為已宣告識別符號所表示的常量、型別、變數、函式或包在源代碼中的作用范圍,就好比是你在行車程序中所能夠行使的范圍一樣,
區域變數
在函式體內宣告的變數、引數和回傳值變數就是區域變數,它們的作用域只在函式體內:
func test(a, b int) {
var c int
a, b, c = 1, 2, 3
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
func main() {
//a, b, c = 1, 2, 3 //err, a, b, c不屬于此作用域
{
var i int
i = 10
fmt.Printf("i = %d\n", i)
}
//i = 20 //err, i不屬于此作用域
if a := 3; a == 3 {
fmt.Println("a = ", a)
}
//a = 4 //err,a只能if內部使用
}
全域變數
在函式體外宣告的變數稱之為全域變數,全域變數可以在整個包甚至外部包(被匯出后)使用,
var a int //全域變數的宣告
func test() {
fmt.Printf("test a = %d\n", a)
}
func main() {
a = 10
fmt.Printf("main a = %d\n", a) //main a = 10
test() //test a = 10
}
不同作用域同名變數
在不同作用域可以宣告同名的變數,其訪問原則為:在同一個作用域內,就近原則訪問最近的變數,如果此作用域沒有此變數宣告,則訪問全域變數,如果全域變數也沒有,則報錯,
var a int //全域變數的宣告
func test01(a float32) {
fmt.Printf("a type = %T\n", a) //a type = float32
}
func main() {
fmt.Printf("a type = %T\n", a) //a type = int, 說明使用全域變數的a
var a uint8 //區域變數宣告
{
var a float64 //區域變數宣告
fmt.Printf("a type = %T\n", a) //a type = float64
}
fmt.Printf("a type = %T\n", a) //a type = uint8
test01(3.14)
test02()
}
func test02() {
fmt.Printf("a type = %T\n", a) //a type = int
}
今天的分享就到這里就結束啦,如果你喜歡我的分享,麻煩你點擊再看,分享或留言,我是小堆疊君,我們下期見,拜了個拜~

本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69343.html
標籤:Go
上一篇:圖圖小淘氣 有著許多的問題
下一篇:頁面跳轉63342并且404
