【问题标题】:Why address of element in slice is the same? and how to copy them to a pointer?为什么切片中元素的地址相同?以及如何将它们复制到指针?
【发布时间】:2020-02-24 04:03:52
【问题描述】:

我有一段代码:

    //initialize a slice
    arr := make([]int, 0)
    arr = append(arr, 1, 2)
    for _, k := range arr {
        fmt.Printf("%p  %+v\n", &k, k)
    }

    //make a copy, but the element is a pointer
    arrP := make([]*int, 0)
    for _, k := range arr {
        arrP = append(arrP, &k)
    }
    //why arrP is different with arr?
    for _, k := range arrP {
        fmt.Printf("%p  %+v\n", k, *k)
    }

结果是: 0xc000018088 1 0xc000018088 2 0xc000090000 2 0xc000090000 2 我的问题
为什么地址是一样的?
为什么arrP[0]的值不是1?

【问题讨论】:

  • 表达式&k是变量k的地址,不是切片元素。使用&arr[i]获取切片元素的地址。
  • 1234、...的可能重复项

标签: go


【解决方案1】:

Go CommonMistakes: Using reference to loop iterator variable

为什么地址是一样的?

k 的值随着循环前进而更新。

为什么arrP[0]的值不是1?

同上。

使用您提供的示例的修改版本进行演示:

    arr := make([]int, 0)
    arr = append(arr, 1, 2)
    for i, _ := range arr {
        fmt.Printf("%p  %+v\n", &arr[i], arr[i])
    }

    arrP := make([]*int, 0)
    for i, _ := range arr {
        arrP = append(arrP, &arr[i])
    }

    for i, _ := range arrP {
        fmt.Printf("%p  %+v\n", arrP[i], *arrP[i])
    }

结果是:

0xc00009a010  1
0xc00009a018  2
0xc00009a010  1
0xc00009a018  2

【讨论】:

  • 您的答案中的代码返回与 OP 相同的结果。你确定你没有发布相同的原始代码吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 2015-10-16
  • 2021-12-19
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多