测试的时候发现一个有意思的地方,就是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. IntelliJ IDEA配置Springboot2.x 通过devtools实现代码热部署,提高调试效率

    1.pom.xml添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  2. BZOJ2702 : 金融风暴

    求出离每个点最近的关键点,然后用二维ST表回答正方形最大值. 将关键点分为上下两部分,以上为例: 从上到下依次考虑每一行,记录每一列往上最近的关键点的距离,那么最优决策具有单调性,可以分治求解. 时间 ...

  3. BZOJ4613 : [Wf2016]Longest Rivers

    对于每条河流,要让它排名最靠前,那么显然它必须要延伸到根. 设第$i$条河流到根的距离为$d[i]$,对于每个节点,如果存在一条河流比$d[i]$长,那么让它延伸会使答案最小,否则要选择一条最短的河流 ...

  4. Chrome中Vim插件cVim

    参考资料:http://blog.csdn.net/hk2291976/article/details/51280816 常用命令: k,w:上移; j,s:下移:h:向左:l:向右:u:上半页d:下 ...

  5. NLP 工具类库

    NLPIR http://www.nlpir.org/ HanLP https://github.com/hankcs Apache OpenNLP   https://opennlp.apache. ...

  6. 深入理解FM和FFM

    公司主要用这两个模型来进行广告预测. http://geek.csdn.net/news/detail/59793 FM主要是处理在onehot之后,矩阵稀疏的问题. 在引入fm之后,能够更好的处理特 ...

  7. ajax冲刺03

    ---恢复内容开始--- 1.jq中ajax封装 简单的$.ajax方法使用示例:请关注 传参类型及数据 <!DOCTYPE html> <html lang="en&qu ...

  8. python函数之协程与面向过程编程

    第一:协程 初步了解协程 def eater(): print('start to eat') while True: food=yield print('is eating food:%s'%foo ...

  9. jQuery 学习01——定义、安装引用、语法、选择器及事件

    什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多"的JavaScript库. jQuery库包含以下功能: HT ...

  10. [原创]Burp Suite web应用程序渗透测试神器

    [原创]Burp Suite web应用程序渗透测试神器 一 Burp Suite介绍 Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描 ...