博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go for-range中的循环变量
阅读量:5076 次
发布时间:2019-06-12

本文共 1025 字,大约阅读时间需要 3 分钟。

测试的时候发现一个有意思的地方,就是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
}

转载于:https://www.cnblogs.com/larryzeal/p/10157311.html

你可能感兴趣的文章
OpenLayers修改要素
查看>>
BZOJ1478 Sgu282 Isomorphism
查看>>
解决kubuntu(KDE4.8.5桌面环境)找不到中文语言包
查看>>
世界杯改变网站“生存法则”
查看>>
java基础(读取键盘输入Scanner)
查看>>
微信第三方开放平台-笔录
查看>>
.NET框架源码解读之MYC编译器
查看>>
【Demo】CSS3 2D转换
查看>>
YYMMDD转YYYY-MM-DD
查看>>
java基础(第七章课后作业)01
查看>>
基础 - 时钟
查看>>
[源码和文档分享]基于Python和SQL SERVER数据库实现的实验信息综合管理系统
查看>>
[源码和文档分享]基于LR分析法的简单分析法
查看>>
android studio快捷键集合
查看>>
审查(黄金)Censoring (Gold)
查看>>
MySQL实战06の锁
查看>>
BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
查看>>
POJ Christmas Game [树上删边游戏 Multi-SG]
查看>>
countdown(倒计时)具体需求分析(WBS图)
查看>>
【函数】oracle translate() 详解+实例
查看>>