遞迴指函式可以直接或間接的呼叫自身。
遞迴函式通常有相同的結構:乙個跳出條件和乙個遞迴體。所謂跳出條件就是根據傳入的引數判斷是否需要停止遞迴,而遞迴體則是函式自身所做的一些處理。
通過迴圈實現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...