golang slice 迭代值的地址为何不变?

查看:61
本文介绍了golang slice 迭代值的地址为何不变?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

看一段 golang 代码:

package main

import "fmt"

func main() {
    x := make([]int, 3)

    x[0], x[1], x[2] = 1, 2, 3

    for i, val := range x {
        fmt.Println(&x[i], "vs.", &val)
    }
}

运行结果:

0xc42007c080 vs. 0xc42006c178
0xc42007c088 vs. 0xc42006c178
0xc42007c090 vs. 0xc42006c178

迭代这个切片的时候,切片索引地址是不同的,而不同的值的地址是相同的,主要不理解值的地址为很么相同?这又说明了什么?

希望有人能够通俗易懂,正确无误的讲一下,谢谢!

解决方案

for i,val := range x 可以等价看为:

var val int
var length = len(x)
for i:=0; i<length; i++ {
    val = x[i]
}

所以val的地址不变,而且val是值拷贝,修改它也不会影响原数组。

这篇关于golang slice 迭代值的地址为何不变?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆