你能解释一下这个 Go 指针操作的行为吗?

Can you explain the behavior of this Go pointer manipulation?

package main
import "fmt"

type Item struct {
    val int
}

func main() {
    var items []*Item
    item := Item{}
    items = append(items, &item)
    x := items[0]
    y := *x
    x.val++
    fmt.Printf("x=%v, y=%v\n", *x, y)
}

这会打印:

x={1}, y={0}

我不明白为什么值不同。 x 是指向数组中第一个元素的指针,我们使用 x 递增 val 字段,然后第一个元素已更改。 y 是第一个元素,它的 val 应该也改变了,但没有?但是,如果 y := *x 语句移动到 x.val++ 之后,则值相等。为什么?

只需要解释这一行

y := *x

意思是从这个指针 (*x) 中获取值并将其分配给 y,现在 y 有一个新的未连接到 x 的值。

因为x已经是一个指向Item的指针。试试 y := x