go語言的匿名函數

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

1.go語言匿名函數的用法

1-聲明一個匿名函數

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

       函數體...

 }

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

}

程式輸出:

func 1

func 2

func 3

2.一個複雜的例子分析

func main() {
    var j int = 5
 
    a := func()(func()) {
        var i int = 10
        return func() {
            fmt.Printf("i, j: %d, %d\n", i, j)
        }
    }()
 
    a()
 
    j *= 2
 
    a()
}
程式輸出:

i, j: 10, 5  
i, j: 10, 10

分析:

1---"...func()(func()) {....."

       表明此匿名函數傳回值的類型是func(), 即此匿名函數返回一個函數指標(此處引用一下c 的概念);

2---"...return func() {
            fmt.Printf("i, j: %d, %d\n", i, j)
        }..."

        表明返回的函數指標指向一個列印 i, j: %d, %d\n  的函數;

3---"...a := func()(func()) {

         ...

         }()..."

         末尾的括弧表明匿名函數被調用,並將返回的函數指標賦給變數a ;

綜合來看:

"...a := func()(func()) {
        var i int = 10
        return func() {
            fmt.Printf("i, j: %d, %d\n", i, j)
        }
    }()..."

此程式碼片段的意思"等價於"

a := func() {
            fmt.Printf("i, j: %d, %d\n", i, j)
        }

至於為何要用匿名函數如此的轉一圈,是因為要引用閉包的概念,此概念省略不表,多寫點代碼試試就能體會了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.