测试的时候发现一个有意思的地方,就是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. python网络编程(八)

    单进程服务器 1. 完成一个简单的TCP服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 se ...

  2. 劈配 [多省省选] [BZOJ5251] [网络流]

    题目链接 分析: 这道题看题都看了我好久... 我们可以容易想到这道题和网络流有关. 首先,从原点向每个学员连一条流量为1的边 然后,要限制每个导师的学员,在每个导师连到汇点的时候流量限制为bi 再接 ...

  3. python添加、修改、删除、访问类对象属性的2种方法

    1.直接添加.修改.删除.访问类对象属性 class Employee (object): empCount = 0 def __init__(self, name, salary) : self.n ...

  4. PHP读写Excel

    PHP读写Excel PHP读写Excel可以通过第三方库phpexcel比较优雅地完成,由于PHP对于字符串处理的优势,读写PHP非常方便. 库导入 这里使用composer包管理工具,以下是配置信 ...

  5. vue中的v-cloak

    问题 在使用vue时,HTML 绑定 Vue实例,在页面加载时会闪烁类似{{msg}}这样的信息.可能会导致用户体验不好. 使用v-cloak v-cloak就能解决这个问题. (1)用法 这个指令保 ...

  6. ES6项目构建(babel+gulp+webpack)

    (一)基础架构 (二)任务自动化(gulp) (三)编译工具(babel,webpack) (四)代码实现 一.基础构架 1.app : 放置前端代码 css : css文件 js : js文件 cl ...

  7. scipy.stats与统计学:4个概率分布:N,chi2,F,t

    scipy.stats与统计学:4个概率分布:N,chi2,F,t   四个常用分布的概率密度函数.分布函数.期望.分位数.以及期望方差标准差中位数原点矩: 1,正态分布: from scipy.st ...

  8. shell编程学习笔记(十一):Shell中的while/until循环

    shell中也可以实现类似java的while循环 while循环是指满足条件时,进行循环 示例: #! /bin/sh index=10 while [ $index -gt 0 ] do inde ...

  9. Linux中非正常关闭vi编辑器产生swp文件怎么删除

    Linux中非正常关闭vi编辑器产生swp文件,会导致编辑文件时提示如下内容(图我是从网上找的): 这是因为异常关闭vi编辑器产生swp文件导致,假设编辑的文件名是file.sh,那么生成的swp文件 ...

  10. C# 程序打包成安装项目

    Xaml设置图标https://blog.csdn.net/u014234260/article/details/73648649 winform程序控制面板中卸载显示图标https://blog.c ...