Go语言中的匿名函数和闭包的样子

1). 函数也是值,可以像普通值那样,传来传去;

2). 匿名函数;

3). 函数的类型,类似于:func(float64,float64) float64

==========================

1). 在函数式程序设计语言中,闭包都是个重要的玩意;

2). 闭包有时候让人赶脚捉摸不透;

3). 例子中 sum 的作用域、生命周期;实际上在一个函数内部返回一个匿名函数/闭包,如果这个返回函数使用了原来函数内的变量值,那么这些变量的生命周期便延长了;这不是 c 的风格,c 中的管你返回神马东西,局部 auto 变量函数返回后就消亡了(当然你可以使用 static 变量)!

package main

import (
	"fmt"
	"math"
)

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {

	hypot := func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}

	fmt.Printf("%T %g", hypot, hypot(3, 4))

	pos, neg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(pos(i), neg(-2*i),)
	}
}

  

时间: 2024-10-03 13:05:43

Go语言中的匿名函数和闭包的样子的相关文章

匿名函数、闭包、lambda表达式、Block

C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure(或是OC中的blocks)是一个东西,只是不同语言的不同称呼罢了,它们都是匿名函数.若匿名函数捕获了一个外部变量,那么它就是一个closure. 为什么会有这个东东呢? 使用它们一般会有两个好处:简洁.捕获变量. 1.简洁 比如一个方法只在这一处使用,我们就没有必要创建方法然后调用,我们可以直接在其

JavaScript 匿名函数和闭包介绍

 匿名函数:没有名字的函数; 闭包:可访问一个函数作用域里的变量的函数; 一 匿名函数 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 // 普通函数 function box(){ // 函数名是box; return 'Lee'; } box(); // =>Lee; 调用函数; // 匿名函数 function(){ // 匿名函数,会报错; return 'Lee'; } // 通过表达式自我执行 (fu

JavaScript 匿名函数和闭包介绍_javascript技巧

匿名函数:没有名字的函数; 闭包:可访问一个函数作用域里的变量的函数; 一 匿名函数 // 普通函数 function box(){ // 函数名是box; return 'Lee'; } box(); // =>Lee; 调用函数; // 匿名函数 function(){ // 匿名函数,会报错; return 'Lee'; } // 通过表达式自我执行 (function(name){ console.log(name); // =>Lee; })("Lee"); //

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代

Javascript中的匿名函数与封装介绍

 这篇文章主要介绍了Javascript中的匿名函数与封装介绍,本文分析了jQuery 封装.Backbone 封装.Underscore 封装等内容,需要的朋友可以参考下     迷惑了一会儿不同JS库的封装后,终于有了点头绪.大致就是: 代码如下: 创建一个自调用匿名函数,设计参数window,并传入window对象. 而这个过程的目的则是, 代码如下: 使得自身的代码不会被其他代码污染,同时也可以不污染其他代码. jQuery 封装   于是找了个早期版本的jQuery,版本号是1.7.1

c语言-C语言中如何调试函数求指导

问题描述 C语言中如何调试函数求指导 C语言中如何调试函数?按F11几步之后进入了如下图一些文件中开始逐步调试,这是怎么回事? 就是一些诸如printf.c, _file.c的文件,怎么能跳过这些,调试函数呢? 解决方案 F9设置断点,F5调试运行,F11逐语句(可进入函数),F10逐过程(不进入函数),shift+F11跳出函数. 解决方案二: 就是一些诸如printf.c, _file.c的文件,怎么能跳过这些,调试函数呢? 解决方案三: 编译器是通过堆栈的形式给你调试的

printf-C语言中被调函数在主调函数的前面和后面有什么区别?

问题描述 C语言中被调函数在主调函数的前面和后面有什么区别? 一: void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("x=%d,y=%dn",x,y); } void main() { int a,b; //a,b是实参. scanf("%d,%d",&a,&b); swap(a,b); printf("a=%d,b=%dn",a,b); system(

Go语言中的匿名结构体用法实例_Golang

本文实例讲述了Go语言中的匿名结构体用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main      import (     "fmt" )      func main() {     var user struct{Name string; Gender int}     user.Name = "dotcoo"     user.Gender = 1     fmt.Printf("%#v\n",

c语言中字符串分割函数及实现方法_C 语言

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a