zoukankan      html  css  js  c++  java
  • go for-range中的循环变量

    测试的时候发现一个有意思的地方,就是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 ", 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 ", 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 ", idx, i, &i, &(uu[idx])) //结论是,&i始终不变!而且,值正常,说明空间是复利用。
            time.Sleep(time.Second)
        }
    }

    type user struct {
        id int
        name string
    }
  • 相关阅读:
    阿里云通过465端口发送邮件绕过25端口
    阿里云子账号Policy授权规则明细
    蓝鲸cmdb平台架构
    库文件缺失问题修复
    centos7.2中启动polkit服务启动失败
    Linux升级GCC
    Ubuntu18.04服务器使用netplan网络构建桥接kvm虚拟机
    常用服务部署脚本(nodejs,pyenv,go,redis,)
    anaconda安装教程(之前安装过python)
    【PHP】array_unique与array_array_flip
  • 原文地址:https://www.cnblogs.com/larryzeal/p/10157311.html
Copyright © 2011-2022 走看看