内容简介:在日常开发中,首先第一个肯定是遍历之所以会输出
在日常开发中, 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常见的坑》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言接口与实现
(美)David R. Hanson / 人民邮电出版社 / 2010-8 / 79.00元
可重用的软件模块是构建大规模可靠应用程序的基石,创建可重用的软件模块是每个程序员和项目经理必须掌握的技能。C语言对创建可重用的API提供的语言和功能支持非常少,虽然C程序员写应用时都会用到API和库,但却很少有人去创建和发布新的能广泛应用的API。本书介绍用一种基于接口的设计方法创建可重用的API,这一方法将接口与实现分离开来,且与语言无关。书中详细描述了24个接口及其实现,便于读者深入了解此方法......一起来看看 《C语言接口与实现》 这本书的介绍吧!