函數的功能
- 是一種對一組輸入,輸出進行模板化的重要工具,比接口類型更加輕量級,靈活
- 函數主要用于封裝代碼塊,分割功能,解耦邏輯,由于夠支持頭等函數,所以還可以化身為普通函數,在其他函數間傳遞,賦值變量,做類型判斷和轉換(函數值可當成隨意傳播的獨立組建)
頭等公民
支持頭等函數的編程語言,可以把函數賦值給變量,也可以把函數作為其他函數的參數或返回值,go語言支持這種機制,故稱為頭等函數。
函數簽名
函數簽名是指函數的參數列表+結果列表的統稱,只要參數列表+結果列表一致即可認為函數簽名相同,主要用于鑒別不同函數的特征,同事也定義了我們與函數的交互方式(即怎么使用函數)
高階函數
高階函數是指滿足 接受其他的函數作為參數傳入或 把其他的函數作為結果返回即可認為是高階函數
閉包函數
若一個函數引用的自由變量,并被當做參數或結果使用,則此函數被稱為閉包函數
自由變量是指變量不在函數的參數或結果中,也不再函數體中聲明,是外部變量的引用,則此變量在閉包中被稱為自由變量
61f3689a0023e83407ccae081cdd8108.png
閉包的意義? 表面上看僅僅是延遲實現了一部分程序的邏輯或功能而已,實際上,我們是在動態的生成部分程序邏輯
案例-斐波那契
// 1 1 2 3 5 8
func fibonacci()func()int{
a,b :=0,1
return func()int{
a,b = b,a+b
return b
}
}
案例-函數實現接口
type Reader interface{
Read()
}
type MyReader func()
func(m MyReader) Read(){
fmt.Println("hello")
}
func PrintReader(r Reader){
r.Read()
}
func main(){
var m MyReader
PrintReader(m)
}
案例-左右遍歷
type Node struct{
left *Node
name string
right *Node
}
func(n *Node) Traverse(){
if n == nil{
return
}
n.left.Traverse()
fmt.Println(n.name)
n.right.Traverse()
}
func main(){
n := Node{
name:"parent",
left:&Node{name:"left"},
right:&Node{name:"right"},
}
n.Traverse()
}