GO 函數閉包與自執行函數學習

函數學習

1、自執行函數和閉包 在js中也有這個概念,通過對比我們就能更好的理解go語言的語法特性

  • 自執行函數
    1、1 通過學習javascript我們再來深入學習go的語法,在javascript的意思就是自己調用自己
(function ( a,  b) {
	console.log("a=" + a +"b="+b)
})(1,2);
// result =  a =1 b =2

1、2 在GO中語法是怎麼樣的呢

func main()  {

	/*fmt.Println(intSum(1,2))
    var f = adder()
	fmt.Println(f(10))
	fmt.Println(f(20))
	fmt.Println(f(30))*/

	func(x, y int) {
		fmt.Println(x + y)
	}(10, 20)
}

總結: 通過兩種語言的對比我們知道,他們先定義執行,之後立馬調用自己, 然後執行函數體裏面的內容。


  • 閉包
    1、3 在js中的閉包
function init() {
    var name = "Mozilla"; // name 是一個被 init 創建的局部變量
    function displayName() { // displayName() 是內部函數,一個閉包
        alert(name); // 使用了父函數中聲明的變量
    }
    displayName();
}
init();

1、4 在go中我們應該如何寫閉包,他有什麼特性

func adder() func(int) int{
	var x int  // 10
	return func(y int) int {
		x+=y
		return x
	}
}
fmt.Println(f(10))  //1O
fmt.Println(f(20))  //30
fmt.Println(f(30))  //60

總結: 這個理解屬於個人理解, 爲什麼調用f(10)的時候是10呢。調用f(20)的時候等於30呢。這時候我們需要思考,如果他沒有保存局部變量的值那麼f(10)=10,f(20)=20,這個理解應該沒有問題, 當我們運行的時候發現結果並不是我們理解的這樣。那麼我認爲,程序在運行的時候並沒有銷燬局部變量的值,而是保存最新的局部變量值,這樣他就可以得到我們上面執行的結果。

閉包場景二學習

func main()  {
	jpgFunc := suffix(".jpg")
	txtFunc := suffix(".txt")
	fmt.Println(jpgFunc("test")) //test.jpg
	fmt.Println(txtFunc("test")) //test.txt
}
// 判斷前綴
func suffix(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

場景三學習

func calc(base int) (func(int) int, func(int) int) {
	add := func(i int) int {
		base += i
		return base
	}

	sub := func(i int) int {
		base -= i
		return base
	}
	return add, sub
}

func main() {
	f1, f2 := calc(10)
	fmt.Println(f1(1), f2(2)) //11 9
	fmt.Println(f1(3), f2(4)) //12 8
	fmt.Println(f1(5), f2(6)) //13 7
}

總結: 通過上面三個例子我們不難知道,閉包其實不難理解,他會保存引用變量的值。

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