golang的闭包和普通函数调用区别
先看一段程序
package main
import (
  "fmt"
)
func main() {
   a := []int{1, 2, 3}
   for _, i := range a {
     fmt.Println(i)
     defer p(i)
   }
 }
 
 func p(i int) {
  fmt.Println(i)
 }
运行这段程序,输出结果为
1
2
3
3
2
1
这里就是普通的函数调用,每次调用func p时,完成 i 的值复制,然后打印,此时 i 值复制了3次,分别是1,2,3。由于defer是后进先出,所以执行变成3,2,1
下面我我们用闭包改写下程序:
package main
import (
  "fmt"
)
func main() {
  a := []int{1, 2, 3}
  for _, i := range a {
    fmt.Println(i)
    defer func() {
                  fmt.Println(i)
    }()
    }
}
运行这段程序,输出结果为
1
2
3
3
3
3
这个就是闭包的“神奇”之处。闭包里的非传递参数外部变量值是传引用的,在闭包函数里那个i就是外部非闭包函数自己的参数,所以是相当于引用了外部的变量, i 的值执行到第三次是3 ,闭包是地址引用所以打印了3次i地址指向的值,所以是3,3,3
golang的闭包和普通函数调用区别的更多相关文章
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
		浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ... 
- 【GoLang】GoLang 中 make 与 new的区别
		make.new操作 make用于内建类型(map.slice 和channel)的内存分配.new用于各种类型的内存分配. 内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零 ... 
- [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
		最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ... 
- JavaScript闭包函数&箭头函数调用与执行
		一.标准的闭包函数 //一.标准的闭包函数 function A() { var i=0; ++i; console.log('i : ' + i); return function b() { re ... 
- Golang两种执行流程以及区别
		Go语言的执行方式有两种,一种是编译后再执行,另一种直接go run执行. 一.先编译后执行 .go文件(源代码)--->go build指令把源代码编译(如果是windows下会编译出一个.e ... 
- [Golang]-1 Slice与数组的区别
		目录 数组 1.创建数组: 2.数组是值拷贝传递: 切片(slice) 1.首先看看slice的源码结构: 2.slice的创建: 3.slice使用make创建 4.切片作为参数传递 5.Golan ... 
- golang中闭包讲解
		1. 非闭包时的结果 package main import "fmt" func main() { var funcSlice []func() for i := 0; i &l ... 
- golang中数组与切片的区别
		初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...],,} a := [],,} 切片: a:= [],,} a := make([]) a := m ... 
- 【GoLang】golang 中 defer 参数的蹊跷
		参考资料: http://studygolang.com/articles/7994--Defer函数调用参数的求值 golang的闭包和普通函数调用区别:http://studygolang.com ... 
随机推荐
- Example010实现浏览器兼容改内容的函数,自写
			<!-- 实例010实现浏览器兼容改内容的函数 --> <!DOCTYPE html> <html lang="en"> <head> ... 
- 每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作
			准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 &g ... 
- JAVA基础——异常详解
			JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ... 
- PHP  xmapp  下面安装 Composer-Setup.exe
			1.打开PHP配置文件E:\xampp\php\php.ini确认以下模块已开启(移除前面的分号). extension=php_openssl.dll, (php.ini文档里面开启一次就OK了) ... 
- H3CNE实验:H3C设备文件管理
			第1步:配置文件的管理操作 (1) save [ safely ]--在H3C设备上将当前配置保存到存储介质的根目录下. 快速保存方式:不带 safely 参数. 安全方式:带 safely 参数. ... 
- jquery 变量和原生js变量的关系
			其实js 变量和 jquery没什么不一样, 也可以直接 var hhhh=$("header"); 但是当用到用到hhh时依然要用jquery 的方式,而不能js原生的方式. 
- vijos1101题解
			题目: 研究表明,这种传染病的传播具有两种很特殊的性质: 第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不 得病,或者是XY之间的传播途径被切断,则X就不会得病. 第二是,这种 ... 
- ARP欺骗分析
			(作者原创,欲转载请说明出处)1.arp介绍 arp:地址解析协议;将IP地址映射为MAC地址.2.为什么要有arp 平时上网我们都知道要有一个IP地址才能上网,那arp用来干嘛的呢?如果 ... 
- 关于js中的表单事件
			表单结构如下所示: <form > <input type="text" name="txt" id="txt" valu ... 
- Java 时钟
			<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ... 
