Go語言匿名函數困惑

轉自https://blog.csdn.net/tbc123tbc/article/details/78948576 安全

這裏主要是描述我在學習過程當中遇到的困惑。起初把函數單獨寫出來,想用普通函數那種寫好後再去main方法中調用,總是報錯。以下圖: 
這裏寫圖片描述 
真正的使用方法,要深入體會匿名函數的原因,它只是爲了少數的幾回調用,又不想命名太多形成命名衝突,就使用一邊構造函數一邊使用的狀況,不能單獨脫離調用來構造。 
1-聲明一個匿名函數閉包

func(參數列表) 返回值列表 {app

 
 
 
 
  • 1
  • 2
函數體...

}函數

2-匿名函數的調用學習

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
package main import ( "fmt" ) func main() { //無參數直接加括號 func() int { var i int =5 fmt.Printf("func 1\n") return i }() //有參數,在括號里加參數 func(arge int) { fmt.Printf("func %d\n",arge) }(2) //也能夠先賦給一個變量再調用 a := func() int { fmt.Printf("func 3\n") return 5 } a() }

程序輸出:spa

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
func 1 func 2 func 3

2.一個綜合性的例子(閉包)——Go的匿名函數是一個閉包.net

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
func main() { var j int = 12 a := func()(func()) { var i int = 3 return func() { fmt.Printf("i, j: %d, %d\n", i, j) } }() a() j *= 2 a() }

程序輸出:3d

 
 
 
 
  • 1
  • 2
  • 3
i, j: 3, 12 i, j: 3, 24

在上面的例子中,變量a指向的閉包函數引用了局部變量i和j,i的值被隔離,在閉包外不能被修改,改變j的值之後,再次調用a,發現結果是修改過的值。 
在變量a指向的閉包函數中,只有內部的匿名函數才能訪問變量i,而沒法經過其餘途徑訪問到,所以保證了i的安全性。 
補充說明一下《閉包》的相關知識以下三個方面說:code

   (1)基本概念 
     閉包是能夠包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(因爲自由變量包含在代碼塊中,因此這些自由變量以及它們引      用的對象沒有被釋放)爲自由變量提供綁定的計算環境(做用域)。 
    (2)閉包的意義 
     閉包的價值在於能夠做爲函數對象或者匿名函數,對於類型系統而言,這意味着不只要表示數據還要表示代碼。支持閉包的多數語言都將函數做爲第一級對象,就是說這些函數能夠存儲到變量中做爲參數傳遞給其餘函數,最重要的      是可以被函數動態建立和返回。 
    (3)GO語言中使用閉包 
     Go語言中的閉包一樣也會引用到函數外的變量。閉包的實現確保只要閉包還被使用,那麼被閉包引用的變量會一直存在。orm

相關文章
相關標籤/搜索