go for range的坑
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的坑的更多相关文章
- Golang -- range小坑铭记
废话少叙,先上一段代码,猜猜预期的效果. package main import ( "fmt" ) type student struct { Name string Age i ...
- Python之scrapy安装
1.按照网上教程一步步实验,运行时报错: 'HtmlResponse' object has no attribute 'xpath' in scrapy 个人使用的是scrapy0.14.4,搜索得 ...
- 写在19年初的后端社招面试经历(两年经验): 蚂蚁 头条 PingCAP
去年(18年)年底想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer.想着可以总结一下经验,分享一下自己这一段"骑驴找马"过 ...
- TensorRT 不支持Tensorflow的操作有如下
tf.unpack, tf.slice, tf.tile, tf.expand_dims, tf.fill, tf.cast, tf.floor_div, tf.range 比较坑,所以你必须限制你的 ...
- IDEA_MyBatis_SQLException:Parameter index out of range坑
报错信息:超出数据库数据表设定的规定长度了 nested exception is org.apache.ibatis.type.TypeException: Could not set parame ...
- 深度挖掘,Html5的 Range 滑动刻度的坑,兼容全平台,将任性进行到底!
最近2天一直在弄一个滑动的刻度效果,由于项目是基于Web App开发的,于是考虑到 移动端和pc端 的兼容性问题,考虑的比较多,尝试采用 Html5的Range 来做,目前已经兼容 pc端和移动端! ...
- 学习-go语言坑之for range
引用自 http://studygolang.com/articles/9701 go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组. ...
- Go:坑之for range
go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组.切片和映射.但是在使用for range时,如果使用不当,就会出现一些问题,导致程 ...
- golang取地址操作采坑:for idx,item := range arr中的item是个独立对象
先看代码: package main import "fmt" func main() { type s struct { A string B int32 } arr := [] ...
- for .. range中的坑
最近在开发中使用了for range来遍历一个slice,结果在测试的时候遇到了bug,最后定位是错误使用for range造成的,这里记录一下: func redisSlaveScanBigKeys ...
随机推荐
- MySQL学习(八)BLOB和TEXT区别
:都市为存储很大数据而设计的字符串数据类型,分别采用二进制和字符方式存储.当blob和text值太大时,innodb会使用专门的"外部"存储区域来进行存储,此时每个值在行内需要1~ ...
- 初识Node和内置模块
初识Node与内置模块 概述:了解Node.js,熟悉内置模块:fs模块.path模块.http模块 初识Node.js 浏览器中的JavaScript运行环境 运行环境是指代码正常运行所需的必要环境 ...
- LoadRunner——分析图详解(十四)
<分析图详解> 一.Running V user s 图 X轴表示运行所用的时间,Y轴表示vuser数, 显示在整个运行过程中随着时间的推移,虚拟用户数量是如何变化的,具体描述为:用户是如 ...
- 最大流基础(Maximum Flow Basis)
1. 最大流问题定义 1.1 流网络(Flow network) Def. A flow network is a tuple \(G = (V, E, s, t, c)\): Digraph \(( ...
- better-scroll横向滚动、纵向滚动
<div ref="tab" class="tab"> <ul ref="tabWrapper" class=" ...
- urllib.parse的使用
urllib简介 urllib是pyhton自带的标准库用于网络请求库,无需安装,直接引用 通常用于爬虫开发,API(应用程序编程接口)数据获取和测试 urllib库的4大模块 urllib.requ ...
- 微信-JSSDK网页调用-(微信扫一扫)
网页调用微信扫一扫接口 1.准备工作: 1.1微信浏览器 1.2微信APPID,nonceStr 2.使用方式快速预览 调用扫一扫微信接口. 1需要获取access_token 2获取 $jsapi ...
- Notion AI : 让表达如此简单
前言 写作如说话,想说与说明白中间隔着沟壑! 下面用 Notion AI 作诗来作为本文开头吧. 想说与说明白(作者:Notion AI) 想说千言万语,说明白却难如登天. 言语之间,沟壑重重,思想与 ...
- [数据库/MySQL]解决异常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'
1 场景复现 MySQL: 5.7.24-27 表结构 (两张独立的表) [表 RRR1] CREATE TABLE `RRR1` ( `R1` float NOT NULL COMMENT 'R1' ...
- Cesium案例(八) Terrain
第一步正常建viewer,需要注意的是官网例子属性值比较老,最新版本的属性值有所差异,全copy官网会无法运行,提示函数未定义. 第一处差异 官网: 1 const viewer = new Cesi ...