Go語言匿名函式困惑

2021-08-14 06:28:03 字數 1278 閱讀 5380

這裡主要是描述我在學習過程中遇到的困惑。起初把函式單獨寫出來,想用普通函式那種寫好後再去main方法中呼叫,老是報錯。如下圖:

真正的使用方法,要深刻體會匿名函式的緣由,它只是為了少數的幾次呼叫,又不想命名太多造成命名衝突,就使用一邊建構函式一邊使用的情況,不能單獨脫離呼叫來構造。

1-宣告乙個匿名函式

func(引數列表) 返回值列表 ()

//有引數,在括號裡加引數

func(arge int) (2)

//也可以先賦給乙個變數再呼叫

a := func() int

a()}程式輸出:

func 1

func 2

func 3

2.乙個綜合性的例子(閉包)——go的匿名函式是乙個閉包

func main()  

}()

a()

j *=2

a()

}

程式輸出:

i, j: 3, 12

i, j: 3, 24

在上面的例子中,變數a指向的閉包函式引用了區域性變數i和j,i的值被隔離,在閉包外不能被修改,改變j的值以後,再次呼叫a,發現結果是修改過的值。

在變數a指向的閉包函式中,只有內部的匿名函式才能訪問變數i,而無法通過其他途徑訪問到,因此保證了i的安全性。

補充說明一下《閉包》的相關知識如下三個方面說:

(1)基本概念

閉包是可以包含自由(未繫結到特定物件)變數的**塊,這些變數不在這個**塊內或者任何全域性上下文中定義,而是在定義**塊的環境中定義。要執行的**塊(由於自由變數包含在**塊中,所以這些自由變數以及它們引用的物件沒有被釋放)為自由變數提供繫結的計算環境(作用域)。

(2)閉包的意義

閉包的價值在於可以作為函式物件或者匿名函式,對於型別系統而言,這意味著不僅要表示資料還要表示**。支援閉包的多數語言都將函式作為第一級物件,就是說這些函式可以儲存到變數中作為引數傳遞給其他函式,最重要的是能夠被函式動態建立和返回。

(3)go語言中使用閉包

go語言中的閉包同樣也會引用到函式外的變數。閉包的實現確保只要閉包還被使用,那麼被閉包引用的變數會一直存在。

go語言的匿名函式

1 宣告乙個匿名函式 func 引數列表 返回值列表 有引數,在括號裡加引數 func arge int 2 也可以先賦給乙個變數再呼叫 a func int a 程式輸出 func 1 func 2 func 3 func main a j 2 a 程式輸出 i,j 10,5 i,j 10,10 ...

go語言匿名函式使用

介紹 go語言支援匿名函式,顧名思義你們那個函式就是沒有名字得函式,如果某個函式只使用一次,考慮使用匿名函式,匿名函式也可以多次呼叫。匿名函式使用方式 1 在定義匿名函式得時候直接呼叫,這種匿名函式只能使用一次 func main 10 20 fmt.println res1 res1 將乙個匿名函...

go語言defer與匿名函式

學習go語言的時候,遇到了乙個例子 func main defer func a int a a 0 a 1 a 2 a 3 defer func 這裡定義了乙個匿名函式,該匿名函式由defer修飾,意味著,該函式會在主函式return之後,執行,所有被defer修飾的函式會被壓入棧中,先被修飾的後...