内容简介:Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下:使用起来非常方便这个简单的使用方法里面,对新手来说,还是有坑的,而且非常不容易被发现。
Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下:
- 数组(array)
- 切片(slice)
- 通道(channel)
-
集合(map)
它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。
使用起来非常方便
for index, value := range myArray { fmt.Println("index: " + index) fmt.Println("value: " + value) }
这个简单的使用方法里面,对新手来说,还是有坑的,而且非常不容易被发现。
package main import "fmt" type student struct { Name string Age int } func main() { var stus []student stus = []student{ {Name: "one", Age: 18}, {Name: "two", Age: 19}, } data := make(map[int]*student) // code1 这是不对的使用方法 for i, v := range stus { data[i] = &v } for i, v := range data { fmt.Printf("error: key=%d, value=%v \n", i, *v) } // code2 这是正确的使用方法 for i, _ := range stus { data[i] = &stus[i] } for i, v := range data { fmt.Printf("right: key=%d, value=%v \n", i, *v) } }
输出结果是:
error: key=0, value={two 19} error: key=1, value={two 19} right: key=0, value={one 18} right: key=1, value={two 19}
原因很明显:
用for range来遍历的时候,被遍历的指针是不变的,每次遍历仅执行struct值的拷贝,即上面代码中的变遍历的 [v] 是对struct的值拷贝,因此 code1中 data[i] = &v 永远取的值都是 v这个遍历的地址。
以上所述就是小编给大家介绍的《Golang Range关键字的秘密》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 番外篇2-基本规范、注释、static关键字、import关键字
- 说说iOS中的常用的关键字static ,class(仅限Swift关键字)
- Golang 关键字
- 2019 关键字
- golang关键字
- final关键字深入解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
高扩展性网站的50条原则
[美] Martin L. Abbott、[美]Michael T. Fisher / 张欣、杨海玲 / 人民邮电出版社 / 2012-6-3 / 35.00元
《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。 主要内容包括: 通过克隆、复制、分离功能和拆分数据集提高网站扩展性; 采用横向......一起来看看 《高扩展性网站的50条原则》 这本书的介绍吧!