内容简介:在日常开发中,首先第一个肯定是遍历之所以会输出
在日常开发中, for range
肯定是经常用到的,下面我整理了一些自己平常会遇到的坑
首先第一个肯定是遍历 slice
的坑了
func main() { arr := []int{1, 2, 3} newArr := []*int{} for _, v := range arr { newArr = append(newArr, &v) } for _, v := range newArr { fmt.Println(*v) } } // 输出 3 3 3
之所以会输出 3 3 3
是因为 for range
在循环时, go
会创建一个额外的变量去存储循环的元素,所以在每一次迭代中,该变量都会被重新赋值,由于这里使用的是指针,所以就出现上面的这种情况。我们可以用 &arr[i]
去替代 &v
下面是一个在循环体内修改遍历的对象的场景
func main() { a := []int{1,2,3} for _, v := range a { a = append(a, v) } fmt.Println(a) } // 输出 [1 2 3 1 2 3]
之所以只输出两遍 1 2 3
而不是一直循环下去,是因为 for range
在编译期间,就会把 a
赋值给一个新的变量,所以我们遍历的其实已经不是 a
变量了。
遍历 map
,无序的场景
func main() { m := map[int]struct{}{ 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, } for k := range m { fmt.Println(k) } } // 输出不定
map
在遍历时,起始遍历索引是一个随机数,所以这里的输出结果是不能确定的
遍历 map
时删除元素
func main() { m := map[int]struct{}{ 1:{}, 2:{}, 3:{}, 4:{}, 5:{}, } count := 0 for range m { if count == 0 { delete(m, 5) } count++ } fmt.Println(count) } // 输出 4或5
这种输出的原因可以从上个例子中找到
以上所述就是小编给大家介绍的《Go for range常见的坑》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Open Scene Graph3.0三维视景仿真技术开发详解
国防工业出版社 / 2012-7-1 / 46.00元
OpenSceneGraph 3.0三维视景仿真技术开发详解,ISBN:9787118081411,作者:杨化斌 著 杨化斌 编一起来看看 《Open Scene Graph3.0三维视景仿真技术开发详解》 这本书的介绍吧!