专栏首页Golang语言社区go语言的匿名函数

go语言的匿名函数

社区订阅号:Golang语言社区 社区服务号:Golang技术社区 如有问题或建议,请公众号留言

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) } 至于为何要用匿名函数如此的转一圈,是因为要引用闭包的概念,此概念省略不表,多写点代码试试就能体会了。

本文来自:CSDN博客

感谢作者:plc_jianghao

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • package runtime

    runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见reflect报的文档获取运行时类型系统的可...

    李海彬
  • package sync

    sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。

    李海彬
  • package debug

    Package debug contains facilities for programs to debug themselves while they ar...

    李海彬
  • 小朋友学Python(27):全局变量的引用和修改

    一、引用 例1 a = 1 def func(): if 1 == a: print("a = %d" % a) if __name__...

    海天一树
  • 73-递归函数计算阶乘

    凯茜的老爸
  • package runtime

    runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见reflect报的文档获取运行时类型系统的可...

    李海彬
  • package sync

    sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。

    李海彬
  • package debug

    Package debug contains facilities for programs to debug themselves while they ar...

    李海彬
  • Using get_defined_functions To Hidden A PHP Backdoor

    风流
  • 可怕的extern关键字一、不利之处二、例子三、分析四、正确做法

    如果函数原型改变的话,每个extern声明的地方都要改一遍。 如果有地方没改到呢? 我们通过一个例子来看下悲剧是怎么发生的。

    coderhuo

扫码关注云+社区

领取腾讯云代金券