Golang遞迴函式 函式型別 匿名函式和閉包

2021-10-07 03:20:28 字數 1936 閱讀 5863

遞迴指函式可以直接或間接的呼叫自身。

遞迴函式通常有相同的結構:乙個跳出條件和乙個遞迴體。所謂跳出條件就是根據傳入的引數判斷是否需要停止遞迴,而遞迴體則是函式自身所做的一些處理。

通過迴圈實現1+2+3……+100

func test01() int 

return sum

}

通過遞迴實現1+2+3……+100

func test02(num int) int 

return num + test02(num-1) //函式呼叫本身

}

通過遞迴實現1+2+3……+100

func test03(num int) int 

return num + test03(num+1) //函式呼叫本身

}func main()

在go語言中,函式也是一種資料型別,我們可以通過type來定義它,它的型別就是所有擁有相同的引數,相同的返回值的一種型別。

type functype func(int, int) int //宣告乙個函式型別, func後面沒有函式名

//函式中有乙個引數型別為函式型別:f functype

func calc(a, b int, f functype) (result int)

func add(a, b int) int

func minus(a, b int) int

func main()

所謂閉包就是乙個函式「捕獲」了和它在同一作用域的其它常量和變數。這就意味著當閉包被呼叫的時候,不管在程式什麼地方呼叫,閉包能夠使用這些常量或者變數。它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在。

在go語言裡,所有的匿名函式(go語言規範中稱之為函式字面量)都是閉包。匿名函式是指不需要定義函式名的一種函式實現方式。

func main() 

f1() //函式呼叫

//方式1的另一種方式

type functype func() //宣告函式型別, 無參無返回值

var f2 functype = f1

f2() //函式呼叫

//方式2

var f3 functype = func()

f3() //函式呼叫

//方式3

func() () //別忘了後面的(), ()的作用是,此處直接呼叫此匿名函式

//方式4, 匿名函式,有參有返回值

v := func(a, b int) (result int) (1, 1) //別忘了後面的(1, 1), (1, 1)的作用是,此處直接呼叫此匿名函式, 並傳參

fmt.println("v = ", v)

}閉包捕獲外部變數特點:

func main() () //別忘了後面的(), ()的作用是,此處直接呼叫此匿名函式

//外部:i = 100, str = go

fmt.printf("外部:i = %d, str = %s\n", i, str)

}函式返回值為匿名函式:

// squares返回乙個匿名函式,func() int

// 該匿名函式每次被呼叫時都會返回下乙個數的平方。

func squares() func() int

}func main()

函式squares返回另乙個型別為 func() int 的函式。對squares的一次呼叫會生成乙個區域性變數x並返回乙個匿名函式。每次呼叫時匿名函式時,該函式都會先使x的值加1,再返回x的平方。第二次呼叫squares時,會生成第二個x變數,並返回乙個新的匿名函式。新匿名函式操作的是第二個x變數。

通過這個例子,我們看到變數的生命週期不由它的作用域決定:squares返回後,變數x仍然隱式的存在於f中。

Golang 17 遞迴函式

遞迴,就是在執行的過程中呼叫自己。語法格式如下 func recursion func main go 語言支援遞迴。但我們在使用遞迴時,開發者需要設定退出條件,否則遞迴將陷入無限迴圈中。遞迴函式對於解決數學上的問題是非常有用的,就像計算階乘,生成斐波那契數列等。以下例項通過 go 語言的遞迴函式實...

GoLang 函式作為 型別 和 值

示例 package test import fmt testing type testint func int bool func isodd integer int bool return true func iseven integer int bool return false func f...

Golang 中函式作為值與型別

在 go 語言中,我們可以把函式作為一種變數,用 type 去定義它,那麼這個函式型別就可以作為值傳遞,甚至可以實現方法,這一特性是在太靈活了,有時候我們甚至可以利用這一特性進行型別轉換。作為值傳遞的條件是型別具有相同的引數以及相同的返回值。go 語言的型別轉換基本格式如下 type name ex...