golang之匿名函数

 1 package main
 2
 3 import "fmt"
 4
 5 /* squares返回一个匿名函数
 6  * 该匿名函数每次调用返回下一个数的平方
 7  * func name(parameter-list) (result-list) {
 8  *     body
 9  * }
10  */
11
12 func squares() func() int {
13     var x int
14     return func() int {
15         x++
16         return x * x
17     }
18 }
19
20 func main() {
21     f := squares() //返回函数指针
22     fmt.Printf("%v\n", f)
23     fmt.Println(f())
24     fmt.Println(f())
25     fmt.Println(f())
26     fmt.Println(f())
27     fmt.Printf("%v\n", f)
28 }

执行结果:

1 0x401620
2 1
3 4
4 9
5 16
6 0x401620

   通过这个例子, 我们看到变量的生命周期不由它的作用域决定:squares返回后, 变量x仍然隐式的存在于f中;

 

时间: 2024-11-10 10:36:04

golang之匿名函数的相关文章

JavaScript教程:编写匿名函数的几种方法

匿名函数可以有效控制变量作用域,构造闭包 (Closure),防止对全局变量造成污染.在 JavaScript 中,编写匿名函数,有以下几种方法: 错误模式:语法错误警告 function(){ // insert code here }(); 模式一:函数字面量 (Function Literal) 先声明函数对象,然后执行. (function(){ // insert code here })(); 模式二:优先表达式 (Prior Expression) 由于 JavaScript 按照

深入理解PHP中的匿名函数

  匿名函数的作用就是扩大函数的使用功能,在PHP 5.3以前,传递Callback的方式,我们只有俩种选择: ◆字符串的函数名 ◆使用create_function的返回 在PHP5.3以后, 我们多了一个选择, 也就是Closure. $func = function () { ... };   array_walk($arr, $func);  从实现上来说, 第一种方式: 传递函数名字符串是最简单的.而第二种方式create_function, 其实和第一种方式本质上一样的, creat

CLR 中匿名函数的实现原理浅析

函数 CLR 中匿名函数的实现原理浅析 C# 2.0中提供了通过delegate实现匿名函数功能,能有效地减少用户的薄记代码工作,例如 以下为引用: ...button1.Click += new EventHandler(button1_Click);...void button1_Click(Object sender, EventArgs e) { // Do something, the button was clicked...}... 可以被简化为直接使用匿名函数构造,如 以下为引用

F#教程:匿名函数(Lambda)

这回我们要学习的是Lambda表达式.F#和C#一样也有匿名函数.不过感觉将匿名函数称为Lambda更好些. 试着写些代码吧: let add = fun x y -> x + y printfn "%A" (add 1 3) 这里我们定义了add函数.这个定义使用了匿名函数(取出x,y两个参数,并将x+y的结果返回).fun就是匿名函数的关键字. 之前有过的函数定义是: let add x y = x + y 这是一种省略形式.不同的只是参数是否在lambda表达式中. 从C#

用匿名函数来更方便的使用缓存

一个数据缓存,一般由数据来源,缓存方案,缓存读取来完成,现在有了匿名函数,可以把获取数据 来源变为匿名函数.这样就可以直接声明一个缓存: protected static CacheManager<Company> companyCache = new CacheManager<Company>(new SmsDatabaseCache<Company>(), (key) => { return SmsDatabase.Instance.Context.Compa

CLR中匿名函数实现原理浅析

C#2.0中提供了通过delegate实现匿名函数功能,能有效地减少用户的薄记代码工作,例如 ... button1.Click += new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button was clicked... } ... 可以被简化为直接使用匿名函数构造,如 ... button1.Click += delegat

在异步调用匿名函数时明智地使用局部变量

问题:由于在多线程中使用了匿名函数外的局部变量而导致的Bug 执行代码 static void Main(string[] args) { for (int i = 0; i < 10; i++) { Thread t = new Thread(delegate() { Thread.Sleep(new Random().Next(1, 10000)); Console.Write(i + ", "); }); t.Start(); } } 将得到输出:10, 10, 10, 1

php的闭包(Closure)匿名函数详解

 本文主要给大家介绍的是php5.3引入的PHP匿名函数,也就是闭包(Closure),以及闭包的作用,非常详细,这里推荐给有需要的小伙伴们.     php的闭包(Closure)也就是匿名函数,是PHP5.3引入的. 闭包的语法很简单,需要注意的关键字就只有use,use是连接闭包和外界变量.   代码如下: $a = function() use($b) {}   简单例子如下:   代码如下: function callback($fun) { $fun(); } $msg = "Hel

js的匿名函数使用介绍

 匿名函数的作用是创建一块封闭区域,外面不能够访问里面的变量和方法,下面为大家介绍下什么是匿名函数及其如何使用 1.匿名函数概述    关于匿名函数的第一次认识还是在jquery源码里,打开jQuery首先看到的是  代码如下: (function( window, undefined ) {.......................})(window);    这就是一个匿名函数,红色为参数,匿名函数的作用是创建一块封闭区域,外面不能够访问里面的变量和方法.    既然不能访问,那怎么能调