package main

import "fmt"

func main() {
ParseStudent()
} type student struct {
Name string
Age int
} func ParseStudent() {
m := make(map[string]*student)
stus := []student{
{Name: "zhang", Age: 22},
{Name: "li", Age: 23},
{Name: "wang", Age: 24},
}
for _, stu := range stus {
// 都指向了同一个stu的内存指针,为什么?
// 因为 for range 中的 v 只会声明初始化一次
// 不会每次循环都初始化,最后赋值会覆盖前面的 fmt.Printf("%p\\n", &stu) // 1. bad
// 这里map的值是stu的地址
m[stu.Name] = &stu // 2. good
/*newStu := stu
m[stu.Name] = &newStu*/
} for i, v := range m {
// 这里打印将会是地址指向的值,因为地址不变,所以指向同一个值
fmt.Println(i, *v)
}
} // 结果
0xc0000044a0
0xc0000044a0
0xc0000044a0
zhang {wang 24}
li {wang 24}
wang {wang 24}


// 将上面代码的good注释取消,将bad注释掉

package main

import "fmt"

func main() {
ParseStudent()
} type student struct {
Name string
Age int
} func ParseStudent() {
m := make(map[string]*student)
stus := []student{
{Name: "zhang", Age: 22},
{Name: "li", Age: 23},
{Name: "wang", Age: 24},
}
for _, stu := range stus {
// 都指向了同一个stu的内存指针,为什么?
// 因为 for range 中的 v 只会声明初始化一次
// 不会每次循环都初始化,最后赋值会覆盖前面的 fmt.Printf("%p\\n", &stu) //// 1. bad
//
//m[stu.Name] = &stu // 2. good
newStu := stu
m[stu.Name] = &newStu
} for i, v := range m {
fmt.Println(i, *v)
}
} // 结果
0xc0000044a0
0xc0000044a0
0xc0000044a0
wang {wang 24}
zhang {zhang 22}
li {li 23}

go for range的坑的更多相关文章

  1. Golang -- range小坑铭记

    废话少叙,先上一段代码,猜猜预期的效果. package main import ( "fmt" ) type student struct { Name string Age i ...

  2. Python之scrapy安装

    1.按照网上教程一步步实验,运行时报错: 'HtmlResponse' object has no attribute 'xpath' in scrapy 个人使用的是scrapy0.14.4,搜索得 ...

  3. 写在19年初的后端社招面试经历(两年经验): 蚂蚁 头条 PingCAP

    去年(18年)年底想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer.想着可以总结一下经验,分享一下自己这一段"骑驴找马"过 ...

  4. TensorRT 不支持Tensorflow的操作有如下

    tf.unpack, tf.slice, tf.tile, tf.expand_dims, tf.fill, tf.cast, tf.floor_div, tf.range 比较坑,所以你必须限制你的 ...

  5. IDEA_MyBatis_SQLException:Parameter index out of range坑

    报错信息:超出数据库数据表设定的规定长度了 nested exception is org.apache.ibatis.type.TypeException: Could not set parame ...

  6. 深度挖掘,Html5的 Range 滑动刻度的坑,兼容全平台,将任性进行到底!

    最近2天一直在弄一个滑动的刻度效果,由于项目是基于Web App开发的,于是考虑到 移动端和pc端 的兼容性问题,考虑的比较多,尝试采用 Html5的Range 来做,目前已经兼容 pc端和移动端! ...

  7. 学习-go语言坑之for range

    引用自 http://studygolang.com/articles/9701 go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组. ...

  8. Go:坑之for range

    go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组.切片和映射.但是在使用for range时,如果使用不当,就会出现一些问题,导致程 ...

  9. golang取地址操作采坑:for idx,item := range arr中的item是个独立对象

    先看代码: package main import "fmt" func main() { type s struct { A string B int32 } arr := [] ...

  10. for .. range中的坑

    最近在开发中使用了for range来遍历一个slice,结果在测试的时候遇到了bug,最后定位是错误使用for range造成的,这里记录一下: func redisSlaveScanBigKeys ...

随机推荐

  1. Gym - 101845E (图形转换思维)

    题意:给你个边长为n(1 <= n <= 50)的下图这种三角形,图形所有点构成集合.找多少对a,b满足条件,条件为:ab两点之间还有其他点. 题解:刚开始以为直接找规律就行,wa了两次发 ...

  2. Weak Encryption 弱加密安全问题处理

    Weak Encryption Abstract 程序使用了弱加密算法,无法保证敏感数据的保密性. Explanation 陈旧的加密算法(如 DES)再也不能为敏感数据提供足够的保护了. 加密算法依 ...

  3. 大数据面试——HDFS

    一.Hadoop1.0 与 Hadoop2.0的区别

  4. Java面试——Netty

    一.BIO.NIO 和 AIO [1]阻塞 IO(Blocking I/O):同步阻塞I/O模式,当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取一些数据或者写出 ...

  5. ASP.NET Core - 选项系统之选项使用

    上一篇 ASP.NET Core - 选项系统之选项配置 中提到 IOptions.IOptionsMonitor 和 IOptionsSnapshot 三个接口,通过这三个接口都可以从依赖注入容器中 ...

  6. 免费1年服务器,部署个ChatGPT专属网页版

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...

  7. Java数据类型、标识符

    目录 JavaSE 标识符 数据类型 基本数据类型 引用数据类型 转义字符 JavaSE 标识符 定义 Java中用于定义名称的都是标识符.例:包名,类名,变量名,方法名等. 组成 由数字.字母._. ...

  8. Node.js中理解asyncmap函数 ,爬取王者荣耀荣耀官网壁纸400多张

    async/mapLimit函数理解 const phantom = require('phantom') const express = require('express'); const app ...

  9. kubernetes(k8s) 中安装kuboard面板

    kubernetes(k8s) 中安装kuboard面板 01 - 背景及安装 Kuboard 是一款专为 Kubernetes 设计的免费管理界面,兼容 Kubernetes 版本 1.13 及以上 ...

  10. flask快速上手

    看完这2个基本可以起步flask了 一学习 https://www.codingdict.com/article/4884 二实战 https://blog.miguelgrinberg.com/po ...