测试的时候发现一个有意思的地方,就是go始终利用同一块内存来接收集合中的一个值,只是在每次循环的时候重新赋值而已。

package main
import (
    "fmt"
    "time"
)
func main() {
    ii := []int{1, 2, 3, 4, 5}
    for idx, i := range ii {
        fmt.Printf("[%d]: [%d]@ %p -->%p\n", idx, i, &i, &(ii[idx])) //结论是,&i始终不变!
    }
    uu := []user{user{1, "aaa"}, user{2, "bbb"}, user{3, "ccc"}, user{4, "ddd"}}
    for idx, i := range uu {
        fmt.Printf("[%d]: [%v]@ %p -->%p\n", idx, i, &i, &(uu[idx])) //结论是,&i始终不变!而且,值正常,说明空间是重复利用。
    }
    //怎么验证呢?需要监控数据的变化,反射吗?不用,goroutine时刻对比就行 - 虽然性能极低
    var u *user
    go func() {
        id := u.id
        name := u.name
        for {
            if id != u.id {
                fmt.Println("id changed!", id, "to", u.id) //通过这个的变化,来观察是否有清零过程 - 结论是没有
                id = u.id
            }
            if name != u.name {
                fmt.Println("name changed!", name, "to", u.name) //通过这个的变化,来观察是否有清零过程 - 结论是没有
                name = u.name
            }
        }
    }()
    for idx, i := range uu {
        if idx == 0 {
            u = &i
        }
        fmt.Printf("[%d]: [%v]@ %p -->%p\n", idx, i, &i, &(uu[idx])) //结论是,&i始终不变!而且,值正常,说明空间是复利用。
        time.Sleep(time.Second)
    }
}
type user struct {
    id int
    name string
}

go for-range中的循环变量的更多相关文章

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

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

  2. 在Lambda表达式中使用循环变量

    在C#5.0之前,如果在foreach循环中的lambda表达式里使用循环变量,那么你会发现一些意想不到的现象,例子如下: , , , }; var actions = new List<Act ...

  3. JS中for循环变量作用域--解决for循环异步执行的问题

    被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...

  4. python中for循环中的循环变量

    废话不多说,代码伺候: for i in range(3): print("hello") print(i) 运行结果如下: 从上面的例子可以看出,for循环里面的循环变量i作用域 ...

  5. keil中for循环变量递减,无法跳出循环的问题

    定义j时应注意其变量类型char,此循环当j=0时,再执行一次则keil中j=0XFF,而不是-1,所以无法跳出循环.但在vc6.0中是可以跳出循环的. 解决办法如下:不能让j的值为负数 uchar ...

  6. JS中for循环变量作用域

    http://www.cnblogs.com/zhus/p/6513741.html  博主写得很好

  7. Swift中的循环语句

    循环语句能够使程序代码重复执行.Swift编程语言支持4种循环构造类型:while.do while.for和for in.for和while循环是在执行循环体之前测试循环条件,而do while是在 ...

  8. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

  9. 【Javascript】: for循环中定义的变量在for循环体外也有效

    for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ...

随机推荐

  1. Cocos Creator_发布到微信小游戏平台

    观看官方教程,地址 传送门: http://docs.cocos.com/creator/manual/zh/publish/publish-wechatgame.html CocosCreator接 ...

  2. django session源码剖析

    首先要明白,session和cookie,session是保存在服务器端,cookie存储在浏览器上,我们称为客户端,客户端向服务端发送请求时,会将cookie一起发送给服务端.服务端接收到请求后,会 ...

  3. C#_02.12_基础二_.NET类型存储和变量

    C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...

  4. Tornado-cookie

    cookie 服务端在客户端的中写一个字符串,下一次客户端再访问时只要携带该字符串,就认为其是合法用户. tornado中的cookie有两种,一种是未加密的,一种是加密的,并且可以配置生效域名.路径 ...

  5. Android的Databinding-数据、Map绑定

    本节主要说Collection的字符串数组.List.SparseArray.Map的绑定.先看看xml的布局. <layout xmlns:android="http://schem ...

  6. [Web 前端] mobx教程(五)-Mobx常见问题及解决方案(1)Mobx使用严格模式

    copy from : https://blog.csdn.net/smk108/article/details/83185745 mobx在严格模式下,不允许在 action 外更改任何状态.但是不 ...

  7. windows10创建ftp服务器

    1.创建用户 2.创建FTP服务 3.开通防火墙服务 建立端口21,20入站规则 4.访问测试

  8. mysql-linux定时备份mysql数据库

    sh脚本 #!/bin/bash db_user="数据库用户名" db_passwd="数据库密码" db_name="数据库名" cd ...

  9. 每天一个linux命令(5):rmdir

    1.命令简介 rmdir (Remove Directory删除目录): 用来删除空目录,删除某目录时也必须具有对父目录的写权限. 2.用法 用法:rmdir [选项]... 目录... 3.选项 - ...

  10. 如何快速申请苹果IOS个人开发者账号

    在上周我有一同事,他利用周末的时间自己做了一个IOS版本游戏类APP,用Unity3D开发的(抱着好玩的心态),于是他想发布到苹果App Store 上去.他没有苹果开发者账号,也没有购买过. 于是找 ...