Go語言匿名函數困惑


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

這里主要是描述我在學習過程中遇到的困惑。起初把函數單獨寫出來,想用普通函數那種寫好后再去main方法中調用,老是報錯。如下圖: 
這里寫圖片描述 
真正的使用方法,要深刻體會匿名函數的緣由,它只是為了少數的幾次調用,又不想命名太多造成命名沖突,就使用一邊構造函數一邊使用的情況,不能單獨脫離調用來構造。 
1-聲明一個匿名函數

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

   函數體... 
 
 
 
         
  • 1
  • 2

}

2-匿名函數的調用

 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()  }
 
 
 
         
  • 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

程序輸出:

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

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

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()  } 
 
 
 
         
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

程序輸出:

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM