阅读go语言圣经第五章第六节介绍到了捕获迭代变量

package main

import (
"fmt"
) func main() {
var lis []func()
for i := 0; i < 10; i++ {
lis = append(lis, func() {
fmt.Println(i)
})
}
for _, f := range lis {
f()
}
}

  这段代码执行结果是打印了10个10

  出现这个结果的原因是for循环的循环体会共享循环变量i的值,因此第二个for循环开始调用f函数时,他们的i共享的是最后一次的循环变量i的值,此时i已经变成了10。

  如何确保函数打印循环到某一时刻的i值呢?

package main

import (
"fmt"
) func main() {
var lis []func()
for i := 0; i < 10; i++ {
i := i
lis = append(lis, func() {
fmt.Println(i)
})
}
for _, f := range lis {
f()
}
}

  以上代码实现该效果。我的理解是:i:=0;i<10;i++是一个词法块,它是for循环体的上一级作用域,原来的for循环体找i是从上级作用域找到的。所以,只要我们能让for循环体找i时从自己的作用域找就可以了,因此,我们需要在循环体内重新声明一个变量保存上级作用域中的i在当前循环的值。这里我声明的变量还是i(go语言圣经也用原变量名,应该是让读者记忆更深刻吧)

go语言循环变量的更多相关文章

  1. Javascript中的循环变量声明,到底应该放在哪儿?

    相信很多Javascript开发者都在声明循环变量时犹豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪一种方式和ecma标准 ...

  2. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

    OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符. ...

  3. Go语言循环判断的使用~

    Go 语言条件语句 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结 ...

  4. C语言循环的实现

    在C语言中采用3中语法来实现循环,它们分别是while.for.do while,本文将分别说明这三种循环的实现,并对它们的运行效率进行比较. do while 首先来看do while的实现:下面是 ...

  5. R语言:变量名称和字符串的转换

    R语言:变量名称和字符串的转换 2014-06-23 14:45:27         在R语言中,经常会遇到变量名称和字符串相互转换的问题.比如说,进行1000次循环运算,并将运算结果存储在1000 ...

  6. Python - Django - 模板语言之变量

    前言: 在 Django 模板语言中变量用 {{ }},逻辑用 {% %} 在 urls.py 中添加对应关系 from django.conf.urls import url from django ...

  7. R语言 循环

    R语言循环 可能有一种情况,当你需要执行一段代码几次. 通常,顺序执行语句. 首先执行函数中的第一个语句,然后执行第二个语句,依此类推. 编程语言提供允许更复杂的执行路径的各种控制结构. 循环语句允许 ...

  8. java 循环变量

    方法:是一段完成特定功能代码的片段. 格式: [修饰符1 修饰符2 ......]返回值类型 方法名(形式参数列表){ java语句;....... } 形式参数:在方法被调用时用于接收外界输入的数据 ...

  9. django模板里循环变量<table>里想要两个一行如何控制

    2016-8-3 周三 做项目时遇到的问题: 每个div由循环变量输出: {% for key,value in formextenddetail %} <div id="div_id ...

随机推荐

  1. mybatis-plus快速入门并使用

    目录 mybatis-plus的初次使用总结 说明:官网自有黄金屋,深入学习看官网是必须的,废话不多说 环境:springboot.mysql 一.配置 pom yml配置数据库 二.代码生成器 生成 ...

  2. MySQL03-多表&事务

    1.多表查询 1.1 笛卡尔积 有两个集合A,B .取这两个集合的所有组成情况. 要完成多表查询,需要消除无用的数据 1.2 多表查询分类 1.2.1 内连接查询: 1.隐式内连接:使用where条件 ...

  3. JavaSE25-Junit&注解

    1.Junit单元测试 1.1 测试分类 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具体的执行流程. Junit使用:白盒测试 步骤: ...

  4. 揭开DRF序列化技术的神秘面纱

    在RESTful API中,接口返回的是JSON,JSON的内容对应的是数据库中的数据,DRF是通过序列化(Serialization)的技术,把数据模型转换为JSON的,反之,叫做反序列化(dese ...

  5. 网络编程-python实现-TCP(1.1.3)

    @ 目录 1.TCP是什么 2.代码实现 1.TCP是什么 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由I ...

  6. 神奇的BFC

    BFC是什么? 块格式化上下文(Block/box Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域 ...

  7. 小白数据分析——Python职位全链路分析

    最近在做Python职位分析的项目,做这件事的背景是因为接触Python这么久,还没有对Python职位有一个全貌的了解.所以想通过本次分析了解Python相关的职位有哪些.在不同城市的需求量有何差异 ...

  8. 利用Python将PDF文档转为MP3音频

    1. 转语音工具 微信读书有一个功能,可以将书里的文字转换为音频,而且声音优化的不错,比传统的机械朗读听起来舒服很多. 记得之前看到过Python有一个工具包,可以将文字转换为语音,支持英文和中文,而 ...

  9. java 合并两个list 并去重

    //两个list合并并去除重复 public static void main(String[] args) throws Exception { List list1 =new ArrayList( ...

  10. MRP物料需求计划

    1.重订货点的采购计划. 计算方式:再订货点的库存数量 = 安全库存 + 采购提前期 * 每天消耗的数量 一旦库存数量触及再订货点的库存数量,需触发采购订单订购物料,理想的情况下 ,下次到采购订单收货 ...