1. 闭包中使用循环体中变化的量

platground链接:

https://play.golang.org/p/6x6_tuQNjUO

type Value struct{
val int
} func (v *Value)print(){
time.Sleep(time.Second)
fmt.Println(v.val)
} func main() { vals := make([]Value,0) for i := 0; i <10;i++ {
vals = append(vals, Value{val:i,})
} for _,v := range vals{
// 这种形式,闭包方式共享了主协程的变量v
// 而变量v是不断变化的,所以导致print的值都是最后一个
go func(){
v.print()
}()
} time.Sleep(time.Second*3)
}
运行结果:
9
9
9
9
9
9
9
9
9
9

2. receiver为指针时候,创建goroutine

playground链接:

https://play.golang.org/p/6quZIn6ZwSM

type Value struct{
val int
} func (v *Value)print(){
time.Sleep(time.Second)
fmt.Println(v.val)
} func main() { vals := make([]Value,0) for i := 0; i <5;i++ {
vals = append(vals, Value{val:i,})
} for _,v := range vals{
// print方法的receiver是(*Value)类型,而此处v是一个Value类型
// 所以每次print传值都传递了&v。
// 在for loop中,v的值变化,但是&v不会改变
// 在其他goroutine中执行时,print的内容不可预期,取决于当时的v值
go v.print()
} time.Sleep(time.Second*3)
}
运行结果:
4
4
4
4
4

golang两种在for循环中使用goroutine的错误形式的更多相关文章

  1. 保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case)

    保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java.Golang两种客户端教学Case)   目录 什么是AMQP 和 JMS? 常见的MQ产品 安装RabbitM ...

  2. 子查询。ANY三种用法。ALL两种用法。HAVING中使用子查询。SELECT中使用子查询。

    子查询存在的意义是解决多表查询带来的性能问题. 子查询返回单行多列: ANY三种用法: ALL两种用法: HAVING中的子查询返回单行单列: SELECT中使用子查询:(了解就好,避免使用这种方法! ...

  3. 保姆级别的RabbitMQ教程!包括Java和Golang两种客户端

    目录 什么是AMQP 和 JMS? 常见的MQ产品 安装RabbitMQ 启动RabbitMQ 什么是Authentication(认证) 指定RabbitMQ的启动配置文件 如何让guest用户远程 ...

  4. Golang两种执行流程以及区别

    Go语言的执行方式有两种,一种是编译后再执行,另一种直接go run执行. 一.先编译后执行 .go文件(源代码)--->go build指令把源代码编译(如果是windows下会编译出一个.e ...

  5. 为TextView设置两种状态,程序中可以动态切换

    经常会需要用文字的两种状态来表示当前系统的某两种状态.比如:         这里的第一个TextView和后两个TextView就表示了两种状态.我们可以在程序的动态的切换状态(而不是直接修改颜色) ...

  6. js循环遍历的两种方法for循环和for ... in 循环

    JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third& ...

  7. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

  8. promise核心技术 2.两种回调函数 js中error的处理

    抽空详细学习一下什么是回调函数(一个回调函数,也被称为高阶函数) 1.什么样的函数是回调函数 自己定义的(sittimeout不是自己定义的) 没有调用 自己执行 1.同步回调与异步回调函数 同步回调 ...

  9. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

随机推荐

  1. 使用Vuejs 开发chrome 插件的注意事项

    chrome 插件的开发其实并不难,web开发者可以使用 html, css, javascript 轻松的开发实用的 chrome 插件. 一个好的 chrome 插件可以提高我们的开发效率,甚至方 ...

  2. Linux less grep

    第一步,less查看文件 less 日志文件名 1,这时候,使用组合键 shift + g 可以定位到文件末尾. 在文件末尾,使用组合键(从末尾开始根据之后输入的字符串向上检索) shift + ? ...

  3. IDEA maven设置配置

    IDEA Maven配置 1. 下载maven 下载地址 从官网上,下载一个压缩包,然后解压到任意的文件夹 Maven的安装必须需要jdk1.7+ 2. 环境变量设置 M2_HOME改为具体的路径,其 ...

  4. git基本操作:分支管理

    一.创建测试项目 1.新建GitHub仓库 在GitHub上面新创建一个仓库,用来演示分支管理,如下图所示: 点击“Create repository”按钮创建新仓库. 2.将本地仓库项目上传到Git ...

  5. C#上手练习5(GOTO语句)

    C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成 语法形式如下. goto Labell;    语句块 1;Labell    语句块 2; 如果要 ...

  6. WPF/.net core WPF 系统托盘支持

    WPF 原生不支持系统托盘图标,需要依靠其它方式处理. 1 使用 WinForm 的支持 WPF最小到系统托盘 - Arvin.Mei - 博客园 2 使用 wpf-notifyicon 库 hard ...

  7. Java 构造结构私有化

    Java 构造结构私有化 单例设计模式:(Singleton) 在一般情况下,一个类只有通过产生对象之后才可以操作这个类. class Singleton { public void print() ...

  8. SAP MM MB5L 报表里的差异金额如何调整?

    SAP MM MB5L 报表里的差异金额如何调整? 5月3号,收到财务顾问提出的一个问题,说是MB5L报表里有差异. 如下查询条件, 报表结果里显示有差异, 经查,导致这个差异的原因之一是,一些物料批 ...

  9. [20191012]使用bash从sql_id计算hash_value.txt

    [20191012]使用bash从sql_id计算hash_value.txt --//没有什么实际意义,仅仅验证方法是否可行.--//sql_id的计算是使用MD5算法进行哈希,生成一个128位的H ...

  10. 批量文件B中选出部分文件(与A文件夹数量相同),放到C中

    import glob import os,sys import shutil fileDir = 'F:/project/Breast/InBreast/INBreast/outimgpatch/n ...