go 切片取最后一个元素_深挖 Go 之 forrange 排坑指南

今年做个 Dig101 系列,挖一挖技术背后的故事。

Dig101: dig more, simplified more and know more

golang 常用的遍历方式,有两种:for 和 for-range。而 for-range 使用中有些坑常会遇到,今天我们一起来捋一捋。

文章目录

  • 0x01 遍历取不到所有元素指针?

  • 0x02 遍历会停止么?

  • 0x03 对大数组这样遍历有啥问题?

  • 0x04 对大数组这样重置效率高么?

  • 0x05 对 map 遍历时删除元素能遍历到么?

  • 0x06 对 map 遍历时新增元素能遍历到么?

  • 0x07 这样遍历中起 goroutine 可以么?

0x01 遍历取不到所有元素指针?

如下代码想从数组遍历获取一个指针元素切片集合
arr := [2]int{
    1, 2}
res := []*int{}
for _, v := range arr {
res = append(res, &v)
}
//expect: 1 2
fmt.Println(*res[0],*res[1])
//but output: 2 2

答案是【取不到】 同样代码对切片[]int{1, 2}map[int]int{1:1, 2:2}遍历也不符合预期。问题出在哪里?

通过查看go 编译源码[1]可以了解到, for-range 其实是语法糖,内部调用还是 for 循环,初始化会拷贝带遍历的列表(如 array,slice,map),然后每次遍历的v都是对同一个元素的遍历赋值。也就是说如果直接对v取地址,最终只会拿到一个地址,而对应的值就是最后遍历的那个元素所附给v的值。对应伪代码如下:

// len_temp := len(range)
// range_temp := range
// for index_temp = 0; index_temp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值