废话少叙,先上一段代码,猜猜预期的效果。

package main

import (
"fmt"
) type student struct {
Name string
Age int
} func main() {
m := make(map[string]*student)
stus := []student{
{Name: "zhou", Age: 24},
{Name: "li", Age: 23},
{Name: "wang", Age: 22},
}
for _, stu := range stus {
m[stu.Name] = &stu
} fmt.Printf("%+v\n", m) for k, v := range m {
fmt.Printf("k:%s v:%v\n", k, v)
}
}

  out:

    map[zhou:0x42114e100 li:0x42114e100 wang:0x42114e100]
  k:li v:&{wang 22}
   k:wang v:&{wang 22}
  k:zhou v:&{wang 22}

  是不是很诧异,结果为什么不是预期的,map的值都是一个呢?

  原因:for range每次产生的 k , v 都是一个值拷贝,不是 stus对应值得引用,故而会出现这种结果。

  细节分析:

  for _, stu := range stus {
m[stu.Name] = &stu
  }   // stu 是在 for中申请的一个局部变量,地址为:0x42114e100, 每次拷贝stus中对应的值。
  // 迭代遍历之后,stu每次被重新赋值,而map记录的是 变量stu对应的地址值,故而不会产生预期的效果。

  快速解决办法:

    for _, stu := range stus {
  a := stu
  m[stu.Name] = &a
    }

  谨在此记录。

Golang -- range小坑铭记的更多相关文章

  1. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  2. Golang的防坑小技巧

    Golang的防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名小白,在之前没有接触到编程的小伙伴,难免会踩到一些坑,比如说刚刚入门的时候你需要安装环境,学习Gol ...

  3. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

  4. mciSendString 的两个小坑

    刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...

  5. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  6. C#中的Infinity有个小坑

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...

  7. 使用EMMET中的小坑

    使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...

  8. 关于CSS3中transform变换的小坑

    2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...

  9. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

随机推荐

  1. jquery遇到的问题

    1.关于$.fn $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法, ...

  2. es6 javascript对象方法Object.assign() 对象的合并复制等

    Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). 详细使用稳步到前辈: http://blog.csdn.net/qq_ ...

  3. GCC编译器原理(一)------GCC 工具:addr2line、ar、as、c++filt和elfedit

    1.3 GCC 工具 1.3.1 binutils 工具集 工具 描述 addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻译成源代码文件名和行号. ar ...

  4. Spring 快速开始 Profile 和 Bean

    和maven profile类似,Spring bean definition profile 有两个组件:声明和激活. [栗子:开发测试环境使用HyperSQL 生产环境使用JNDI上下文根据配置查 ...

  5. Linux centos 防火墙篇

    防火墙的关闭 service iptables stop 永久关闭 chkconfug iptables off 查看状态 service iptables status

  6. sql-leetcode Consecutive Numbers

    开始想 用 group 把Num都聚在一起 -- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小 ...

  7. Unet网络

    近期利用遥感影像进行路网提取,利用Unet网络进行图像分割 介绍如下: U-net网络非常简单,前半部分作用是特征提取,后半部分是上采样.在一些文献中也把这样的结构叫做编码器-解码器结构.由于此网络整 ...

  8. Kaldi的nnet3

    Nnet3配置中的上下文和块大小 简介 本页讨论了nnet3配置中关于解码和训练的块大小以及左右上下文的某些术语.这将有助于理解一些脚本.目前,从脚本角度来看,没有任何关于nnet3的"概述 ...

  9. Viterbi

    把语音分割为计算发音质量测度所需要的小单元时候,需要进行Viterbi对齐 Viterbi,在htk和sphinx中,也被称作token passing model Viterbi解码图是 状态数Sm ...

  10. openwrt package 依赖关系

    参考链接: https://blog.csdn.net/zxygww/article/details/49181065