4 go的函數

函數的定義

函數的結構

func [function name] (paramters , ...) (return type) {
}

//func add(a int , b int)
func add(a, b int) int { //代表兩個變量是一樣的類型
   return a + b
}

func swap(a , b int) (int int) {
   return b ,a
}
//匿名函數
func main{
    f := func(a,b int){
        return a + b
    }
    fmt.Printf(f(2.3))
}

閉包的概念

閉包表示的是一個函數可以使用另一函數的內部的變量,也可以理解爲定義在函數裏面的函數.

百度百科:

閉包就是能夠讀取其他函數內部變量的函數。例如在javascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數“。在本質上,閉包是將函數內部和函數外部連接起來的橋樑。

我個人認爲,理解閉包的關鍵在於:外部函數調用之後其變量對象本應該被銷燬,但閉包的存在使我們仍然可以訪問外部函數的變量對象,這就是閉包的重要概念。

產生一個閉包

創建閉包最常見方式,就是在一個函數內部創建另一個函數。下面例子中的 closure 就是一個閉包:

閉包的作用域鏈包含着它自己的作用域,以及包含它的函數的作用域和全局作用域。

閉包的注意事項

.通常,函數的作用域及其所有變量都會在函數執行結束後被銷燬。但是,在創建了一個閉包以後,這個函數的作用域就會一直保存到閉包不存在爲止。

 

 

從上述代碼可以看到add5 和 add10 都是閉包。它們共享相同的函數定義,但是保存了不同的環境。在 add5 的環境中,x 爲 5。而在 add10 中,x 則爲 10。最後通過 null 釋放了 add5 和 add10 對閉包的引用。

在javascript中,如果一個對象不再被引用,那麼這個對象就會被垃圾回收機制回收;

如果兩個對象互相引用,而不再被第3者所引用,那麼這兩個互相引用的對象也會被回收。

閉包只能取得包含函數中的任何變量的最後一個值

內存泄漏

閉包會引用包含函數的整個變量對象,如果閉包的作用域鏈中保存着一個HTML元素,那麼就意味着該元素無法被銷燬。所以我們有必要在對這個元素操作完之後主動銷燬。

Go裏面還有一個概念就是方法

方法我的理解就是一個對象裏面的函數,就叫做某個對象的方法。然後這個對象是我們需要指定給這個函數的簡單的舉個例子

type user struct{
 var size int 
 var name string 
}

func (u user) notify() {
    fmt.Printf("size is ",u.size, "name is " ,u.name)
}
func main(){
    user a = {10,"hello"};
    a.notify();
}

 

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