表达式:for range 复制行为

本文探讨了Go语言中for range遍历时的复制行为,解释了为何修改数组值不会影响遍历过程,并建议通过传递引用避免这个问题。此外,文章还介绍了label和goto的使用场景,如利用for(break)实现代码块跳出,以及如何通过goto优化性能,提高代码可读性。
摘要由CSDN通过智能技术生成

for range 复制行为

复制要么复制指针,要么复制完整的对象,Go 语言影响最大的是数组。

func rangeCopy() {
    x := [4]int{0x11, 0x22, 0x33, 0x44}

    for _, n := range x {
        // 遍历输出
        println(n)
    }

    for i, n := range x {
        // 遍历每次修改值
        x[0], x[1], x[2], x[3] = 0x100, 0x200, 0x300, 0x400
        fmt.Printf("%d: n=%#x, x[%d] = %#x\n", i, n, i, x[i])
    }

    for i, n := range x[:] {
        x[0], x[1], x[2], x[3] = 0x100, 0x200, 0x300, 0x400
        fmt.Printf("%d: n=%#x, x[%d] = %#x\n", i, n, i, x[i])
    }
}

同样遍历数组,但是每次重新修改值,一般人会认为既然修改了,每次遍历出来x的值应该是修改后的值,实际上不是。

我们遍历依然是原始的值,修改并没有影响遍历。所以range x实际上执行了一次range x.copy()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值