我需要为我正在处理的 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.由于我的项目中一些奇怪的具体原因,我需要一个指针切片而不是指向切片的指针,包括指针切片和普通切片的长度可能不同。如果没有办法实现这一点,我'我确信我可以使用不同的方法,但是一开始这似乎是最简单的)
循环
for _, x := range x {
g = append(g, &x)
}
将局部循环变量
x
的地址附加到切片g
。 使用此代码将切片元素的地址附加到 g
:
for i := range x {
g = append(g, &x[i])
}