Go 頭等函數和延遲函數

頭等函數

可以把函數賦值給變量,可以把函數作爲其他函數的參數或者返回值,就是Go中頭等函數的機制。

Func main(){
	a := func(){
		print
	}
	a()
}

匿名函數

a函數沒有名稱,這類函數稱爲匿名函數。

自定義函數類型

通過以下語法自定義函數類型:

type add func(a int ,b int) int

使用:

Func main(){
	var a add = func(a int, b int) int{
		return a + b
	}
	s := a(5, 6)
	print s
}

將自定義函數類型賦值給a,之後可以調用a。

高階函數

高階函數滿足下列之一定義:

  • 接收一個或多個函數作爲參數
  • 返回值是一個函數
Func simple(a func(a, b int) int){
	print a(60, 7)
}

Func main(){
	f := func (a, b int) int{
		return a + b
	}
	simple(f)
}

返回函數

func fimple() func(a, b int) int{
	f := func(a, b int) int{
		return a +b
	}
	return f
}

func main(){
	s := simple()
	print s(60, 7)
}

閉包

閉包是匿名函數一個特例,當一個匿名函數所訪問的變量定義在函數體外部時,這樣的匿名函數稱爲閉包。

func main(){
	a := 5
	func() {
		print a
	}()
}

上面例子中在匿名函數中訪問了變量a,a存在匿名函數外部,這個匿名函數就是閉包。

每個閉包都會綁定一個它自己的外圍變量。

延遲函數(defer)

含有defer語句的函數,會在方法返回之前,調用defer修飾的函數。

func finished(){
	print 111
}

func largest(){
	defer finished()
	print 222
}

執行結果爲:222,111

Largest方法開始執行,在largest方法返回之前會調用defer修飾的finished方法。

延遲函數的參數求值是在主函數順序執行到defer語句的時候,而不是延遲函數執行的時候。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章