取消引用切片中的指针似乎不会产生创建指针的初始值

问题描述 投票:0回答:1

我需要为我正在处理的 Go 项目创建一个指针切片,该指针引用切片中的项目。预期的行为是我可以修改指针切片中取消引用的项目之一,这将修改它所指向的普通列表中的原始项目。当取消引用切片中的指针时,修改原始项目也将显示为新值。然而,这些行为似乎都不起作用。

这是我编写的一些演示代码来重现这一点。

package main

import "fmt"

func main() {
    var x []int = []int{5,4,3,2,1}
    var y *[]int = &x

    var g []*int
    for _, x := range x {
        g = append(g, &x)
    }

    fmt.Println("x, y, g, *g =")
    fmt.Println(x)
    fmt.Println(y)
    fmt.Println(g)
    printPtr(g)
    fmt.Println()
    fmt.Println()

    fmt.Println("Setting *g[0] to 10")
    *g[0] = 10
    
    fmt.Println("*g =")
    printPtr(g)
    fmt.Println()
    fmt.Println()

    fmt.Println("Setting x[1] to 17")
    x[1] = 17

    fmt.Println("x, y, *g =")
    fmt.Println(x)
    fmt.Println(y)
    printPtr(g)
    fmt.Println()
}

func printPtr(i []*int) {
    for _, v := range i {
        fmt.Print(*v)
        fmt.Print(" ")
    }
}

此代码打印:

x, y, g, *g =
[5 4 3 2 1]
&[5 4 3 2 1]
[0x140000a6018 0x140000a6020 0x140000a6028 0x140000a6030 0x140000a6038]
5 4 3 2 1 

Setting *g[0] to 10
*g =
10 4 3 2 1 

Setting x[1] to 17
x, y, *g =
[5 17 3 2 1]
&[5 17 3 2 1]
10 4 3 2 1 

这两片似乎不知何故断开了。这里到底出了什么问题?

(p.s.由于我的项目中一些奇怪的具体原因,我需要一个指针切片而不是指向切片的指针,包括指针切片和普通切片的长度可能不同。如果没有办法实现这一点,我'我确信我可以使用不同的方法,但是一开始这似乎是最简单的)

go pointers slice
1个回答
0
投票

循环

for _, x := range x {
    g = append(g, &x)
}

将局部循环变量

x
的地址附加到切片
g
。 使用此代码将切片元素的地址附加到
g
:

for i := range x {
    g = append(g, &x[i])
}
© www.soinside.com 2019 - 2024. All rights reserved.